Как вернуть весь массив вместо одной строки - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь вернуть все слова, которые имеют более четырех букв, в приведенном ниже упражнении.

def timed_reading(max_length, text)
  var_b = text.split(" ")

  var_b.map do |i|
    if i.length >= max_length
      return i
    end
  end
end

print timed_reading(4,"The Fox asked the stork, 'How is the soup?'")
# >> asked

Кажется, я получил только одно слово.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вам не нужно сначала извлекать все слова из строки, а затем выбирать слова, содержащие не менее четырех букв.Вместо этого вы можете просто извлечь нужные слова, используя String # scan с регулярным выражением.

str = "The Fox asked the stork, 'How is the soup?'? Très bon?"

str.scan /\p{Alpha}{4,}/
  #=> ["asked", "stork", "soup", "Très"]

Регулярное выражение гласит: «Совпадение строк, содержащих 4 или более букв».Я использовал \p{Alpha} (так же, как \p{L} и [[:alpha:]]) для сопоставления букв Unicode.(Они описаны в Regexp . Найдите здесь эти выражения.) Вы можете заменить \p{Alpha} на [a-zA-Z], но в этом случае "Très" не будет совпадать.

ЕслиВы также хотите сопоставить цифры, используйте \p{Alnum} или [[:alnum:]].Хотя \w также соответствует буквам (только на английском языке) и цифрам, он также соответствует символам подчеркивания, что, вероятно, нежелательно в этой ситуации.

Знаки пунктуации могут быть проблемой, когда слова извлекаются из строки путем разбиенияна пробел.

arr = "That   is a cow.".split
  #=> ["That", "is", "a", "cow."]
arr.select { |word| word.size >= 4 }
  #=> ["That", "cow."]

, но "cow" имеет только три буквы.Если вместо этого вы использовали String#scan для извлечения слов из строки, вы получите желаемый результат.

arr = "That   is a cow?".scan /\p{Alpha}+/
  #=> ["That", "is", "a", "cow"]
arr.select { |word| word.size >= 4 }
  #=> ["That"]

Однако, если вы используете scan, вы также можете использовать регулярное выражение для извлечения только слов, имеющихминимум 4 символа и пропустите дополнительный шаг.

0 голосов
/ 19 сентября 2018

Если вы хотите отфильтровать список и выбрать только определенные виды записей, используйте метод select:

var_b.select do |i|
  i.length >= max_length
end

Где это все, что вам нужно.

* * * * * * * * * * * * * * * * * Середина return i сбивает с толку, поскольку она выходит из цикла и возвращает одно значение из самого метода .Помните, что в Ruby, в отличие от других, таких как JavaScript, часто подразумевается return, и его не нужно указывать явно.

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

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