2

抱歉,关于 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
4

4 回答 4

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


从数组操作的角度来看,在大多数情况下,操作字符串的最佳方法是正则表达式:

def translate(string)
  string.gsub(/(^|\s)[aeiouy]\S*/i, '\0ay')
end

translate("apple orange mango") #=> "appleay orangeay mango"
于 2013-04-30T07:36:29.170 回答
1

听起来像是正则表达式的工作:

str = 'apple orange mango'

str.gsub(/\b[aeiou]\w*\b/, '\0ay')
#=> "appleay orangeay mango"

gsub将查找所有出现的模式(第一个参数)并将其替换为字符串(第二个参数)。在该字符串中,您可以引用匹配的模式并附\0加到ay它,这给我们留下了\0ay.

现在该模式(实际的正则表达式)的意思是“捕获整个单词(\b匹配单词边界),以其中一个开头[aeiou]并以零个或多个单词字符 ( \w*) 结尾”。

因此,您的完整方法可以归结为:

def translate(string)
  string.gsub /\b[aeiou]\w*\b/, '\0ay'
end 

瞧!

于 2013-04-30T11:45:56.190 回答
1

哈希键查找可能会更快一些

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
于 2013-04-30T08:19:25.703 回答
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" 
于 2013-04-30T09:04:55.530 回答