我从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
具有其他对象不共享的特殊行为的方式之一吗?
答案 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
如果它不是零;否则,绕过类型转换和类型检查。