我需要为我班级中的一个属性覆盖运算符<<
。
基本上,我想要的是只允许将唯一的整数推送到我的数组属性。
这就是我所拥有的:
class Player
attr_accessor :moves
def initialize
@moves = []
end
def moves<<(value)
raise Exception if @moves.include?(value)
@moves.push(value)
end
end
不幸的是,此代码不起作用。
如何改进,或者有更好的方法来实现这些功能?
答案 0 :(得分:1)
class Player
attr_accessor :moves
def initialize
@moves = []
@moves.define_singleton_method(:<<) do |value|
raise Exception if include?(value)
push(value)
end
end
end
您可以使用Object#define_singleton_method
添加仅特定于给定对象的方法。在元编程方面,Ruby非常灵活。
但是应该谨慎使用这些工具。我不了解您的具体情况,但最好不要直接访问@moves
。最好的方法可能是在Player
中定义方法,这些方法为内部表示创建一个间接且限制性更强的接口,并为您提供更多控制。