Ruby с заглавной буквы не работает внутри метода карты - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь превратить первые буквы строки в заглавные буквы. Я пытаюсь включить:

"this is a test sentence"

в

"This Is A Test Sentence"

Вот мой код:

def first_upper(str)
  arr_str = str.split
  arr_str.map do |item|
    item.capitalize
  end
  arr_str = arr_str.join(' ')
  puts arr_str
end

first_upper('this is a test sentence')
# >> this is a test sentence

item.capitalize работает внутри цикла map, если я положу туда binding.pry pry.

Правильно ли я не использую метод map?

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Это «не работает», как вы ожидаете. Поскольку 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 и «сохраните» то, что делается в этом блоке.

0 голосов
/ 30 августа 2018

Просто добавлю два моих цента ..

Это несколько способов, обезьяна исправлена ​​в String классе.

module MyStringPatch

  def titleize_1
    split(' ').collect(&:capitalize).join(' ') # Stolen from user3869936
  end

  def titleize_2
    gsub(/\b(?<!['â`])[a-z]/) { |match| match.capitalize } # Stolen from Rails
  end

 def titleize_3
   split.map { |item| item.capitalize }.join(' ') # Stolen from OP: user4396386
 end

end

String.include MyStringPatch

string = "this is a test sentence"

p string.titleize_1 # => "This Is A Test Sentence"
p string.titleize_2 # => "This Is A Test Sentence"
p string.titleize_3 # => "This Is A Test Sentence"

Кредиты:

0 голосов
/ 30 августа 2018

Метод «map» не изменяет свой получатель, а возвращает новую измененную копию. Вы можете использовать его мутативный / деструктивный аналог map! или просто переназначить значение выражения переменной.

arr_str.map! do |item|
  item.capitalize
end

# ... or ...

arr_str = arr_str.map do |item|
  item.capitalize
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...