2012-04-10 19 views
0

ich ein interessantes Problem gefunden: http://rubeque.com/problems/fixing-bad-code-the-wrong-way/solutionsRubin initialisieren und Selbst

Im Allgemeinen haben wir eine einfache Klasse (man beachte, dass wir nicht attr_accessor hier haben):

class Foo 
    def itnialize(name) 
    self.foo = name 
    end 

    def set_bar 
    self.bar = 'it will fail..' 
    end 
end 

Ich dachte, dass Rubin erhöhen wird keine Methode Fehler, wenn ich Foo.new aufrufen, aber es passiert ohne Probleme. Der Code schlägt fehl, wenn ich versuche Foo.new.bar

Wie ist es möglich und wie auf Foo.new.foo Variable zugreifen?

Antwort

4

Sie haben einen Tippfehler und haben initialize als itnialize falsch geschrieben, so dass es nicht aufgerufen wird - also kein Fehler.

Es sieht so aus, als ob Sie versuchen, eine Instanzvariable zu erstellen - dazu müssen Sie sie irgendwo mit dem Präfix @ definieren. So könnten Sie tun:

def initialize(name) 
    @foo = name 
end 

das dann bedeuten würden Sie in der Lage sind, die Klasse zugreifen @foo innen.

self.foo kann immer nur beziehen sich auf eine Methodefoo, so müssen Sie diese Methode definieren, wenn Sie es so nennen wollen, entweder explizit oder durch einen der attr Varianten verwenden.

jedoch in diesem Fall könnten Sie tun, nur

def set_bar 
    @bar = 'it will succeed!' 
end 
+0

Meine schlecht, es scheint, dass dieses Rätsel http://rubeque.com/problems/fixing-bad-code-the-wrong-way/ Lösungen machen keinen Sinn ... – luacassus

+0

Ich habe mir nur das Puzzle angesehen, kann aber nicht sehen, wie es zusammenhängt! Das Rätsel macht aber Sinn - und der Titel "schlechten Code falsch fixieren" ist * sehr, sehr passend *. – Russell

+1

Ich denke, die Sache im Puzzle ist die Definition von 'method_missing' - Sie müssen keinen Code außerhalb dieser Methode ändern. – Russell