Если вы хотите, чтобы первое слово из каждой строки из файла:
first_words = File.read(file_name).lines.map { |l| l.split(/\s+/).first }
Это довольно просто. Давайте разберем его:
File.read(file_name)
Считывает все содержимое файла и возвращает его в виде строки.
.lines
Разбивает строку на символы новой строки (\n
) и возвращает массив строк. Каждая строка представляет собой «строку».
.map { |l| ... }
Array#map
называет предоставленный блок, проходящий в каждом элементе и принимая возвращаемое значение блока, чтобы построить новый массив. Как только Array#map
заканчивает, он возвращает массив, содержащий новые значения. Это позволяет вам преобразовать значения. В блоке выборки здесь |l|
является частью блока params, означающей, что мы принимаем один аргумент, и мы будем ссылаться на него как l
.
|l| l.split(/\s+/).first
Это внутренний блок, я пошел вперед и включил здесь параметры блока для полноты. Здесь мы разделили строку на /\s+/
. Это регулярное выражение, то \s
означает любые пробелы (\t \n
и пространство) и +
после него означает один или более так \s+
означает один или более пробелам и, конечно, он будет пытаться соответствовать как многие последовательные символы пробелов, насколько это возможно. Передача этого значения в String#split
вернет массив подстрок, которые происходят между указанным разделителем. Теперь наш разделитель был один или несколько пробелов, поэтому мы должны получить все между пробелами. Если бы у нас была строка "A list of words"
, мы получим ["A", "list", "of", "words"]
после раздельного вызова. Это очень полезно. Наконец, мы вызываем .first
, который возвращает первый элемент массива (в данном случае «первое слово»).
Теперь в Ruby вычисленное значение последнего выражения в блоке автоматически возвращается, и наше первое слово возвращается, и если этот блок передается на карту, мы должны получить массив из первых слов из файла. Чтобы продемонстрировать, давайте рассмотрим ввод (при условии, наш файл содержит):
This is line one
And line two here
Don't forget about line three
Line four is very board
Line five is the best
It all ends with line six
Запуск этого через линию выше, мы получим:
["This", "And", "Don't", "Line", "Line", "It"]
Что первое слово из каждой строки.
Я думаю, что вы могли бы быть смущены о том, что делает 'дальше, если ...' линия. В отличие от обычного выражения 'if', оно завершено только на этой строке, и следующие строки не являются частью этого (что и предлагает ваш отступы). Что касается вашего вопроса: попробуйте вынуть '.join ('')' и посмотреть, что произойдет. – Jon
Вы правы. Я удалил .join, потому что получаю ошибку метода. –