如何返回整个数组而不是单个字符串

时间:2018-09-19 20:16:14

标签: ruby

在下面的练习中,我试图返回所有包含四个以上字母的单词。

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 :(得分:4)

如果要过滤列表并仅选择某些种类的条目,请使用select方法:

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

这就是您所需要的。

中间的return i令人困惑,因为这会跳出循环并从方法本身返回单个值 。请记住,在Ruby中,与JavaScript之类的其他语言不同,return通常是隐含的,不需要明确地拼写出来。

出于这个原因,块通常没有return,除非它们需要中断流程并突破方法本身。

答案 1 :(得分:2)

您不需要先从字符串中提取所有单词,然后选择至少包含四个字母的单词。相反,您可以使用带有正则表达式的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个字符的单词,然后跳过多余的步骤。