I have a custom class and want to be able to override the assignment operator. Here is an example:
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
This currently doesn't work as intended. upon using
h = History.new
h.strategy = :mystrategy, :backward
[:mystrategy, :backward] gets assigned to the strategy variable and the direction variable remains :forward.
The important part is that I want to be able to assign a standard value to the direction parameter.
Any clues to make this work are highly appreciated.
Due to the syntax sugar of methods whose names end in=, the only way that you can actually pass multiple parameters to the method is to bypass the syntax sugar and use send…
h.send(:strategy=, :mystrategy, :backward )
…in which case you might as well just use a normal method with better names:
h.set_strategy :mystrategy, :backward
However, you could rewrite your method to automatically un-array the values if you knew that an array is never legal for the parameter:
def strategy=( value )
if value.is_a?( Array )
@strategy << value.first
@strategy.direction = value.last
else
@strategy = value
end
end
This seems like a gross hack to me, however. I would use a non-assigment method name with multiple arguments if you need them.
An alternative suggestion: if the only directions are :forward and :backward what about:
def forward_strategy=( name )
@strategy << name
@strategy.direction = :forward
end
def reverse_strategy=( name )
@strategy << name
@strategy.direction = :backward
end
The problem is
def strategy=(strategy, direction = :forward)
@strategy = strategy
@strategy.direction = direction
end
When you set
h.strategy = :mystrategy, :backward
you are actually overriding the original @strategy instance. After that call, @strategy is an instance of Symbol, not MyArray.
What do you want to do? Replace the object or update it?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With