INJECT: NoMethodError: неопределенный метод `<< 'для: one: Symbol - PullRequest
1 голос
/ 20 сентября 2019

Как правильно использовать инъекцию и устранить мою ошибку?

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

a = [:one,:two,:three]  # => [:one, :two, :three]

a.inject do |sum = [], v|  # => [:one, :two, :three]
  sum << v   if v != :one  # ~> NoMethodError: undefined method `<<' for :one:Symbol\nDid you mean?  <
end

Цель состоит в том, чтобы добавить элементы массива с именем sum,который начинается как пустой массив, добавляет элементы, если элемент не равен: one.

Ответы [ 2 ]

4 голосов
/ 20 сентября 2019

Вы можете передать начальное значение суммы в качестве аргумента.В этом случае начальное значение должно быть пустым массивом.Опять же, вам нужно убедиться, что сумма является последней оцененной строкой в ​​блоке.

Вам НУЖНО передать начальное значение, потому что, если вы этого не сделаете, первое значение коллекции :one автоматически присваиваетсяsum, поэтому sum << потерпит неудачу (символы не поддерживают <<)

В итоге ... если значение по умолчанию отсутствует, :one присваивается сумме, а блок оценивается только для [:two, :three] с начальным значением, блок вычисляется для каждого члена коллекции.

a = [:one,:two,:three]  # => [:one, :two, :three]

a.inject([]) do |sum, v|  
  sum << v   if v != :one
  sum 
end
3 голосов
/ 20 сентября 2019

Вам необходимо вернуть sum после if условия

a = [:one,:two,:three]  # => [:one, :two, :three]

a.inject([]) do |sum, v|  # => [:one, :two, :three]
  sum << v   if v != :one
  sum 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...