我编写了以下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中是如何工作的?
答案 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:将多个类似的项目存储为实例变量而不是作为集合存储似乎没有比存储集合本身有用。但是,在不知道您的数据的情况下,我无法建议更好的方式来表示这一点。