【问题标题】:Is there an equivalent for "yield break" in Ruby?Ruby 中是否有“yield break”的等价物?
【发布时间】:2012-05-20 08:00:29
【问题描述】:

我编写了以下 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 中是如何工作的?

【问题讨论】:

  • 如果您能澄清在什么情况下要“打破”,我可以编辑答案以进一步帮助您满足您的确切需求。
  • 我是 Ruby 的初学者,所以我将 Array 与 Enumerator 混淆了。所以这是一个愚蠢的问题,但感谢您的精彩回答:)

标签: ruby each null yield


【解决方案1】:

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

myItems do |item|
  puts item
end

您当前的代码假设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

...或者这个:

# 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:将多个相似项存储为实例变量而不是集合似乎不如存储集合本身有用。但是,在不知道您的数据的情况下,我无法提出更好的方法来表示这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 2014-03-08
    • 1970-01-01
    • 2011-08-31
    • 2018-08-26
    • 2010-12-04
    • 2014-02-24
    相关资源
    最近更新 更多