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. (*?は、どちらの場合もオプションにする量指定子です。) コードは基本的に、単語のこのコンポーネントを単語の残りの部分と交換し、 を追加しayます。すでにご存知かもしれませんが、括弧で囲まれた各グループは「キャプチャ」され、開き括弧の順に番号が付けられ$2ます$1

于 2012-12-17T01:17:52.137 に答える
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

于 2012-12-17T01:15:48.013 に答える