2012-06-13 9 views
13

Warum funktioniert dieser Code nicht?Ruby wenn gegen Ende der Zeile, wenn sich anders verhalten?

b if b = true 

Fehler: undefined local variable or method `b'

Aber das ist:

if b = true 
    b 
end 

Sollten sie nicht gleich sein?

+2

Es kann sogar vereinfacht werden: 'k wenn k = 1' und' wenn k = 1; k; Ende' – Flexoid

+0

Das war ein kleiner Ärger von mir; Ich glaube nicht, dass es einen tieferen Grund gibt, warum dein Code nicht funktionieren kann. Vielleicht werden sie diese Funktion in der nächsten Version von Ruby hinzufügen. –

+0

Conditionals sind Ausdrücke wie alles andere in Ruby, daher wird dieses Verhalten erwartet, wenn der Parser nach Variablen sucht und schwer zu ändern ist. Ich stimme jedoch zu, dass es ziemlich unintuitiv ist und nicht dem Prinzip der geringsten Überraschung folgt. –

Antwort

15

Dies ist eine sehr gute Frage. Es hat mit der Festlegung von Variablen in Ruby zu tun.

hier ein post by Matz on the Ruby bug tracker daran ist:

local variable scope determined up to down, left to right. So a local variable first assigned in the condition of if modifier is not effective in the left side if body. It's a spec.

+1

+1 für die Referenz. –

+0

Danke für den Grund. –

+0

+1 große Referenz – KensoDev

2

In der ersten Version, sobald k getroffen wird, kotzt der Parser, weil es noch nicht gesehen wurde.

In der zweiten Version ist k Teil eines Zuweisungsausdrucks und wird anders analysiert.

2

Ich kenne den Grund nicht, aber das Problem, dass der Interpreter versucht, die Variable k vor der Auswertung der Bedingung zu suchen.

Wenn Sie es so schreiben, wird es kein Fehler sein und funktioniert wie erwartet:

k = nil 
h = {k: 1} 
v = k if k = h.delete(:k) 
0

Da der Ruby-Interpreter eine lokale Variable erstellt, wenn es einen Auftrag

Im zweiten Fall sieht, hat es noch nicht die Zuordnung gesehen , daher existiert die Variable nicht, wenn der Ausdruck geparst wird.

Um genauer zu sein, wird eine Methode zuerst in eine interne Repräsentation geparst, und dann wird der Code eventuell aufgerufen und tatsächlich ausgeführt.

Lokale Variablen sind erstellt in diesem Parsing-Durchlauf. Es ist eine Frage der Erklärung, es bedeutet nur, dass der Dolmetscher sich ihrer bewusst wird. Sie werden nicht in dem Sinne erzeugt, dass sie Raum oder einen Wert erhalten, bis die umgebende Methode von jemandem aufgerufen wird.

Verwandte Themen