我正在关注chapter 2 of Understanding Computation来构建一个简单的Ruby解释器:
在课程Assign
之后的某个时刻,Variable
和Number
被定义(我认为这实际上是不相关的),我在 irb
IRB(主):001:0> statement = Assign.new(:x,Add.new(Variable.new(:x),Number.new(1)))
=> <<x = x + 1>>
IRB(主):002:0&GT; environment = {x:Number.new(2)}
=> {:x=><<2>>}
IRB(主):003:0&GT; statement,environment = statement.reduce(environment)
=> [<<x = 2 + 1>>, {:x=><<2>>}]
一切都很顺利。
但是当我在statement
文件中声明environment
和.rb
时:
def statement
Assign.new(:x, Add.new(Variable.new(:x), Number.new(1)))
end
def environment
{ x: Number.new(2) }
end
当我在 irb :中输入statement, environment = statement.reduce(environment)
时出现问题
IRB(主):001:0&GT; statement,environment = statement.reduce(environment)
NoMethodError:nil:NilClass的未定义方法
reduce
来自(irb):1 来自/ usr / bin / irb:12:<main>
我不知道错误是否在我声明statement
或environment
的方式上?
我怎样才能在.rb
文件中声明变量?
我检查this question,@variable_name
似乎不能使用非字符串变量。
答案 0 :(得分:1)
这两段代码完全不同。第一个使用变量,第二个使用方法。
变量的定义如下:
name_of_var = initialization_expression
方法定义如下:
def name_of_method(parameter_one, parameter_two)
body_expression
end
我不知道这个错误是否在我声明
的方式上statement
或environment
是
这就是:
def statement
Assign.new(:x, Add.new(Variable.new(:x), Number.new(1)))
end
def environment
{ x: Number.new(2) }
end
您可以在此定义两种方法statement
和environment
。他们所做的事实上是无关紧要的,因为你从不打电话给他们。
statement, environment = statement.reduce(environment)
在这里,您声明了两个变量statement
和environment
。您通过调用变量reduce
(statement
的内容nil
来初始化它们,因为statement
尚未初始化(我们正处于毕竟,初始化它,并且在Ruby中将非本征化变量计算为nil
)作为参数传递变量environment
的内容(出于同样的原因也是nil
)。
您永远不会调用您定义的方法,因为它们被您使用相同名称创建的两个变量所遮蔽。
我该怎么解决?
你已经做过:第一段代码可以工作。