我不了解Ruby,但是我需要了解下面几行中输入值的操作方式。
我认为输入被转换为其字符值的总和,但是第二行令人困惑;它取和的最终值并执行按位运算还是每次迭代?您能对所要执行的步骤进行简单说明吗?
提前谢谢!
<b>$&</b>
答案 0 :(得分:2)
inject与reduce相同,并且在许多其他语言中与reduce类似。
有很多不同的调用方式,但是问题中显示的方式是这样:
inject(initial) { |memo, obj| block } → obj
如果指定一个块,则对于枚举中的每个元素,该块为 传递了累加器值(memo)和元素。如果您指定一个 符号,然后将集合中的每个元素传递给 备忘录的命名方法。无论哪种情况,结果都变成新的 备忘的值。在迭代结束时,备忘录的最终值 是该方法的返回值。
如果您未为备忘录明确指定初始值,则 集合的第一个元素用作备忘录的初始值。
所以在您的情况下:
input.to_s.each_char.inject(0) do |sum, ch|
(sum << 8) ^ (ch.ord) ^ (sum >> 4)
end
sum的初始值为0,该值用于第一次迭代,但对于随后的每次迭代,该块的结果都用于下一次迭代中的求和。
例如,下面的代码应该在不使用注入/减少的情况下产生相同的值。
sum = 0
input.to_s.each_char do |ch|
sum = (sum << 8) ^ (ch.ord) ^ (sum >> 4)
end