2012-12-17 134 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