很难理解这个解决方案。

时间:2012-12-17 01:06:48

标签: ruby regex

我遇到了问题,一位朋友没有时间向我发送解决方案。我想回到这个问题并从中学到更多。我只是想知道是否有人可以帮助我快速了解此代码的特定方面。

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

我不太清楚我如何替换字母的概念。我指的是单词=~

与此相关,我知道$指的是我表达的块。然而,我不太确定我知道我是如何获得它们的。

2 个答案:

答案 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等变量是特殊的全局变量,用于捕获正则表达式中括号中的匹配项。它们不一定会长时间停留,所以如果你使用它们,你应该立即将它们分配给其他东西。