Ruby - вывести первую часть строки в элементе массива - PullRequest
0 голосов
/ 28 мая 2020

Учитывая массив строк (полные имена), мне нужно напечатать только первое имя (подсказка - мне нужно использовать метод итерации и массива)

Условия поиска: «ruby print часть элемента в массиве "," ruby строки разбиения массива "," ruby каждый массив. первый "," ruby параметры массива элементов печати ".

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

Аналогичный РАБОЧИЙ код:

full_names = ["Alice Smith", "Bob Evans", "Roy Rogers"]
puts "exercise #4 - print names by line"
full_names.each do |name|
  puts name
end

BROKEN CODE - Last Attempted Code :

puts "exercise #4 - print only first"
full_names = ["Alice Smith", "Bob Evans", "Roy Rogers"]
full_names.each do |name|
  puts name.first
end

Ошибка ex_a.rb: 78: in block in <main>': undefined method first 'для "Alice Smith": String (NoMethodError) (строка 78 -' Put name.first ')

Ответы [ 3 ]

2 голосов
/ 28 мая 2020

Так близко:

puts "exercise #4 - print only first"
full_names = ["Alice Smith", "Bob Evans", "Roy Rogers"]
full_names.each do |name|
  puts name.split.first
end
0 голосов
/ 28 мая 2020

Хотя разница невелика, я бы избегал split и предпочел бы следующий подход:

puts name[/\S+/] # first word anywhere in the string

или

puts name[/^\S+/] # word must be at the start of the string

Разница может иметь значение, если вы однажды выполните та же идея, чтобы извлечь первое слово из длинного текста. С split будет просканирована вся строка и будет создан временный массив со всеми словами, но вам понадобится только первый. При моем подходе строка будет сканироваться только до тех пор, пока не будет идентифицировано первое слово.

Разница между двумя моими вариантами в том, что второй будет извлекать первое имя, даже если есть начальные пробелы, например " Alice Smith". Кроме того, этот подход можно легко расширить, включив в него знаки препинания в качестве разделителей слов.

0 голосов
/ 28 мая 2020

Это в основном то же, что и ответ steenslag, но вы также можете сделать это в одной строке, например:

puts "exercise #4 - print only first"
full_names = ["Alice Smith", "Bob Evans", "Roy Rogers"]
full_names.each { |name| puts name.split.first }

или

full_names.each { |name| puts name.split[0] }

Причина, по которой вы получили ошибку undefined method: first - это то, что first - это метод для классов Enumerable и Array. См. https://rubyapi.org/2.7/o/array#method -i-first

После того, как вы split строки (в данном случае имена, разделенные пробелом), вы превращаете каждую из них в отдельный массив . Итак, "Alice Smith".split => ["Alice", "Smith"]. Затем вы можете получить доступ к первому элементу этого массива с помощью first или [0], который обращается к первому индексу любого массива.

Аналогично, когда вы применяете [0] к строке, например "Alice"[0], это метод String#slice, который обращается к первому элементу "Alice".

Следовательно, "Alice"[0] => "A" См .: https://rubyapi.org/2.7/o/s?q=slice

...