[英]Is there a difference between foo.try(&:to_s?) and foo.try(:to_s?)
我認為try
總是使用像foo.try(:to_s?)
這樣的symbol
。 但我發現foo.try(&:to_s?)
也有效,我找不到它們之間的區別。
它們之間有區別嗎?
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.