[英]private method `puts' called for “string”:String (NoMethodError)
[英]`map!': private method called for String (NoMethodError)
我試圖編寫一個私有函數,該函數將接受單個令牌並返回給定的令牌,而沒有空格或標點符號,例如:
normalize_token(" cat.")
# => "cat"
然后,我定義了具有標點符號和空格的令牌數組:
["a.", " b...."]
我想使用定義的函數進行映射。 我希望返回一個新對象,如下所示:
["a", "b"]
這是一小段代碼:
private def normalize_token(token)
token.gsub(/\W/, ' ') # does the same thing as [^A-Za-z0-9_]
end
["a.", " b...."].map!(&:normalize_token)
我得到:
map!': private method
調用“ a”的map!': private method
normalize_token':字符串(NoMethodError)
任何幫助或什至是我做錯的解釋將不勝感激。
而不是傳遞方法引用,而是傳遞一個塊:
private def normalize_token(token)
token.gsub(/\W/, ' ') # does the same thing as [^A-Za-z0-9_]
end
["a.", " b...."].map! {|token| normalize_token token}
這將在字符串中留出空格,因此您可能想要chomp!
他們或將您的gsub
更改為gsub(/\\w/, '')
說明
第一個問題是normalize_token
是私有的。 您可以通過將其公開或按@alex所述send
它來解決該問題。
然而,第二個問題更加微妙。
通過傳遞方法引用,您基本上具有以下內容
["a.", " b...."].map! {|token| token.send :normalize_token }
運行此命令將導致以下錯誤消息:
ArgumentError (wrong number of arguments (given 0, expected 1))
map!
不會將映射的值作為參數傳遞給normalize_token
。 (請注意, send
將您的映射值作為接收者,但沒有作為參數 。)相反,通過使用聲明了變量的塊,我們可以通過將映射值作為參數明確傳遞給塊來解決此問題。
關於&:
簡短說明&:
-它完成與{|i| ...}
{|i| ...}
,使用&調用:object上的to_proc,然后將其作為一個塊傳遞給該方法-因此,要使用它,需要在傳遞給map!
任何對象上定義&:
后面的內容map!
。
這是一個示例,打開String
類以在其中定義它:
class String
def normalize_token
self.gsub(/\W/, ' ')
end
end
它將使您可以使用原始的["a.", " b...."].map!(&:normalize_token)
。 在現實生活中做這樣的事情不是一個好主意,因為您可能希望在負責生成這些字符串的任何類中定義normalize_token。 但這應該可以幫助您入門。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.