在Ruby中是否存在"yield break"的等价物?

Ari*_*les 1 ruby each null yield

我写了以下Ruby代码:

def myItems
    if @item1
        yield @item1
    end
    if @item2
        yield @item2
    end
end
Run Code Online (Sandbox Code Playgroud)

现在我试着用:

myItems.each do |item|
    puts item
end
Run Code Online (Sandbox Code Playgroud)

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

Error: #<NoMethodError: undefined method `each' for nil:NilClass>.
Run Code Online (Sandbox Code Playgroud)

我希望C#中的"yield break"等同于防止这种情况.有谁知道这在Ruby中是如何工作的?

Phr*_*ogz 6

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

myItems do |item|
  puts item
end
Run Code Online (Sandbox Code Playgroud)

您当前的代码假设返回值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
Run Code Online (Sandbox Code Playgroud)

...或这个:

# Give me an array of all non-nil items
def myItems
  [@item1,@item2].compact
end

myItems.each do |item|
  puts item
end
Run Code Online (Sandbox Code Playgroud)

注意:我使用了camelCase方法名称,因为这是你原来的,但请注意,在Ruby中使用它是惯用的snake_case.

注意2:将多个相似的项目存储为实例变量而不是作为集合存储似乎没有比存储集合本身有用.但是,在不知道您的数据的情况下,我无法建议更好的方式来表示这一点.