Techioz Blog

Ruby では同じことを行うのに、わずかに異なる方法がこれほどたくさんあるのはなぜですか?

概要

Rubyを勉強しています。私のバックグラウンドは C++/Java/C# です。全体として、私はこの言語が気に入っていますが、同じことを達成するのになぜこれほど多くの異なる方法があり、それぞれにわずかに異なるセマンティクスがあるのかについては少し混乱しています。

たとえば、文字列の作成を考えてみましょう。 ’’、““、q%、Q%、または単に % を使用して文字列を作成できます。一部のフォームは補間をサポートしています。他の形式では、文字列区切り文字を指定できます。

文字列リテラルを作成する方法が 5 つあるのはなぜですか?なぜ非補間文字列を使用する必要があるのでしょうか? % 構文には引用リテラルと比べてどのような利点がありますか?

Ruby の冗長性には価値があるに違いないことはわかっていますが、私の素人目にはそれがはっきりとは見えません。教えてください。

解決策

もちろん、補間を望まない場合です。たとえば、文字列補間に関するドキュメントを出力しているとします。

'Use #{x} to interpolate the value of x.'
=> "Use #{x} to interpolate the value of x."

C# の文字列リテラル プレフィックス @ と同様に、引用符を使用せずに、または多くの項目をエスケープしたくない場合に、より自然に文字列を作成できます。

%{The % syntax make strings look more "natural".}
=> "The % syntax makes strings look more \"natural\"."

%{<basket size="50">}
=> "<basket size=\"50\">"

他にも多くの % 表記があります。

%w{apple banana #{1}cucumber}   # [w]hitespace-separated array, no interpolation
=> ["apple", "banana", "\#{1}cucumber"]

%W{apple banana #{1}cucumber}   # [W]hitespace-separated array with interpolation
=> ["apple", "banana", "1cucumber"]

# [r]egular expression (finds all unary primes)
%r{^1?$|^(11+?)\1+$}
=> /^1?$|^(11+?)\1+$/

(1..30).to_a.select{ |i| ("1" * i) !~ %r{^1?$|^(11+?)\1+$} }
=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

%x{ruby --version} # [s]hell command
=> "ruby 1.9.1p129 (2009-05-12 revision 23412) [x86_64-linux]\n"

%s (シンボル用) などもあります。

これはそれほど珍しいことではありません。たとえば、C# を考えてみましょう。C# には、文字列を生成するいくつかの異なる方法があります。 ““; @”“; StringBuilder.ToString() など。