1

私は次のRubyコードを書きました:

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#の「yieldBreak」と同等のものを期待します。これがRubyでどのように機能するか知っている人はいますか?

4

1 に答える 1

6

あなたが何をしようとしているのかを知るのは難しいですが、私はあなたが単純に望んでいると思います:

myItems do |item|
  puts item
end

現在のコードは、の戻り値がmyItems列挙可能(配列など)であると想定しており、いかなる状況でも(@itemsがそうでない場合でもnil)その戻り値はありません。

または、次のいずれかを実行します。

# 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に使用するのはRubyでは慣用句であることに注意してください。snake_case

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

于 2012-05-11T17:46:21.530 に答える