Vraag Settermethode (toewijzing) met meerdere argumenten


Ik heb een aangepaste klasse en wil de toewijzingsoperator kunnen overschrijven. Hier is een voorbeeld:

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

Dit werkt momenteel niet zoals bedoeld. bij gebruik

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

[:mystrategy, :backward] wordt toegewezen aan de strategievariabele en de richtingsvariabele blijft :forward.
Het belangrijkste is dat ik een standaardwaarde aan de richtingparameter wil toewijzen.

Alle aanwijzingen om dit te laten werken worden zeer op prijs gesteld.


15
2018-02-14 16:37


oorsprong


antwoorden:


Vanwege de syntaxisuiker van methoden waarvan de naam eindigt=, de enige manier waarop je meerdere parameters daadwerkelijk aan de methode kunt doorgeven, is om de syntaxisuiker te omzeilen en te gebruiken send...

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

... in dat geval kunt u net zo goed gewoon een normale methode gebruiken met betere namen:

h.set_strategy :mystrategy, :backward

Jij echter kon herschrijf je methode om automatisch de waarden ongedaan te maken als je wist dat een array nooit legaal is voor de parameter:

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

Dit lijkt me echter een grove hack. Ik zou een niet-opdrachtnaam gebruiken met meerdere argumenten als je ze nodig hebt.


Een alternatieve suggestie: als de enige richtingen zijn :forward en :backward hoe zit het met:

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

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

14
2018-02-14 16:43



Het probleem is

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

Wanneer je instelt

h.strategy = :mystrategy, :backward

je overschrijft eigenlijk het origineel @strategy aanleg. Na dat gesprek, @strategy is een instantie van Symbol, niet MyArray.

Wat wil je doen? Vervang het object of werk het bij?


2
2018-02-14 16:43