2012-05-11 15 views
1

は、私は、次のRubyコードを書いた:Rubyに「yield break」と同等の機能はありますか?

def myItems 
    if @item1 
     yield @item1 
    end 
    if @item2 
     yield @item2 
    end 
end 

は今、私が使用してみました:

myItems.each do |item| 
    puts item 
end 

しかし、ITEM1とITEM2 @ @の両方がnilのとき、私はエラーを取得:

Error: #<NoMethodError: undefined method `each' for nil:NilClass>. 

これを防ぐために、C#で "yield break"と同等の機能が期待されます。 Rubyでどのように動作するのか誰にでも分かりますか?

+0

「中断したい」状況を明確にすることができれば、答えを編集して正確なニーズに対応することができます。 – Phrogz

+0

私はRubyの初心者ですので、ArrayとEnumeratorを混同しました。だから愚かな質問だったが、華麗な答えに感謝:) – Aristoteles

答えて

6

それはあなたがやろうとしているものを言うのは難しいですが、私はあなたが単にたいと思う:

myItems do |item| 
    puts item 
end 

あなたの現在のコードはmyItemsの戻り値が(例えば、アレイ)可算であると仮定して、 (たとえあなたの@itemnilでない場合でも)戻り値です。

また、このいずれかの操作を行います。

# Method that iterates over all items 
def eachItem 
    [@item1,@item2].compact.each do |item| 
    yield item 
    end 
end 

eachItem do |item| 
    puts item 
end 
...またはこの:

# Give me an array of all non-nil items 
def myItems 
    [@item1,@item2].compact 
end 

myItems.each do |item| 
    puts item 
end 

注:それはあなたがもともと持っていますが、ことに注意して何だので、私はcamelCaseメソッド名を使用しました代わりにsnake_caseを使用するのはRubyの慣用句です。

注2:コレクションとしてではなくインスタンス変数として複数の類似アイテムを格納することは、コレクション自体を格納するよりも有用ではないようです。しかし、あなたのデータを知らないと、私はこれを表現する良い方法を提案することはできません。

関連する問題