簡體   English   中英

`map!':調用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.

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