2012-03-15 5 views
6

私はいくつかのコードに三元に出くわしたと私はトラブルの条件を理解することが生じています:Rubyでこの3値条件をどのように読み取っていますか?

str.split(/',\s*'/).map do |match| 
    match[0] == ?, ? 
    match : "some string" 
end.join 

私は特定の時点で文字列を分割し、配列に集計結果を変換し、取り扱っておりますことを理解しません配列の各要素を交互に使用します。それ以外は何が起こっているのか分かりません。これを書くために

答えて

7

A(わずかに)より少ない混乱方法がある:私は複数行の三元の文がifブロックはRubyで返すことができ、特に以来、恐ろしいです

str.split(/',\s*'/).map do |match| 
    if match[0] == ?, 
    match 
    else 
    "some string" 
    end 
end.join 

と思います。

恐らく最も混乱するのはおそらく文字リテラルである?,です。 Ruby 1.8では文字(この場合は44)のASCII値を意味し、Ruby 1.9ではこれは単なる文字列(この場合は",")です。

","の代わりに文字リテラルを使用するのは、Ruby 1.9で文字列の[]を呼び出したときの戻り値が変更されたためです。 In 1.8 it returned the ASCII value of the character at that position,in 1.9 it returns a single-character string。ここで?,を使用すると、Ruby 1.8 & 1.9の間にあるString#[]の違いについて心配する必要はありません。

最終的には、matchの最初の文字が,であるかどうかをチェックするだけです。値が同じ場合は、"some string"に設定されます。

+0

ありがとう@AndrewMarshall、それは 'match ==(?、)だったら助けになりましたか? match: "some string" '?それとも他に何か意味がありますか? – ismail

+0

@IsmailTabtabaiそれは同じでしょう。私が3つのステートメントを実行するときはいつも、条件ステートメント全体を括弧で囲んで、それがどこにあるかを明確にしますが、それは単なるスタイルです。文字リテラルはおそらくあまり知られていないRubyの構文構造の1つであり、それが何であるか分からないとき(特に他の '? 'と組み合わせるとき)は非常に混乱することがあります。 –

+0

同じことを意味します。だから、[0] ==?、?マッチ: "いくつかの文字列" – Bijan

関連する問題