我遇到了问题,一位朋友没有时间向我发送解决方案。我想回到这个问题并从中学到更多。我只是想知道是否有人可以帮助我快速了解此代码的特定方面。
def translate phrase
phrase.split.map do |word|
word =~ /^([^aeiouyq]*(qu)?)(.*)$/
first_translation = $1
rest_of_translation = $3
"#{rest_of_translation}#{first_translation}ay"
end.join(" ")
end
我不太清楚我如何替换字母的概念。我指的是单词=~
与此相关,我知道$
指的是我表达的块。然而,我不太确定我知道我是如何获得它们的。
答案 0 :(得分:2)
对于那些不熟悉它的人,更多关于Pig Latin。
此正则表达式的工作方式是查找非 -vowel字符的开头字符串,或 qu
。 (*
和?
是量词,这两种情况都是可选的。)代码基本上将单词的这个组成部分与单词的其余部分交换,并追加{{ 1}}。您可能已经知道,但每个带括号的组都是“被捕获”,按开括号的顺序编号:因此不需要ay
,因为它包含在$2
中。
答案 1 :(得分:1)
这是一个简单的Pig Latin翻译。该代码分几步运行:
a = "this is a phrase".split
=> ["this", "is", "a", "phrase"]
b = a.map {|w| w =~ /^([^aeiouyq]*(qu)?)(.*)$/; [$1, $3] }
=> [["th", "is"], ["", "is"], ["", "a"], ["phr", "ase"]]
c = b.map {|v1,v2| "#{v2}#{v1}ay" }
=> ["isthay", "isay", "aay", "asephray"]
c.join(" ")
=> "isthay isay aay asephray"
IRB非常有助于分析此类代码的片段。
$1
,$2
,$3
等变量是特殊的全局变量,用于捕获正则表达式中括号中的匹配项。它们不一定会长时间停留,所以如果你使用它们,你应该立即将它们分配给其他东西。