Rubyの文字列またはシンボルの文字列の同等性(オブジェクトの同等性ではない)をテストする最も簡潔な方法は?


86

Rubyで文字列の同等性をテストするために常にこれを行います。

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

これは、オブジェクトの同等性をテストせずにこれを行う正しい方法ですか?

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

括弧と疑問符があるので、これは少し不格好なようです。

回答:



14

あなたのコードサンプルはあなたのトピックの一部、すなわちシンボルを拡張しなかったので、質問の一部は答えられませんでした。

fooとbarの2つの文字列があり、両方が文字列または記号のいずれかである場合は、次のコマンドで同等性をテストできます。

foo.to_s == bar.to_s

既知のタイプのオペランドで文字列変換をスキップする方が少し効率的です。したがって、fooが常に文字列である場合

foo == bar.to_s

しかし、効率の向上は、発信者に代わって追加の作業を要求する価値がほとんどないことはほぼ間違いありません。

Ruby 2.2より前では、シンボルはガベージコレクションされないため、比較のために(文字列またはシンボルを使用して)制御されていない入力文字列をインターンすることは避けてください。リソースの枯渇によってサービス拒否攻撃を受ける可能性があります。シンボルの使用は、制御する値、つまりコード内のリテラル、および信頼できる構成プロパティに制限してください。

Ruby 2.2では、シンボルのガベージコレクションが導入されました。


6
foo.intern == bar.intern文字列のインターンは、シンボルから文字列を作成するよりも平均して効率的です。(特定の文字列が以前にインターンされている場合は、シンボルを返すだけです。)
— チャック

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

ジー、私はそれについて考えていませんでした。ありがとう、私はあなたのコメントに基づいて私の答えを修正しました。
— sheldonh 2013

1
これは、「シンボルはガベージコレクションされないため、制御されていない入力文字列をインターンすることは避けてください」と言い換える必要があります。@sheldonhありがとうございます。
— ネイト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.