2011-08-17 7 views
9

RubyでPythonのwhile/else構造体を探していました。RubyのPythonのfor/else

これは、ループが実行されたことを意味し、いつでもループ内の条件が真でない場合は、elseステートメントの値を返します。

Rubyでは、私はこのように行うことができます。

if @items.empty? 
    "Empty" 
else 
    @items.each do |item| 
    item 
    end 
end 

だから、これを改善する方法はありますか?

ありがとうございます。

答えて

3

フム、あなたは三元としてそれを書くことができます:

@items.empty? ? 'Empty' : @items.each { |item| item } 

eachは、その副作用のために実行され、元の受信を返しているので、あなたは、しかし、あなたのブロックでより便利な何かをしたいことがあります。あなたのコメントどおり

アップデート:私はあなたが得ることができる最も近いと思い

unless @items.empty? 
    @items.each { |item| p item } 
else 
'Empty' 
end 
+0

私はちょうど1行でそれを好きではありません。それははっきりしていません。私が望むのは、while/else/endのようなものです。多分それは可能ではありませんが、私はその質問がそれに値すると思います。 – Cydonia7

+1

私はPythonの 'while/else'を参照しています。@ Zabbaは正しいです.3番目の形式が気に入らなければ、最も近いのはおそらく' unless..else'です。 IMHOすべての構文をある言語から別の言語に翻訳しようとするのは理にかなっていませんが、YMMVです。 –

+0

私はすべての言語を翻訳しようとはしていませんでしたが、Pythonでこの構造体が本当に便利だと思います。あなたの答えをありがとう:) – Cydonia7

24

のようなものが反復子ブロックは、さらなる使用のためにテストすることができ、あなたがそれに入れて何を返すことに注意してくださいです。

if arr.each do |item| 
    item.some_action(some_arg) 
end.empty? 
    else_condition_here 
end 
+3

これはひどく素晴らしいです。 –

0

多かれ少なかれ機能的な方法:

empty_action = { true => proc{ "Empty"}, 
       false => proc{ |arr| arr.each { |item| item }} } 

empty_action[@items.empty?][@items] 
1

私たちはRubyであるので、のは楽しみを持ってみましょう。 Rubyはこのような使用することができ、強力なcase構築物があります。

case items 
when -:empty? then "Empty" 
else items.each { |member| 
    # do something with each collection member 
    } 
end 

をしかし、上記のコードを機能させるために、我々は最初のネイティブクラスSymbolを変更する必要があります。ネイティブクラスの変更はRubyの専門です。これは、ライブラリ(宝石)の中で一度だけ実行する必要があります。この場合、変更は次のようになります

class Symbol 
    def [email protected] 
    Object.new 
    .define_singleton_method :=== do |o| o.send self end 
    end 
end 

このコードは-:symを言っが使用される:===方法でパッチし、新しい空のオブジェクト猿を返すこと、単項マイナス(-)ようにSymbolクラスの演算子をオーバーロードケース・ステートメントによって裏に隠されている。

関連する問題