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

Fly*_*FoX 16 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
Run Code Online (Sandbox Code Playgroud)

目前这不符合预期.使用时

h = History.new
h.strategy = :mystrategy, :backward
Run Code Online (Sandbox Code Playgroud)

[:mystrategy, :backward]被分配给策略变量并且方向变量保持不变:forward.
重要的是我希望能够为direction参数分配标准值.

任何提供这项工作的线索都受到高度赞赏.

Phr*_*ogz 15

由于名称以方法结尾的方法的语法糖,=实际上将多个参数传递给方法的唯一方法是绕过语法糖并使用send...

h.send(:strategy=, :mystrategy, :backward )
Run Code Online (Sandbox Code Playgroud)

...在这种情况下,您可以使用更好名称的常规方法:

h.set_strategy :mystrategy, :backward
Run Code Online (Sandbox Code Playgroud)

但是,如果您知道数组从不合法参数,则可以重写您的方法以自动取消数组值:

def strategy=( value )
  if value.is_a?( Array )
    @strategy << value.first
    @strategy.direction = value.last
  else
    @strategy = value
  end
end
Run Code Online (Sandbox Code Playgroud)

然而,这对我来说似乎是一个严重的黑客攻击.如果需要,我会使用带有多个参数的非assigment方法名称.


另一种建议:如果唯一的指示是什么:forward,:backward那么:

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

def reverse_strategy=( name )
  @strategy << name
  @strategy.direction = :backward
end
Run Code Online (Sandbox Code Playgroud)