我嘗試使用花括號實作 reduce,但無法讓它作業。該函式應該采用一組單詞(符號或字串)并創建一個哈希,其中鍵是單詞,值是單詞的長度。這是我的花括號嘗試:
def find_word_lengths(word_list)
word_list.reduce(Hash.new(0)) { |hash,word| hash[word] = word.length}
end
我不斷收到錯誤 undefined method '[]=' for 3:Integer。
當我使用do而不是花括號實作它時,它可以作業,但只有當我在 reduce 塊的末尾回傳累加器時。
def find_word_lengths(word_list)
word_list.reduce(Hash.new(0)) do |hash,word|
hash[word] = word.length
hash
end
end
我可以理解為什么第二個有效,但我不明白為什么第一個無效。我對reduce 的理解是它在遍歷它呼叫的陣列后隱式回傳累加器。至少,當我撰寫一個歸約到一個數字的歸約函式呼叫時,它會自動回傳總和
my_numbers = [5, 6, 7, 8]
my_numbers.reduce(1000) { |sum, number| sum number }
#=>1026
根據累加器的型別,reduce 的行為是否有所不同?
uj5u.com熱心網友回復:
累加器不會隱式回傳。這個假設打破了你分析的其余部分。
如果您仔細閱讀,檔案中會說明:
... 在任何一種情況下,結果都會成為 memo 的新值。..
這里講的是塊的執行結果,無論是大括號還是 do/end,都會成為下一輪的 memo 的新值。
因此,大括號和 do/end 的作業方式完全相同,只是您假設備忘錄是隱式回傳的,而事實并非如此。
如果您現在使用這些新知識分析您的代碼,您應該很高興地理解為什么有些示例有效而其他示例無效。
請記住,塊內的最后一條陳述句將是下一次迭代中備忘錄的值。
uj5u.com熱心網友回復:
在您的第一個示例中,您回傳分配word.length給 的結果hash[word],即word.length它本身。因此,回圈的第二次迭代將檢索您的第一個單詞的長度word_list作為其引數。
在您的第二個示例中,您明確回傳塊中的哈希值(然后作業)。
與您的作業多行版本等效的帶有花括號的單行版本是
word_list.reduce(Hash.new(0)) { |hash, word| hash[word] = word.length; hash }
除了使用reduce,您還可以使用each_with_object代替,它總是為每次迭代產生原始物件:
word_list.each_with_object(Hash.new(0)) { |hash, word| hash[word] = word.length }
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/359986.html
標籤:红宝石
