我不確定這是什么糖語法,但讓我告訴你這個問題。
def factors num
(1..num).select {|n| num % n == 0}
end
def mutual_factors(*nums)
nums
.map { |n| factors(n) }
.inject(:&)
end
p mutual_factors(50, 30) # [1, 2, 5, 10]
p mutual_factors(50, 30, 45, 105) # [1, 5]
p mutual_factors(8, 4) # [1, 2, 4]
p mutual_factors(8, 4, 10) # [1, 2]
p mutual_factors(12, 24) # [1, 2, 3, 4, 6, 12]
p mutual_factors(12, 24, 64) # [1, 2, 4]
p mutual_factors(22, 44) # [1, 2, 11, 22]
p mutual_factors(22, 44, 11) # [1, 11]
p mutual_factors(7) # [1, 7]
p mutual_factors(7, 9) # [1]
這是質疑的部分:
nums
.map { |n| factors(n) }
.inject(:&)
好的,這就是我的心理軌跡:首先,map使用輔助方法獲取因子,并將因子輸出到另一個陣列中,然后該陣列被注入?
我覺得
.inject(:&)
是什么讓我失望。我在它上面運行了一個快速的谷歌,但除了求和陣列和類似的基本東西之外,我沒有將注入用于許多事情。我也做過類似的事情
test = "hello".split("").map(&:upcase)
p test.join
但是.inject(:&)?我知道 & 是一個程序,但我只在引數中使用它們。我不知道引擎蓋下的基本原理。請在嘗試向我解釋這一點時考慮我目前的水平=),我知道基本注入是如何作業的,也知道 splat 運算子。
uj5u.com熱心網友回復:
部分參考形成Enumerable#inject.
注入(符號)→ 物件
[...]
通過以下任一方式回傳由運算元形成的物件:
由 命名的方法
symbol。[...]
使用方法名稱引數符號,使用方法組合運算元:
# Sum, without initial_operand. (1..4).inject(: ) # => 10
這意味著在 is 的背景關系中inject不是(:&)一個程序,而只是一個符號:&,它告訴注入執行什么操作來組合陣列中的元素。
讓我們看一下這個例子:
mutual_factors(8, 4, 10)
#=> [1, 2]
讓我們看看每一步會發生什么:
nums
.map { |n| factors(n) } #=> [[1, 2, 4, 8], [1, 2, 4], [1, 2, 5, 10]]
.inject(:&) #=> [1, 2, 4, 8] & [1, 2, 4] & [1, 2, 5, 10]
AndArray#&是一種回傳一個新陣列的方法,該陣列包含兩個陣列中的每個元素(省略重復項)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/440717.html
