在 .rb 文件中声明变量会导致不需要的输出

Declaring variables in .rb file result unwanted output

我正在跟随 chapter 2 of Understanding Computation 构建一个简单的 Ruby 解释器:

在ClassAssignVariableNumber定义之后的某个时刻(我认为这实际上是不相关的),我在irb

irb(main):001:0> statement = Assign.new(:x, Add.new(Variable.new(:x), Number.new(1)))

=> <<x = x + 1>>

irb(main):002:0> environment = { x: Number.new(2) }

=> {:x=><<2>>}

irb(main):003:0> statement, environment = statement.reduce(environment)

=> [<<x = 2 + 1>>, {:x=><<2>>}]

一切都很顺利。

但是当我在 .rb 文件中声明 statementenvironment 时:

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(main):001:0> statement, environment = statement.reduce(environment)

NoMethodError: undefined method reduce for nil:NilClass from (irb):1 from /usr/bin/irb:12:in <main>

我不知道这个错误是在我声明statement还是environment的路上?

如何在 .rb 文件中声明变量?

我检查了 this question 并且 @variable_name 似乎不适用于非字符串变量。

这两段代码完全不同。第一个使用变量,第二个使用方法。

变量定义如下:

name_of_var = initialization_expression

方法定义如下:

def name_of_method(parameter_one, parameter_two)
  body_expression
end

I don't know if the bug is on the way I declare statement or environment

是的。

事情是这样的:

def statement
  Assign.new(:x, Add.new(Variable.new(:x), Number.new(1)))
end

def environment
  { x: Number.new(2) }
end

这里定义了两个方法,statementenvironment。他们做什么实际上是无关紧要的,因为你永远不会打电话给他们。

statement, environment = statement.reduce(environment)

在这里,您声明了两个变量,statementenvironment。您通过对变量 statement 的内容调用 reduce 来初始化它们(这是 nil,因为 statement 还没有被初始化(我们只是在毕竟初始化它)和未初始化的变量在 Ruby 中计算为 nil)作为参数传递变量 environment 的内容(对于同样的原因)。

您永远不会调用您定义的方法,因为它们被您创建的两个同名变量覆盖。

how could I solve it?

您已经做到了:第一段代码有效。