foo(& nil)与foo(&“not proc”)的行为有何不同?

时间:2011-09-14 02:51:46

标签: ruby functional-programming null

我从he he中发现

[1, 2, 3].each(&nil)

不会导致任何错误 - 它只返回一个枚举器。

相比之下,

[1, 2, 3].each(&"")

加注

TypeError: wrong argument type String (expected Proc)

另外,&nil导致block_given?返回false

def block_given_tester
  if block_given?
    puts "Block given"
  else
    puts "Block not given"
  end
end

block_given_tester(&nil) # => Block not given

这不是因为NilClass实现to_proc - 我检查了RDoc。

我能理解为什么拥有&nil会很高兴,但我不确定 是如何完成的。这只是nil具有其他对象不共享的特殊行为的方式之一吗?

1 个答案:

答案 0 :(得分:8)

通过查看Ruby的源代码可以找到答案。

Ruby 1.8:

查看文件block_pass中的函数eval.c。请注意,它会特别从nil个对象(宏Proc)处理NIL_P。如果函数传递了一个nil值,它会计算一个空块(我认为)并返回。代码在检查对象是否为Proc对象(函数rb_obj_is_proc)之后,如果不是,则引发异常“错误的参数类型(预期的Proc)”。

Ruby 1.9.2:

查看文件caller_setup_args中的方法vm_insnhelper.c。它仅使用to_proc转换proc 如果它不是零;否则,绕过类型转换和类型检查。