Это «не работает», как вы ожидаете. Поскольку capitalize применяет метод capitalize к элементу, получателю, а затем возвращает новое представление вашего arr_str
, получая то, что находится внутри блока. Другими словами и как говорится в документе:
map {| obj | блок} → массив, чтобы переключить источник
карта → an_enumerator
Возвращает новый массив с результатами выполнения блока один раз для каждого
элемент в перечислении.
Ваш arr_str
будет изменен, если вы используете для этого «постоянный» метод, такой как брат карты, Array#map!
, который работает немного иначе:
карта! {| Пункт | блок} → просто нажмите, чтобы переключить источник
карта! → Счетчик
Вызывает данный блок один раз для каждого элемента self, заменяя элемент значением, возвращаемым блоком.
То, что ваш код делает прямо сейчас, - это разделение переданной строки, итерация по каждому элементу в сгенерированном и сохраненном результате разделения, применение капитализации к этим элементам и, наконец, объединение их и печать их с помощью put:
def first_upper(str)
arr_str = str.split # ["this", "is", "a", "test", "sentence"]
arr_str.map do |item|
item.capitalize
end # ["This", "Is", "A", "Test", "Sentence"]
arr_str = arr_str.join(' ') # this is a test sentence
puts arr_str # this is a test sentence
end
first_upper('this is a test sentence')
Наиболее простые и очевидные подходы:
A) Чтобы сохранить результат arr_str.map
в переменной, которая будет использоваться в функции после этого шага.
Б) Использовать карту! и таким образом измените arr_str и «сохраните» то, что делается в этом блоке.