2009-11-10 15 views
61

私はいつもRubyでテスト文字列平等に次の操作を行います。Rubyの文字列や記号の文字列の等価性(オブジェクト等価ではない)をテストする最も簡潔な方法は?

if mystring.eql?(yourstring) 
puts "same" 
else 
puts "different" 
end 

が、これはテスト対象の平等なしにこれを行うための正しい方法ですか?

文字列の内容に基づいて文字列をテストする最も簡潔な方法を探しています。

括弧と疑問符を使用すると、これはちょっとぎこちないようです。

答えて

10

あなたのコードサンプルは、トピックの一部、つまりシンボル上で展開されず、質問の一部が返答されませんでした。

次の2つの文字列、fooとbar、および

foo.to_s == bar.to_s 

との両方の文字列またはシンボルいずれであっても、あなたがテストすることができ平等をお持ちの場合はそれはもう少し効率的とオペランドに文字列変換をスキップします既知のタイプ。 fooは常に文字列

foo == bar.to_s 

しかし、効率ゲインであれば、ほぼ確実に、発信者の代わりに任意の余分な作業を要求する価値はありません。

Ruby 2.2より前のバージョンでは、シンボルがガベージコレクトされていないため、比較の目的で制御されない入力文字列を使用しないようにしてください。シンボルの使用を、コード内のリテラルや信頼できる設定プロパティなど、自分が管理する値に制限します。

ルビー2.2 introduced garbage collection of symbols

+6

'foo.intern == bar.intern'は良いでしょう - 文字列をインターンリングすることは、シンボルから文字列を作成する方が平均的に効率的です。 (指定された文字列が以前にインターンされていた場合は、シンボルが返されます) – Chuck

+0

これを追加していただきありがとうございます。 – sheldonh

+4

実際には、文字列が一致しないとシンボルをリークするので、比較の一部を少しでも節約するために、文字列からシンボルを作成することをお勧めします。シンボルはガベージコレクトされていないため、作成しない場合は作成しないでください。そうしないと、サービス拒否攻撃のベクタを作成します。 – Patru