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