为 class 中的数组实例变量覆盖 <<
Override << for an array instance variable in class
我需要为 class 中的一个属性覆盖运算符 <<
。
基本上,我想要的是只允许将唯一的整数推送到我的数组属性。
这是我的:
class Player
attr_accessor :moves
def initialize
@moves = []
end
def moves<<(value)
raise Exception if @moves.include?(value)
@moves.push(value)
end
end
很遗憾,此代码无效。
我该如何改进它或者是否有更好的方法来实现此类功能?
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
中定义方法,为内部表示创建一个间接且限制性更强的接口,并为您提供更多控制权。
我需要为 class 中的一个属性覆盖运算符 <<
。
基本上,我想要的是只允许将唯一的整数推送到我的数组属性。
这是我的:
class Player
attr_accessor :moves
def initialize
@moves = []
end
def moves<<(value)
raise Exception if @moves.include?(value)
@moves.push(value)
end
end
很遗憾,此代码无效。
我该如何改进它或者是否有更好的方法来实现此类功能?
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
中定义方法,为内部表示创建一个间接且限制性更强的接口,并为您提供更多控制权。