具有多个参数的Setter方法(赋值)

时间:2012-02-14 16:37:19

标签: ruby

我有一个自定义类,希望能够覆盖赋值运算符。 这是一个例子:

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 重要的是我希望能够为方向参数分配标准值。

非常感谢任何提供这项工作的线索。

2 个答案:

答案 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实例。在通话结束后,@strategySymbol的实例,而不是MyArray

你想做什么?替换对象或更新它?