我有一个自定义类,希望能够覆盖赋值运算符。 这是一个例子:
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
目前无法正常使用。使用时
h = History.new
h.strategy = :mystrategy, :backward
[:mystrategy, :backward]
被分配到策略变量,方向变量保持:forward
重要的是我希望能够为方向参数分配标准值。
非常感谢任何提供这项工作的线索。
答案 0 :(得分:15)
由于名称以=
结尾的方法的语法糖,实际上将多个参数传递给方法的唯一方法是绕过语法糖并使用send
...
h.send(:strategy=, :mystrategy, :backward )
...在这种情况下,您可以使用名称更好的普通方法:
h.set_strategy :mystrategy, :backward
但是,如果您知道某个数组从不合法参数,可以重写您的方法以自动取消数组值:
def strategy=( value )
if value.is_a?( Array )
@strategy << value.first
@strategy.direction = value.last
else
@strategy = value
end
end
然而,这对我来说似乎是一个严重的黑客攻击。如果需要,我会使用带有多个参数的非分配方法名称。
另一种建议:如果唯一的指示是:forward
和:backward
那么:
def forward_strategy=( name )
@strategy << name
@strategy.direction = :forward
end
def reverse_strategy=( name )
@strategy << name
@strategy.direction = :backward
end
答案 1 :(得分:2)
问题是
def strategy=(strategy, direction = :forward)
@strategy = strategy
@strategy.direction = direction
end
设置
时h.strategy = :mystrategy, :backward
您实际上覆盖了原始@strategy
实例。在通话结束后,@strategy
是Symbol
的实例,而不是MyArray
。
你想做什么?替换对象或更新它?