8

別の質問の回答へのコメントを読んで少し調べたところ、=~が で定義されObject、 でオーバーライドされStringていることがわかりましたRegexp。との実装は、他のクラスを想定しているようですStringRegexp

"123" =~ "123" # => TypeError: type mismatch: String given
/123/ =~ /123/ # => TypeError: can't convert Regexp to String

=~は に対して定義されていますがObject、 で+はありません:

Object.new =~ 1 # => nil
Object.new + 1 # => undefined method `+' for #<Object:0x556d38>

とに限定するObject#=~のではなく、 が定義されているのはなぜですか?=~StringRegexp

4

3 に答える 3

2

あなたのコメントから、あなたの実際の質問は、定義されていない=~のに定義されている理由です。Object+

その理由は、(一致しないため) ランダムなオブジェクトObject#=~を返すことができますが、意味のある結果を返すことができないためです。nilObject#+

必ずしも非常に便利というわけではありませんが、偽であるとは言えません (nil結果が矛盾していることを証明するには、一致を示す必要があります)。空虚な真実の数学的概念を参照してください。一方、 の結果はObject.new + 1矛盾につながる可能性があります。

これは、 、、 ...、 が戻らないことと完全に一貫している間、<=>戻すことができることnil(したがって にも定義されているObject) に似ています。その場合は返品することにしましたのでご了承ください。<>truefalseClass#>nil

于 2012-12-22T22:25:58.360 に答える
2

まあ、それは実際には String =~ documentationでうまく答えられていると思います:

Match — obj が の場合Regexp、それをパターンとして使用して str と照合し、一致が開始する位置を返しますnil。一致がない場合は、その位置を返します。

それ以外の場合は、引数としてobj.=~渡して を呼び出します。 Objectstrのデフォルトは を返します。=~nil

ポイントは、オブジェクトの独自の実装を作成できることです。これはステートメント=~で使用されます。String =~ Not Regexp

于 2012-12-22T13:43:14.913 に答える
2

一致式で任意のオブジェクトを使用できるため、次のようになります。

Object.new =~ /abc/
=> nil

Object.newこれは、正規表現と一致しないという点で理にかなっていると思います。/abc/左の引数がStringオブジェクトでない場合、コードは爆発します。=~したがって、演算子の左側に任意のオブジェクトを配置できるため、一般にコードが簡素化されます。

于 2012-12-22T13:45:36.297 に答える