在下面的练习中,我试图返回所有包含四个以上字母的单词。
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
我似乎只有一个字。
答案 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个字符的单词,然后跳过多余的步骤。