2012-12-17 137 views
0

我被困在一个问题上,一位朋友给我一个解决方案,没有时间解释。我想回到这个问题,并从中学到更多。我只是想知道是否有人能够帮助我快速浏览该代码的特定方面。很难理解这个解决方案。

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

我认为这将有助于解释这个代码解决的问题。 – Mischa

+1

看起来像一只猪拉丁语翻译器。 –

回答

1

这是一个简单的猪拉丁语翻译器。该代码在几个步骤中工作:

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

2

对于那些不熟悉它的人,这里更多的是Pig Latin

方式这个表达式的作品,是它寻找的 -vowel字符,qu一开始字符串。 (*?量词,它们使这两种情况都是可选的。)代码基本上将单词的这个组成部分与该单词的其余部分互换,并附加ay。您可能已经知道,但每个加括号的组都被“俘获”,按照开括号的顺序编号:因此不需要$2,因为它包含在$1中。

+0

精彩,更容易理解。 – Feocco

+0

谢谢,我从来没有听说过猪拉丁文。 – Mischa