Вы должны четко различать методы мутирование приемник (переменная, к которой они вызваны) и методы pure , не имеющие побочных эффектов.Также вам следует позаботиться о том, что возвращает метод, если вы хотите использовать результат метода.
Здесь метод для всех индексов (кроме 1
) возвращает "s"
, потому что это то, что возвращает блок:
foo = "bar"
foo[foo.length] = "s"
#⇒ "s"
Если вы позже проверите свой массив мутированный , вы увидите, что он был успешно изменен на желаемый.
input = %w[hand feet knee table]
def add_s(input)
input.each_with_index.map do |element, index|
index == 1 ? element : element[element.length] = "s"
end
input # ⇐ HERE :: return the mutated object
end
#⇒ ["hands", "feet", "knees", "tables"]
или дажепроще, не map , просто итерируйте и изменяйте:
input = %w[hand feet knee table]
def add_s(input)
input.each_with_index do |element, index|
element[element.length] = "s" unless index == 1
end
end
Вместо того, чтобы мутировать массив на месте, предпочтительным решением будет вернуть измененную версию.Для этого вы должны вернуть новых значений из блока:
def add_s(input)
input.each_with_index.map do |element, index|
index == 1 ? element : element + "s"
end
end
#⇒ ["hands", "feet", "knees", "tables"]
Если бы мне дали такую задачу, я бы также вел список элементов, которые должны быть пропущены, так какрано или поздно их станет больше:
input = %w[hand feet knee scissors table]
to_skip = [1, 3]
def add_s(input)
input.each_with_index.map do |element, index|
next element if to_skip.include?(index)
element + "s"
end
end
#⇒ ["hands", "feet", "knees", "scissors", "tables"]