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

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

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

4

2 回答 2

2

对于那些不熟悉它的人,这里有更多关于Pig Latin的内容。

此正则表达式的工作方式是查找元音字符的开头字符串, qu. (*and?是使任何一种情况都成为可选的量词。)代码本质上将单词的这个组件与单词的其余部分交换,并附加ay. 您可能已经知道,但是每个带括号的组都是“捕获的”,按照左括号的顺序编号:因此不需要$2,因为它包含在$1.

于 2012-12-17T01:17:52.137 回答
1

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

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

于 2012-12-17T01:15:48.013 回答