Почему следующий код не работает так, как должен? - PullRequest
1 голос
/ 09 марта 2020
array = ["car","carrs"]
array.each { |x|
x.capitalize
}

Я пытался делать с do тоже, удаляя фигурные скобки и добавляя do после .each, я также пробовал для каждого в массиве, но это тоже не сработало. Я делаю что-то не так, потому что ничего не пишется с заглавной буквы?

Ответы [ 2 ]

5 голосов
/ 09 марта 2020

String # capitalize возвращает копию объекта с заглавной первой буквой. В основном вы делаете циклический просмотр массива и генерируете новые копии строк, а затем сразу выбрасываете их.

У вас есть несколько способов приблизиться к этому:

  1. Вы можете использовать #map вместо #each, чтобы взять каждый результат вашего тела блока l oop и собрать его в новый массив:
array = ["car","carrs"]
capitalized_array = array.map { |x| x.capitalize }
Или, если вы действительно хотите изменить исходные строки, используйте String # capitalize! вместо capitalize, который изменяет входной объект, а не возвращает новый объект:
array = ["car","carrs"]
array.each { |x| x.capitalize! }

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

3 голосов
/ 09 марта 2020

Вы должны понимать разницу между map против each. Вы можете прочитать это здесь .

Для тех, кто не хочет читать это:

Each похоже на более примитивную версию map. Он дает вам каждый элемент, чтобы вы могли работать с ним, но он не собирает результаты. Each всегда возвращает исходный, неизмененный объект. Пока map делает то же самое, но. Он возвращает новый массив с преобразованными элементами.

Итак, вам нужно использовать map для возврата нового массива:

array = ["car","carrs"]
capitalized_array = array.map { |x| x.capitalize }

# or

array = ["car","carrs"]
array.map! { |x| x.capitalize }

Теперь, в чем разница между map и map!? Нам нужно прочитать документацию

map, которая вызывает данный блок один раз для каждого элемента себя. Создает новый массив, содержащий значения, возвращаемые блоком. В то время как map! вызывает данный блок один раз для каждого элемента self, заменяя элемент значением, возвращаемым блоком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...