ruby - 预期为 ArgumentError 但得到 NoMethodError

标签 ruby arguments block

当我调用下面类中的各个方法时,我期待 ArgumentError,但我看到:

class A
  def with_one_argument(&block)
    block.call
  end
end

A.new.with_one_argument
# => NoMethodError: undefined method `call' for nil:NilClass

但这正如预期的那样:

class B
  def with_one_argument(some_value)
    puts some_value
  end
end

B.new.with_one_argument
# => ArgumentError: wrong number of arguments (0 for 1)

有人可以解释为什么 (&block) 被视为特殊吗?根据我的理解,如果我不为参数提供默认值,则需要 ArgumentError

最佳答案

没什么复杂的。事实很简单, block 不是一个参数。与A ,如果您传递一个 block ,则该 block 将被称为 block作为转换后的过程,否则 block值为 nil 。但无论哪种情况,block是将传递的 block (既不是参数也不是对象)转换为 proc(它是对象)的结果。

关于ruby - 预期为 ArgumentError 但得到 NoMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36384857/

相关文章:

ruby - 在 Mechanize 中使用带有 CSS 选择器的 page.at

java - 一种 "Products"的推荐引擎

ruby-on-rails - 如何为 Jruby Oracle 连接设置 SSL?

Python 函数相当于 * 来扩展参数?

php - Magento 如何将数据从 Controller 传递到模板?

objective-c - 打破嵌套 block Objective-C

Ruby 逻辑 "and"运算符

function - systemtap 用户空间函数跟踪

scala - 在默认值中引用 Scala 构造函数参数

ios - 我是否需要 block 中的 strongSelf 来保持 self 存活并且 strongSelf 真的有效吗?