我认为try
总是与symbol
一样foo.try(:to_s?)
。
但是我发现foo.try(&:to_s?)
也有效,我找不到它们之间的区别。
它们之间有区别吗?
答案 0 :(得分:3)
foo.try(&:to_s?)
是
to_proc
上拨打:to_s?
,这会给你一些类似的信息:->(thing) { thing.public_send(:to_s?) }
try
所以整件事情变得与此类似:
foo.try { |f| f.public_send(:to_s) }
当try
收到一个块参数时,如果接收者不是nil
,它只会产生该块,所以它变得更加相当于:
foo.to_s
实际上取消了try
在这种特殊情况下的防护效果。
另一方面,foo.try(:to_s)
将符号:to_s
作为参数传递给try
。
所以foo.try(:to_s?)
并不等同于foo.try(&:to_s?)
。
参见例如:
"hey".try(:foo)
# => nil
"hey".try(&:foo)
# => NoMethodError: undefined method `foo' for "hey":String