簡體   English   中英

Ruby的find方法 - 參數?

[英]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.

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