2012-06-05 8 views
7

Um einen kleinen Zusammenhang zu geben, wie ich das Problem verstehe.Warum ändert der Splat/Unary-Operator den zugewiesenen Wert a, wenn p vor * a = "" aufgerufen wird?

Splat Verwendung sammeln sich auf eine Zeichenfolge sendet: to_a oder: to_ary zum String

class String 
    def method_missing method, *args, &block 
    p method #=> :to_ary 
    p args #=> [] 
    p block #=> nil 
    end 
end 

*b = "b" 

So dass ich dachte, das neu zu definieren: to_ary Methode wäre, was ich bin nach.

class String 
    def to_ary 
    ["to_a"] 
    end 
end 

p *a = "a" #=> "a" 
p a  #=> "a" 

*b = "b" 
p b  #=> ["to_a"] 

Jetzt verwirrt mich das zu keinem Ende.

Wird das Ergebnis von * a = "a" gedruckt, ändert sich der Wert, der einem?

Zur weiteren

class String 
    def to_ary 
    [self.upcase!] 
    end 
end 

p *a = "a" #=> "a" 
p a  #=> "a" 

*b = "b" 
p b  #=> ["B"] 

Antwort

9

Sehr interessante Frage zeigen! Rubin nimmt diesen Ausdruck:

p *a = "a" 

und übersetzt sie in etwa so:

temp = (a = "a") 
p *temp 

Also das erste, was ist passiert, dass a-"a" zugewiesen wird, und dann wird das Ergebnis der Zuordnung Ausdruck, der "a" ist, wird gespritzt und an gesendet. Da das Standardverhalten von p beim Senden von mehreren Argumenten nur darin besteht, jedes zu iterieren und zu drucken, wird nur "a" angezeigt.

Kurz gesagt, es folgt eine "assign then splat" Reihenfolge der Auswertung. So wird a"a" zugewiesen, bevor die Zeichenfolge gespritzt wird.

Wenn Sie einen Funktionsaufruf nicht jedoch haben, es als so etwas wie diese interpretiert wird:

# *a = "a" gets interpreted as: 
temp = "a" 
a = *temp 

Dies folgt ein „Klecks dann zuweisen“ Reihenfolge der Auswertung. So a bekommt nach die Zeichenfolge wird beschriftet.

können Sie sehen, was durch eine Funktion, indem Sie wie folgt erhalten hat wird:

def foo *args 
    puts args.inspect 
end 

foo *a = "a" # outputs ["a"] 
a    # outputs "a" 

Hope this aufklärt, was los ist!

Kurz (dank Mark Reed):

p *a = "a" # interpreted as: p(*(a = "a")) 
*a = "a"  # interpreted as: a = *("a") 
+1

Rechts. Es geht nur um den Vorrang. 'p * a =" a "' bedeutet 'p (* (a =" a "))', nicht 'p (* a =" a ")'. –

+0

Yup genau, ich bearbeitet, um ein bisschen eine klärende Notiz hinzuzufügen. – robbrit

Verwandte Themen