我试着做一些重构来将一个each块转换成一个inject,但是没有成功,我也不明白为什么。
class String
def profile
profile = Array.new(26) { 0 }
self.downcase.split(//).each do |letter|
profile[letter.ord - 'a'.ord] += 1 unless letter.ord > 'z'.ord
end
profile
end
end
我的重构失败了:
class String
def profile
self.downcase.split(//).inject(Array.new(26) {0}) do |profile, letter|
profile[letter.ord - 'a'.ord] += 1 unless letter.ord > 'z'.ord
end
end
end
`block in profile': undefined method `[]=' for 1:Fixnum (NoMethodError)
如果我理解正确的话,它与重构版本中profile对象上的array引用操作符不同,这意味着传递给inject的初始化器不起作用。这种理解正确吗?如果是,为什么不呢?
谢谢!