【问题标题】:What if method has yield inside, but a block wasn't passed to it? [duplicate]如果方法内部有yield,但没有传递一个块怎么办? [复制]
【发布时间】:2016-03-09 20:20:09
【问题描述】:

如果你使用一个有 yield 的方法,而不给它传递一个块,会发生什么?

class SomeClass < Array
    def some_method
        yield(self[i])
    end
end

a = SomeClass.new
a.some_method

有没有办法设置默认行为:如果没有给出其他方法,则给方法默认块运行?

【问题讨论】:

  • 你可以检查block_given?block_given? 将检查块是否传递给 yield。
  • block_given? 上的分支。如果已给出,则屈服于它,否则运行默认行为。
  • 顺便说一句,子类化数组是一个非常糟糕的主意。
  • @Sergio 我这样做是为了能够像在数组中一样使用 self[i],但搞砸了我的概念。
  • i 是一个未定义的局部变量。 @Sergio 关于子类化Array 的严厉警告适用于大部分(如果不是全部)Ruby 的内置类。原因已覆盖here

标签: ruby block yield


【解决方案1】:

您可以使用Kernel#block_given? 来确定是否通过了块并采取适当的措施。

class SomeClass < Array
  def some_method
    if block_given?
      yield(self[i])
    else
      # not given
    end
  end
end

这意味着如果块没有通过,你也可以有一个默认操作。

【讨论】:

  • 哦,现在我明白了。谢谢!
  • #block_given 吗?通过 proc 时工作?
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多