2012-05-11 52 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 

然而,当两个@物品1和@ ITEM2是零,我得到的错误:

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返回值是一个枚举(例如数组),和在任何情况下(即使您的@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:将多个相似项存储为实例变量而不是集合看起来比存储集合本身没有用处。但是,如果不知道您的数据,我不能建议更好的方式来表示这一点。

相关问题