gpt4 book ai didi

ruby-on-rails - foo.try(& :to_s?) 和 foo.try(:to_s?) 有区别吗

转载 作者:太空宇宙 更新时间:2023-11-03 18:10:17 24 4
gpt4 key购买 nike

我认为 try 总是带有 symbol,比如 foo.try(:to_s?)。但我发现 foo.try(&:to_s?) 也可以,但我找不到它们之间的区别。

它们之间有区别吗?

最佳答案

foo.try(&:to_s?)

的简写
  1. :to_s? 上调用 to_proc,这会给你一些类似这样的东西:->(thing) { thing.public_send(:to_s? )
  2. 获取该 Proc 并将其放入一个 block 中
  3. 将其作为 block 参数传递给 try

所以整个事情变成了类似这样的事情:

foo.try { |f| f.public_send(:to_s) }

try 接收到一个 block 参数时,如果接收方不是 nil,它就简单地屈服于该 block ,因此它变得更等价于此:

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

关于ruby-on-rails - foo.try(& :to_s?) 和 foo.try(:to_s?) 有区别吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35521081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com