类中的命名空间模块:实例变量范围

时间:2014-07-03 00:12:03

标签: ruby

我有一个这样的课。我将命令定义为内部名称间距的模块(因为它响应来自播放器的命令,并且将定期添加和删除命令)。但是,命令中的方法无法查看@environments。我该如何解决?

class Player
  attr_accessor :environment

  module Commands
    def self.look *args
      @environment.describe
    end

    def self.exit *args
      Kernel.exit(true)
    end

    def self.method_missing *args
      puts "What?"
    end
  end

  def respond arg
    cmd = arg.split(" ")
    Commands.send(cmd[0], cmd)
  end
end

1 个答案:

答案 0 :(得分:0)

@environment是一个实例变量,因此可以从Player的实例访问它。在方法之前添加self使其成为一个类方法(在其他语言中使用静态方法),使上面的代码可以执行:

class Player
  attr_accessor :environment

  def initialize
    self.extend Commands
  end

  module Commands
    def look *args
      puts @environment.describe
    end
  end

end

player = Player.new
Struct.new("Environment", :describe)
player.environment = Struct::Environment.new("foo")
puts player.look