1

我编写了以下 Ruby 代码:

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

现在我尝试使用:

myItems.each do |item|
    puts item
end

但是,当 @item1 和 @item2 都为零时,我收到错误:

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

我希望在 C# 中使用与“yield break”等效的方法来防止这种情况。有谁知道这在 Ruby 中是如何工作的?

4

1 回答 1

6

很难说出您要做什么,但我认为您只想:

myItems do |item|
  puts item
end

您当前的代码假设 的返回值myItems是可枚举的(例如数组),并且在任何情况下(即使您@item的 s 不是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 回答