覆盖<<对于类中的数组实例变量

时间:2015-07-04 11:37:18

标签: ruby operator-overloading metaprogramming attr-accessor

我需要为我班级中的一个属性覆盖运算符<<

基本上,我想要的是只允许将唯一的整数推送到我的数组属性。

这就是我所拥有的:

class Player
  attr_accessor :moves

  def initialize
    @moves = []
  end

  def moves<<(value)
    raise Exception if @moves.include?(value)
    @moves.push(value)
  end
end

不幸的是,此代码不起作用。

如何改进,或者有更好的方法来实现这些功能?

1 个答案:

答案 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中定义方法,这些方法为内部表示创建一个间接且限制性更强的接口,并为您提供更多控制。