2012-02-14 9 views
14

Mam niestandardową klasę i chcę mieć możliwość zastąpienia operatora przypisania. Oto przykład:Metoda setera (przypisania) z wieloma argumentami

class MyArray < Array 
    attr_accessor :direction 
    def initialize 
    @direction = :forward 
    end 
end 
class History 
    def initialize 
    @strategy = MyArray.new 
    end 
    def strategy=(strategy, direction = :forward) 
    @strategy << strategy 
    @strategy.direction = direction 
    end 
end 

To obecnie nie działa zgodnie z przeznaczeniem. przy użyciu

h = History.new 
h.strategy = :mystrategy, :backward 

[:mystrategy, :backward] zostanie przypisana do zmiennej strategii i zmienny kierunek pozostaje :forward.
Ważną częścią jest to, że chcę mieć możliwość przypisania standardowej wartości do parametru kierunku.

Wszelkie wskazówki, dzięki którym to dzieło są bardzo cenne.

Odpowiedz

14

Ze względu na cukier składni metod, których nazwy kończą się =, jedynym sposobem, że rzeczywiście można przekazać wiele parametrów do metody jest ominięcie cukier składni i używać send ...

h.send(:strategy=, :mystrategy, :backward) 

... w którym sprawa równie dobrze można po prostu użyć zwykłej metody z lepszymi nazwami:

h.set_strategy :mystrategy, :backward 

jednak mógłby przepisać swój sposób, aby automatycznie un-array wartości jeśli wiedziałem, że tablica nie jest legalna dla parametru:

def strategy=(value) 
    if value.is_a?(Array) 
    @strategy << value.first 
    @strategy.direction = value.last 
    else 
    @strategy = value 
    end 
end 

Wydaje się to jednak dla mnie brutalnym hackerem. W razie potrzeby użyłbym nazwy metody nieprzypisania z wieloma argumentami.


Alternatywą sugestia: jeśli tylko kierunki są :forward i :backward co:

def forward_strategy=(name) 
    @strategy << name 
    @strategy.direction = :forward 
end 

def reverse_strategy=(name) 
    @strategy << name 
    @strategy.direction = :backward 
end 
+0

Edytowane w celu dodania kolejnej sugestii dotyczącej alternatywnej implementacji. – Phrogz

+0

Podoba mi się sugestia, w której sprawdzasz, czy wartość jest tablicą. Mówisz, że to brutalny hack. Gdzie użycie tego problemu byłoby kłopotliwe? – FlyingFoX

+1

@FlyingFoX Jest to "brutalny hack", o ile nie jest idiomatyczny, a nie samokonujący i nie jest ogólnie stosowany (w przypadku, gdy ktoś może chcieć przekazać tablicę jako pierwszy parametr). – Phrogz

2

Problemem jest

def strategy=(strategy, direction = :forward) 
    @strategy = strategy 
    @strategy.direction = direction 
end 

Po ustawieniu

h.strategy = :mystrategy, :backward 

faktycznie nadpisujesz oryginalną instancję @strategy. Po tym wywołaniu @strategy jest instancją Symbol, a nie .

Co chcesz zrobić? Zastąp obiekt lub zaktualizuj go?

+0

Oh sry wygląda na to, że zawiodłem tę metodę. Powinna to być strategia @strategy <<. – FlyingFoX

+0

Oh; więc strategia nie ma kierunku, ale raczej masz listę strategii i aktualny kierunek? – Phrogz

Powiązane problemy