Что на самом деле делают эти 2 строки кода? - PullRequest
0 голосов
/ 01 января 2019

Я не знаю Ruby, но мне нужно понять, как манипулировать входным значением в строках ниже.

Я думаю, что входное значение преобразуется в сумму значений его символов, но второелиния сбивает с толку;он принимает окончательное значение суммы и выполняет побитовые операции или за итерацию?Не могли бы вы дать простое объяснение выполненных шагов?

Заранее спасибо!

input.to_s.each_char.inject(0) do |sum, ch|
    (sum << 8) ^ (ch.ord) ^ (sum >> 4)

1 Ответ

0 голосов
/ 01 января 2019

inject - это то же самое, что и Reduce, и аналогично уменьшению во многих других языках.

Существует несколько различных способов его вызова, но способ, показанный в вопросе,this:

inject(initial) { |memo, obj| block } → obj

Если вы укажете блок, то для каждого элемента в перечислении блоку передается значение аккумулятора (памятка) и элемент.Если вместо этого указать символ, то каждый элемент в коллекции будет передан в именованный метод memo.В любом случае результат становится новым значением для памятки.В конце итерации, последним значением memo является возвращаемое значение для метода.

Если вы явно не указали начальное значение для memo, тогда первый элемент коллекции используется в качестве начального значенияпамятки.

Итак, в вашем случае:

input.to_s.each_char.inject(0) do |sum, ch|
    (sum << 8) ^ (ch.ord) ^ (sum >> 4)
end

Начальное значение суммы равно 0, которое используется для первой итерации, но для каждой последующей итерации результатблок используется для суммирования в следующей итерации.

Например, следующее должно выдавать то же значение без использования инжекта / уменьшения.

sum = 0
input.to_s.each_char do |ch|
    sum = (sum << 8) ^ (ch.ord) ^ (sum >> 4)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...