foo.try(&:to_s?)和foo.try(:to_s?)之间有区别吗?

时间:2016-02-20 08:57:01

标签: ruby-on-rails ruby

我认为try总是与symbol一样foo.try(:to_s?)。 但是我发现foo.try(&:to_s?)也有效,我找不到它们之间的区别。

它们之间有区别吗?

1 个答案:

答案 0 :(得分:3)

foo.try(&:to_s?)

的简写
  1. to_proc上拨打:to_s?,这会给你一些类似的信息:->(thing) { thing.public_send(:to_s?) }
  2. 把那个Proc变成一个块
  3. 将其作为块参数传递给try
  4. 所以整件事情变得与此类似:

    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