Ruby は型の実行スタイルに===
演算子を使用します。Ruby は、句にcase/when
存在するものの型に応じて、それぞれのメソッドを呼び出すことも知られています。when
.===
ステートメントwhen
に名前が含まれているとしclass
ます。ルールは次のit will use Module#===, which will return true if the right side is an instance of,
or subclass of, the left side.
とおりです。このコンテキストの例は次のとおりです。
ここでinstance of
テストが発生します
obj = 'hello'
#=> "hello"
case obj
when String
print 'It is a string'
when Fixnum
print 'It is a number'
else
print 'It is not a string'
end
#It is a string
#=> nil
ここでsubclass of
テストが発生します
num = 10
#=> 10
case num
when Numeric
puts "Right class"
else
puts "Wrong class"
end
#Right class
#=> nil
リテラルwhen
が含まString
れるようになり、次に String#=== が呼び出され、左右のリテラルが同じ (同じシーケンスで同じ文字) かどうかがチェックされます。
a = "abc"
#=> "abc"
case a
when "def" then p "Hi"
when "abc" then p "found"
else "not found"
end
#"found"
#=> "found"
オールロジックがかっこよすぎる。今私のクエリはcase/when
構造です -
- 、またはリテラル、または実行時に有効なものを
when
保持しているかどうかをRubyはどのように認識しますか?class
String
また
- 現在保持
.===
しているモノに対してそれぞれのオペレーターを呼び出す前に、どのようなテストを実行しますか。when
編集
動作中のプリンシパルを理解する前にCase/when
、次のことを明確にしておきましょうwhen
。
String.===("abc") #=> true
「abc」はString
クラスのインスタンスだからです。- そうですか?
今、誰が誰のスーパークラスであるかを確認するために、以下を試しました。
10.class #=> Fixnum
Fixnum.superclass #=> Integer
Integer.superclass #=> Numeric
Numeric.superclass #=> Object
うーん。true
これは、 Fixnum が の間接サブクラスでもあるため、以下が返されることを意味しますNumeric
。- そうですか?
Numeric.===(10) #=> true
しかし、なぜ以下の出力が上記と矛盾するのでしょうか?
Numeric.===(Fixnum) #=> false
以下のように私のクエリをより具体的にしようとしています:
と を呼び出しているNumeric.===(10)
ときString.===("abc")
。私たちは、ではなく"abc"
、10
むしろ"abc".class
、およびを送信していると思います10.class
。
10.===(10) #=> true
Numeric.===(10) #=> true
次に、上記を見てください。どちらも戻りtrue
ます。true
それらは同じロジックで出力されますか? と思いますNO
。比較10.===(10)
のようなもの
です。10 ==(10)
しかし、 のクラスは のサブクラスとしてNumeric.===(10)
出力されます。true
10
Numeric
"abc".===("abc") #=> true
String.===("abc") #=> true
次に、上記を見てください。どちらも戻りtrue
ます。true
それらは同じロジックで出力されますか? と思いますNO
。"abc".===("abc")
単純な文字列リテラル比較"abc" ==("abc")
比較と同じです。しかし、のインスタンスであるとしてString.===("abc")
出力します。true
"abc"
String
今私の質問は、ルビーが左側のオペランド型をどのように検出し、適切な比較規則を適用するかです。
100%間違っているかもしれませんが、その場合は訂正してください。