这两行代码实际上是做什么的?

时间:2019-01-01 13:48:46

标签: ruby

我不了解Ruby,但是我需要了解下面几行中输入值的操作方式。

我认为输入被转换为其字符值的总和,但是第二行令人困惑;它取和的最终值并执行按位运算还是每次迭代?您能对所要执行的步骤进行简单说明吗?

提前谢谢!

<b>$&</b>

1 个答案:

答案 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