簡體   English   中英

foo.try(&:to_s?)和foo.try(:to_s?)之間有區別嗎?

[英]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?)是簡寫

  1. 調用to_proc :to_s? ,這會給你一些類似的東西: ->(thing) { thing.public_send(:to_s?) }
  2. 把那個Proc變成一個塊
  3. 將其作為塊參數傳遞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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM