如何制作基本的红宝石翻译

时间:2017-06-10 20:49:17

标签: ruby

这是它应该响应的基本结构,但我不知道如何编写类Interprete

 interpreta=Interprete.new

interprete.add("a=0")

interprete.add("b=1")

interprete.add("a=b+10")

interprete.execute

interprete.value("a")#11

1 个答案:

答案 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实例变量中。如果不这样做,每个命令将在不同的范围内执行,结果将无法访问。