2017-03-11 10 views
2

Ich erhalte bizzare Ausgabe in irbWarum Rubin interpretieren ++ als + @

>> [1, 2] + + [3] 
NoMethodError: undefined method `[email protected]' for [3]:Array 
    from (irb):2 
    from /home/marko/.rubies/ruby-2.3.1/bin/irb:11:in `<main>' 
>> [1, 2] ++ [3] 
NoMethodError: undefined method `[email protected]' for [3]:Array 
    from (irb):3 
    from /home/marko/.rubies/ruby-2.3.1/bin/irb:11:in `<main>' 
>> 

geschieht dies absichtlich oder ist es ein Fehler?
Was ist die Logik hinter + + in [email protected]

+4

Im letzten Jahr haben die Autoren von 453 SO-Fragen vorgeschlagen, dass unerklärliches Verhalten auf einen Fehler in Ruby zurückzuführen sein könnte. In 451 dieser Fälle war der Übeltäter etwas Banaleres. –

+0

http://ruby-doc.org/core-2.4.0/Numeric.html#method-i-2B-40 –

Antwort

9

Umwandlung Es ist nicht + + in [email protected] Umwandlung, ist es die letztere +-[email protected] Umwandlung, das heißt dem Präfix + Operator. Daher wird der Ausdruck genauso geparst wie [1, 2] + (+[3]).

([email protected] wird verwendet, um den unären Plus-Operator zu bezeichnen, weil + für den binären Plus-Operator reserviert ist.)

(Außerdem gibt es keinen ++ Operator in Ruby.)

+1

Warum ist '+' dasselbe wie '+ @'? –

+4

Weil '+' den binären Plus-Operator bezeichnet, während '+ @' den unären (Präfix) Plus-Operator bezeichnet. – emlai

3

Ich glaube, das analysiert wird, wie:

[1, 2] + +[3] 

Und der Fehler sagt Rubin, dass es kein Konzept einer positiven Array ist.

Sie können dies mit Ganzzahlen sehen. Zum Beispiel:

1++2 # => 3 
# parsed as 1 + +2 
# (obviously this is a particularly bad way to write this expression - don't do it!) 
0

Per dieser Antwort No increment operator (++) in Ruby? Rubin keinen inkrementellen Operator, also besten + + wird als zwei separate Operatoren interpretiert wird, unerwartetes Verhalten verursachen. Als

++ und - NICHT

Operator [s] in Ruby vorbehalten

es ist möglich, dass ein Ruby Edelstein oder andere enthielt Bibliothek könnte zusätzliches unerwartetes Verhalten führen, wenn diese Operation versucht. Erwähnenswert ist auch, dass ++ oder + + funktionell das Gleiche ist, was in einer nicht weißraumsensitiven Sprache wie Ruby fehlschlägt, wo es keine möglichen separaten Operationen für beide +-Operatoren gibt.

Kurz: Rubin nicht + + als [email protected] interpretiert, interpretiert er nur sie als zwei separate + Betreiber.

+1

Das ist irreführend. Erstens: Ja, Ruby * interpretiert * es als zwei getrennte Operatoren, interpretiert es aber als zwei * verschiedene * Operatoren: Binärinfix '+' und unäres Präfix '+'. Zweitens: Die Nachricht, die dem unären Präfix '+' entspricht, heißt '+ @', also, ja, Ruby * interpretiert es als '+ @', speziell als '[1, 2]. + ([3]. +) @()) '. –

+0

Ist das immer wahr oder nur in bestimmten Situationen?Wenn Letzteres dann meine Antwort auf die ursprüngliche Frage richtig ist, sollte sie nicht irreführend sein, da es sich um eine Verallgemeinerung handelte, die aus einem bestimmten Beispiel und nicht aus dem Beispiel selbst gemacht wurde - obwohl natürlich die tuple_cat Antwort von einem erfahreneren Entwickler mit niedrigerer -level Erfahrung ist seiner upvotes würdig, imo. –

Verwandte Themen