Нужно простое объяснение метода ввода - PullRequest
128 голосов
/ 02 апреля 2009
[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10

Я смотрю на этот код, но мой мозг не замечает, как число 10 может стать результатом. Кто-нибудь может объяснить, что здесь происходит?

Ответы [ 15 ]

2 голосов
/ 03 апреля 2009

Этот код не дает возможности не передавать начальное значение, но может помочь объяснить, что происходит.

def incomplete_inject(enumerable, result)
  enumerable.each do |item|
    result = yield(result, item)
  end
  result
end

incomplete_inject([1,2,3,4], 0) {|result, item| result + item} # => 10
1 голос
/ 19 ноября 2016

Начните здесь, а затем просмотрите все методы, которые принимают блоки. http://ruby -doc.org / ядро-2.3.3 / Enumerable.html # метод-я-инъекционные

Это блок, который смущает вас или почему у вас есть значение в методе? Хороший вопрос, хотя. Какой там операторный метод?

result.+

С чего все начинается?

#inject(0)

Можем ли мы сделать это?

[1, 2, 3, 4].inject(0) { |result, element| result.+ element }

Это работает?

[1, 2, 3, 4].inject() { |result = 0, element| result.+ element }

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

Вы всегда можете сделать это

 [1, 2, 3, 4].each { |element| p element }

чтобы увидеть, что перечислимый массив проходит итерацию. Это основная идея.

Это просто, что инъекция или сокращение дают вам памятку или аккумулятор, который отправляется.

Мы могли бы попытаться получить результат

[1, 2, 3, 4].each { |result = 0, element| result + element }

но ничего не возвращается, так что это действует так же, как и раньше

[1, 2, 3, 4].each { |result = 0, element| p result + element }

в блоке инспектора элементов.

0 голосов
/ 04 сентября 2017

Это просто reduce или fold, если вы знакомы с другими языками.

0 голосов
/ 31 марта 2017

Существует еще одна форма метода .inject (), которая очень полезна. [4,5] .inject (&: +) Это сложит все элементы области

0 голосов
/ 17 октября 2014

То же самое, что и это:

[1,2,3,4].inject(:+)
=> 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...