Warum definiert Ruby Objekt # = ~?

8

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:

%Vor%

Obwohl =~ für Object definiert ist, ist + nicht:

%Vor%

Warum wurde Object#=~ definiert, anstatt =~ auf String und Regexp zu beschränken?

    
Eric Walker 22.12.2012, 13:31
quelle

3 Antworten

2

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.

    
Nicholas 22.12.2012, 13:45
quelle
2

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, oder nil , wenn keine Übereinstimmung vorhanden ist.

     

Andernfalls ruft obj.=~ auf und übergibt str als Argument. Der Standardwert =~   in Object gibt nil zurück.

Der Punkt ist, Sie können Ihre eigene Implementierung von Objekt =~ schreiben - und es wird in String =~ Not Regexp Anweisung verwendet.

    
raina77ow 22.12.2012 13:43
quelle
2

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.

    
Marc-André Lafortune 22.12.2012 22:25
quelle

Tags und Links