Nach dem Lesen eines Kommentars zu einer Antwort in einer anderen Frage und ein wenig Nachforschung, I Siehe, dass =~
auf Object
definiert ist und dann von String
und Regexp
überschrieben wird. Die Implementierungen für String
und Regexp
scheinen die andere Klasse zu übernehmen:
Obwohl =~
für Object
definiert ist, ist +
nicht:
Warum wurde Object#=~
definiert, anstatt =~
auf String
und Regexp
zu beschränken?
Weil jedes Objekt in einem Übereinstimmungsausdruck verwendet werden kann:
%Vor% Ich denke, das macht Sinn, wenn Object.new
nicht mit der regexp /abc/
übereinstimmt und der Code explodiert, wenn das linke Argument kein String
-Objekt ist. Daher vereinfacht es den Code im Allgemeinen, da Sie ein Objekt auf der linken Seite des =~
-Operators haben können.
Nun, ich nehme an, dass das in String =~
Dokumentation :
Übereinstimmung - Wenn obj ein
Regexp
ist, verwenden Sie es als Muster, das mit str, und übereinstimmt gibt die Position zurück, an der die Übereinstimmung beginnt, odernil
, wenn keine Übereinstimmung vorhanden ist.Andernfalls ruft
obj.=~
auf und übergibtstr
als Argument. Der Standardwert=~
in Object gibtnil
zurück.
Der Punkt ist, Sie können Ihre eigene Implementierung von Objekt =~
schreiben - und es wird in String =~ Not Regexp
Anweisung verwendet.
Aus Ihren Kommentaren ist Ihre eigentliche Frage, warum =~
für Object
und +
nicht definiert ist.
Der Grund ist, dass Object#=~
nil
für zufällige Objekte zurückgeben kann (da sie nicht übereinstimmen), aber Object#+
kann kein aussagekräftiges Ergebnis liefern.
Es ist nicht unbedingt sehr nützlich, aber man kann nicht sagen, dass es falsch ist (man müsste ein Match zeigen, um zu beweisen, dass ein nil
-Ergebnis ein Widerspruch ist). Siehe das mathematische Konzept von nichtssagenden Wahrheiten . Auf der anderen Seite könnte jedes Ergebnis für Object.new + 1
zu Widersprüchen führen.
Dies ist vergleichbar mit <=>
, das nil
zurückgeben kann (und somit auch für Object
definiert ist), während <
, >
, ..., true
und false
nicht zurückgeben können. während es vollständig konsistent ist. Beachten Sie, dass für Class#>
in diesen Fällen nil
zurückgegeben wurde.
Tags und Links ruby