[英]Ruby's find method - argument?
我正在做一些探索。 關於Ruby的
.find(ifnone = nil) { |obj| block }方法:從閱讀文檔 ,在我看來,你應該能夠傳遞一個方法作為一個參數,將在沒有指定條件的匹配的情況下運行。
它說:
“調用ifnone並在指定時返回其結果,否則返回
nil
。”
這似乎適用於我創建的任何已經返回nil的方法,例如:
No match.
=>nil
No match. =>nil
如果我使用的方法確實返回了某些內容,請說:
\n def消息\n p'不匹配。'\n 結束\n
我去拿:
"No match." NoMethodError: undefined method `call' for "No match.":String
有人會善意地向我解釋一下究竟應該將什么類型的arg /方法傳遞給find方法? 謝謝。
我很高興你問這個問題。 我從來沒有想過find
方法的那個參數,因為我之前從未真正使用它。 相反,我總是忽略它,直到你在這里提到它。
您將傳遞給可枚舉的參數(如find
)將是lambda或proc。 如果沒有找到匹配項,則返回默認nil
而不是返回lambda / proc。
這是一個簡單的例子:
nums = [1, 2, 3, 4]
nums.find(lambda {raise ArgumentError, "No matches found"}) { |num| num == 5 }
> ArgumentError: No matches found
同樣,你也可以通過Proc ..
nums = [1, 2, 3, 4]
arg = Proc.new {"No matches found"}
nums.find(arg) { |num| num == 5 }
> "No matches found"
只需快速編輯,您就可以返回lambda或proc中的任何值,無論是引發錯誤還是返回值。 我想提出錯誤和錯誤處理是一種常見的用途
Edit2:刪除了解釋此方法的文章的鏈接。 似乎博客文章已被刪除:(
NoMethodError: undefined method `call' for "No match.":String
這是一個很大的暗示。 find
想要一個可調用的對象 - 即響應#call
東西。 由於Ruby是鴨子類型,所有這些都可以工作:
def message_method
puts "yo"
end
...find(method(:message_method)) { ... }
module MessageModule
def self.call
puts "yo"
end
end
...find(MessageModule) { ... }
class MessageClass
def call
puts "yo"
end
end
...find(MessageClass.new) { ... }
message_proc = Proc.new { puts "yo" }
...find(message_proc) { ... }
( lambda
是構造Proc
對象的另一種方式;不同的語法會產生一些不同的語義,但關鍵是lambda
也能正常工作。)
一個反常的例子(過時):
require 'continuation'
callcc do |notfound|
...find(notfound) { ... }
...
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.