在 .rb 文件中声明变量会导致不需要的输出
Declaring variables in .rb file result unwanted output
我正在跟随 chapter 2 of Understanding Computation 构建一个简单的 Ruby 解释器:
在ClassAssign
、Variable
和Number
定义之后的某个时刻(我认为这实际上是不相关的),我在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
文件中声明 statement
和 environment
时:
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
这里定义了两个方法,statement
和environment
。他们做什么实际上是无关紧要的,因为你永远不会打电话给他们。
statement, environment = statement.reduce(environment)
在这里,您声明了两个变量,statement
和 environment
。您通过对变量 statement
的内容调用 reduce
来初始化它们(这是 nil
,因为 statement
还没有被初始化(我们只是在毕竟初始化它)和未初始化的变量在 Ruby 中计算为 nil
)作为参数传递变量 environment
的内容(对于同样的原因)。
您永远不会调用您定义的方法,因为它们被您创建的两个同名变量覆盖。
how could I solve it?
您已经做到了:第一段代码有效。
我正在跟随 chapter 2 of Understanding Computation 构建一个简单的 Ruby 解释器:
在ClassAssign
、Variable
和Number
定义之后的某个时刻(我认为这实际上是不相关的),我在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
文件中声明 statement
和 environment
时:
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
orenvironment
是的。
事情是这样的:
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
。您通过对变量 statement
的内容调用 reduce
来初始化它们(这是 nil
,因为 statement
还没有被初始化(我们只是在毕竟初始化它)和未初始化的变量在 Ruby 中计算为 nil
)作为参数传递变量 environment
的内容(对于同样的原因)。
您永远不会调用您定义的方法,因为它们被您创建的两个同名变量覆盖。
how could I solve it?
您已经做到了:第一段代码有效。