Ruby中的“yield break”是否相当?

时间:2012-05-11 17:43:38

标签: ruby each null yield

我编写了以下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#中的“yield break”等同于防止这种情况发生。有谁知道这在Ruby中是如何工作的?

1 个答案:

答案 0 :(得分:6)

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

myItems do |item|
  puts item
end

您当前的代码假设myItems的返回值是可枚举的(例如数组),并且在任何情况下(即使您的@item不是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:将多个类似的项目存储为实例变量而不是作为集合存储似乎没有比存储集合本身有用。但是,在不知道您的数据的情况下,我无法建议更好的方式来表示这一点。