2016-05-28 9 views
2

Wenn ich Instanzvariablen in der Initialisierungsmethode initialisiere, gibt es einen Unterschied zwischen @var = var_value und self.send("var=", var_value)? Damit meine ich, gibt es irgendeinen Grund, aus irgendeinem Grund den einen Weg dem anderen vorzuziehen, selbst wenn das einen Stil-Grund bedeutet?Gibt es einen Unterschied zwischen @var = var_val und self.send ("var =", var_val)?

class MySuperClass 
    attr_accessor :columns, :options 
end 

class MySubClass < MySuperClass 
    def initialize(columns, options) 
    @columns = columns 
    @options = options 
    end 
end 

class MyOtherSubClass < MySuperClass 
    def initialize(columns, options) 
    self.send("columns=", columns) 
    self.send("options=", options) 
    end 
end 

Antwort

4

Es gibt einen Unterschied.

@var = x wird einer Instanzvariablen zugewiesen. Es gibt keinen Methodenaufruf. Es gibt keinen virtuellen Versand. Es gibt keine (vernünftige) Möglichkeit, die Zuweisung abzufangen.

sendruft eine Methode auf (oder "sendet eine Nachricht"). Im Kontext ist :var= der Assessor "Setter-Methode", die wraps eine Instanzvariable Zuweisung. Aber es ist eine Methode, die über einen virtuellen Versand aufgerufen wird, der die Vererbung achtet, und alles kann - auch in Subtypen überschrieben werden.

Die wahre entspricht @var = xinstance_variable_set wäre:

self.instance_variable_set(:@var, x) 

Mit send in diesem Fall ist seltsam. Verwenden Sie den Accessor direkt (self.columns = columns), wenn dies die Absicht ist.

Welche davon "richtiger" ist, hängt vom Grad der Kapselung ab - und den Verträgen, die für die Art und den Verwendungszweck definiert sind. Im Allgemeinen bin ich auf der Seite der Accessoren, wenn Subtypen beteiligt sind.

+0

Ich würde sagen, sogar mit 'instance_variable_set' ist in diesem Fall ungerade, wie es nur verwendet wird, wenn der erste Parameter dynamisch ist, d. H. Im Laufe des Programms ausgewertet. –

+0

@ MladenJablanović Ja, beide sind seltsam :) Es war streng zu unterscheiden, die Operation. – user2864740

Verwandte Themen