2009-11-25 1 views
8

私はRubyを学んでいます。私の背景はC++/Java/C#です。全体的に、私は言語が気に入っていますが、同じことを達成するためのさまざまな方法があり、それぞれが少しずつ異なるセマンティクスを持っている理由について少し混乱しています。Rubyで同じことを行う方法が多少異なるのはなぜですか?

たとえば、文字列の作成を行います。私は ''、 ""、q%、Q%、または単に%を使用して文字列を作成することができます。補間をサポートするフォームもあります。他の形式では、文字列デリミタを指定することができます。

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

私はRubyの冗長性に値する必要があることを知っていますが、訓練されていない目には明確に見えません。私を教えてください。

答えて

15

なぜ非補間文字列を使用するのですか?

もちろん、補間したくない場合。たとえば、おそらくあなたは、文字列の補間についてのいくつかのドキュメントを出力している:

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

%構文が引用されたリテラルの上にどのような利点がありますか?

それはあなたが引用符なしで、より自然に文字列を書き込み、またはあなたがC#の文字列リテラルプレフィックス@に類似し、多くのことをエスケープしたくない場合にすることができます。

%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(記号のため)もありますし、いくつかの他:

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

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

は、他の多く%-notationsがあります。

なぜ文字列リテラルを作成するには5つの方法がありますか?

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

+1

「自然」は非常に主観的です。 「ひどく珍しい」とは、言語機能を作成する動機ではありません。 – skrat

+1

"ナチュラル"は非常に主観的ですが、「正確に同じものを言うのが簡単ではないタイプの文字」はそうではなく、言語機能を作成するためのかなり良い動機です。 –

1

Rubyの構文の多くは、qを使用して文字列にいくつかの単語を引用するような、perlの構文から得られます。それはおそらく、そのような大きな品種の主な理由です。

3

私はRubyのエキスパートではありませんが、「構文的な砂糖」という言葉を聞いたことがありますか?基本的に、いくつかのプログラミング言語は、同じタスクを達成するために異なる構文を提供します。彼の以前のプログラミング/構文の経験のおかげで、他の人よりも簡単に見つけることができる人もいます。

+0

実際。明らかに、Rubyはエイリアス/シノニムをより多く使用しています。例えば、配列中の要素の数は、 'count'、' length'、または 'size'で取り出すことができます。配列の同じ属性に対して異なる単語を使用することもできますが、Rubyではコードに最も適した単語を選択することができます。収集するアイテムの_番号、配列の_長さ、または_size_構造。基本的にはすべて同じですが、適切な単語を選ぶと、コードを読みやすくなります。これは言語の優れた特性です。 –

2

ほとんどの場合、通常の文字列区切り文字を使用します。一重引用符と二重引用符の主な違いは、二重引用符を使用して変数を補間できることです。彼らは内部文字列の一部であるので、あなたが引用符を使用できない場合

puts 'this is a string' 
# => this is a string 
puts "this is a string" 
# => this is a string 
v = "string" 
puts 'this is a #{v}' 
# => this is a #{v} 
puts "this is a #{v}" 
# => this is a string 

%q%Qは便利です。 は、たとえば、あなたがこの場合

html = %Q{this is a <img src="#{img_path}" class="style" /> image tag} 

を書き終わるかもしれないあなたが内部属性の区切り文字をエスケープする場合を除き、あなたは、区切り文字として二重引用符を使用することはできません。また、img_path変数が補間されないため、一重引用符を使用することはできません。

0

文字列に大文字の特殊文字(バックスラッシュ、#{}など)がたくさんあり、それらのすべてをエスケープしたくない場合は、補間されていない文字列を使用します。

文字列にエスケープしなければならないたくさんの引用符が含まれている場合は、異なるデリミタを使用します。

文字列に通常の文字列構文が扱いにくくなる行がたくさんある場合、heredocを使用します。

0

Rubyは多くの言語から構成要素とアイデアを借りています。 2つの最も顕著な影響はSmalltalkとPerlです。

SmalltalkやPerlでの快適さに応じて、同じことをするために異なる構造を選択することもできます。

1

もう1つの理由は、補間されていない文字列のパフォーマンスを少し向上させることです。 '' vs '"を使うということは、Rubyが文字列の中に何が入っているかを全く考慮する必要がないことを意味します。そのため、配列キーやシンボルを一重引用符で囲んでいる人がより高速に表示されます。それが価値あるものについては、ちょっとしたベンチマークが含まれます。

require 'benchmark' 

Benchmark.bmbm(10) do |x| 
    x.report("single-quote") do 
    for z in 0..1000000 
     zf = 'hello' 
    end 
    end 

    x.report("double-quote") do 
    for z in 0..1000000 
     zf = "hello" 
    end 
    end 

    x.report("symbol") do 
    for z in 0..1000000 
     zf = :hello 
    end 
    end 
end 

利回り:ジョンの答えの線に沿って

Rehearsal ------------------------------------------------ 
single-quote 0.610000 0.000000 0.610000 ( 0.620387) 
double-quote 0.630000 0.000000 0.630000 ( 0.627018) 
symbol   0.270000 0.000000 0.270000 ( 0.309873) 
--------------------------------------- total: 1.580000sec 
0

:迅速なハックで 、私は頻繁に私のRubyスクリプトの中からgrepの構文でPerlやsedのワンライナーを実行してしまいます。 %[ ]タイプシンタックスを使うことができるということは、端末から私の正規表現をコピーして貼り付けることができるということです。

0

元の質問は、Rubyでやり方が多少異なるからです。

時には異なることが分かります:引用符は、異なる動作が非/補間、代替の引用文字など異なる構文を必要とする良いケースです。歴史的な認知度は%x()vs `` Perlで

シノニムの問題 - [] .size [] .length [] .count - IDEが手助けできる言語があまりにも多すぎる世界で役立つような感じです:猿のパッチと厳密ではなく動的な型定義の奇妙な組み合わせは、実行時エラーをコード化の不可避で不満足な部分にするので、同義語を提供することで問題を減らそうとします。残念なことに、彼らは、異なる方法に慣れているプログラマを混乱させてしまいます。

「とても似ていますが、非常ない」問題は、例えば...

$ ruby -le 'e=[]; e << (*[:A, :B])' 
-e:1: syntax error, unexpected ')', expecting :: or '[' or '.' 
$ ruby -le 'e=[]; e << *[:A, :B]' 
-e:1: syntax error, unexpected * 
$ ruby -le 'e=[]; e.push(*[:A, :B])' 
$ 

は...だけは本当に欠陥とみなすことができます。すべての言語にはそれらがありますが、通常はこれよりも秘訣です。

そして、Rubocopのコーディング標準ではナンセンスを取り返していない限り、普通の任意の 'use raise'の代わりに失敗します。

Rubyにはいくつか素敵なビットがありますが、実際にはより良いものにコーディングしています。

関連する問題