我有一个这样的课。我将命令定义为内部名称间距的模块(因为它响应来自播放器的命令,并且将定期添加和删除命令)。但是,命令中的方法无法查看@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
答案 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