我有一个自定义类,并希望能够覆盖赋值运算符.这是一个例子:
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)
归档时间: |
|
查看次数: |
4250 次 |
最近记录: |