Ich habe eine einfache if-Anweisung, die sich sehr seltsam verhält. Wenn ich innerhalb der if-Anweisung einen Wert an einen attr_accessor
zuweise, wird der Wert gelöscht. Hier ist ein prägnantes Beispiel, das das Problem zeigt.
class FName
attr_accessor :name
attr_accessor :file_ext
def full_name
puts "ursprünglicher file_ext Wert: #{file_ext}"
if file_ext.nil?
file_ext = ".default"
end
puts "neuer file_ext Wert: #{file_ext}"
"#{name}#{file_ext}"
end
end
f = FName.new
f.name = "foo"
f.file_ext = ".txt"
puts f.full_name
Dies gibt folgendes aus:
ursprünglicher file_ext Wert: .txt
neuer file_ext Wert:
foo
Das ist überhaupt nicht das, was man erwarten würde. Hat jemand eine Idee, was hier passiert?
Beachten Sie, dass ich dieses Problem sowohl in Ruby 2.0.0-p247 als auch in Ruby 2.1.1_1 reproduzieren kann. Beachten Sie auch, dass wenn ich die Zeile file_ext = ".falsch"
entferne, das Codebeispiel wie erwartet funktioniert, wenn file_ext nicht nil ist, aber natürlich habe ich dann keine Möglichkeit, einen Standardwert bereitzustellen, wenn file_ext nil ist.
Ich habe versucht, puts
-Anweisungen in den if-Block zu setzen, und (wie erwartet) geben sie nichts aus. Wenn ich die Zeile f.file_ext = ".txt"
entferne, erhalte ich die Ausgabe:
ursprünglicher file_ext Wert:
neuer file_ext Wert: .default
foo.default
Zu guter Letzt: Ich hoffe, den Standardwert auf diese Weise nur träge bereitzustellen, da in meinem echten Code der Wert berechnet wird und ich die Berechnung vermeiden möchte, es sei denn, es ist notwendig.
Hoffentlich kann mir jemand da draußen sagen, warum das passiert!