很抱歉,关于TestFirst.org Ruby练习的另一个问题是编写一个来自新手的'Pig Latin'方法。其他答案有所帮助,但我无法成功地适应它们。主要问题是我正在尝试编写一种方法来扫描一串单词(不只是一个单词),修改一些单词(如果适用),然后返回完整的字符串。
下面是我的代码尝试执行练习的第一部分,即将“ay”附加到以元音开头的任何单词。但是,它对我不起作用 - 似乎是.include?从与单个字母(?)
比较时永远不会返回true非常感谢任何帮助!
# PIG LATIN
# If any word within the input string begins with a vowel, add an "ay" to the end of the word
def translate(string)
vowels_array = %w{a e i o u y}
consonants_array = ('a'..'z').to_a - vowels_array
string_array = string.split
string_array.each do |word|
if vowels_array.include?(word[0])
word + 'ay'
end
end
return string_array.join(" ")
end
translate("apple orange mango") # => "appleay orangeay mango" but does not
答案 0 :(得分:5)
string_array.each
只是遍历string_array
,不会改变它;为了更新数组的内容,您应该使用map!
:
# ...
string_array.map! do |word|
if vowels_array.include?(word[0])
word + 'ay'
else
word
end
end
# ...
translate("apple orange mango") #=> "appleay orangeay mango"
else word end
的目的是在不满足if
条件时也返回单词。
从数组操作的角度来看,在大多数情况下,操作字符串的最佳方法是regexp:
def translate(string)
string.gsub(/(^|\s)[aeiouy]\S*/i, '\0ay')
end
translate("apple orange mango") #=> "appleay orangeay mango"
答案 1 :(得分:1)
哈希键查找may be a bit faster
v= Hash['a', 1, 'o', '1', 'i', 1, 'u', 1, 'e', 1]
ws= %w(apple orange mango)
ws.map! do |w|
v[w[0]].nil? ? w : "#{w}ay"
end
p ws
答案 2 :(得分:1)
尝试:
def translate(string)
new_string = ''
string.split.each do |word|
if 'aoiue'.include?(word[0])
new_string += word + 'ay '
else
new_string += word + ' '
end
end
return new_string.strip
end
> translate("apple orange mango")
=> "appleay orangeay mango"
答案 3 :(得分:1)
听起来像正则表达式的工作:
str = 'apple orange mango'
str.gsub(/\b[aeiou]\w*\b/, '\0ay')
#=> "appleay orangeay mango"
gsub
将查找模式的所有出现(第一个参数)并将其替换为字符串(第二个参数)。在该字符串中,您可以使用\0
返回匹配的模式并向其添加ay
,这样就会留下\0ay
。
现在模式(实际的正则表达式)意味着“捕获整个单词(\b
匹配单词边界”),以[aeiou]
之一开头,以零个字符结尾({{1} }})”。
所以你的完整方法可归结为:
\w*
Etvoilá!