这是它应该响应的基本结构,但我不知道如何编写类Interprete
interpreta=Interprete.new
interprete.add("a=0")
interprete.add("b=1")
interprete.add("a=b+10")
interprete.execute
interprete.value("a")#11
答案 0 :(得分:2)
您可以使用binding。这是一种将范围“存储”在可以使用eval
随意重新打开的变量中的方法。这是一个很好的教程,我用作参考拼凑解决方案Ruby’s Binding Class (binding objects)
:
class Interprete
def initialize
@commands = []
@binding = binding
end
def add(command)
@commands.push command
end
def execute
@commands.each { |command| @binding.eval command }
@commands = []
end
def value(variable_name)
@binding.eval variable_name
end
end
用法:
i = Interprete.new
i.add "a = 1"
i.execute
i.value "a" # => 1
关于此的注释:binding
每次调用时都会返回一个新对象;这就是为什么它被缓存在@binding
实例变量中。如果不这样做,每个命令将在不同的范围内执行,结果将无法访问。