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

我遵循Understanding Computation的第2章构建一个简单的Ruby解释器:

在Class Assign之后的某个时刻,定义了VariableNumber (我认为这实际上是不相关的),我在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>语句,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>语句,environment = statement.reduce(environment)

NoMethodError:undefined方法reduce nil:来自(irb)的NilClass:来自/ usr / bin / irb的1:12:在<main>

我不知道该错误是否在我声明statementenvironment

我怎么能在.rb文件中声明变量?

我检查了这个问题, @variable_name似乎不适用于非字符串变量。


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

变量是这样定义的:

name_of_var = initialization_expression

方法是这样定义的:

def name_of_method(parameter_one, parameter_two)
  body_expression
end

我不知道该错误是否在我声明statementenvironment

是。

这是发生的事情:

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的内容(因为同样的原因也是nil )。

你永远不会调用你定义的方法,因为它们被你用相同名称创建的两个变量所影响。

我怎么能解决它?

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

链接地址: http://www.djcxy.com/p/95421.html

上一篇: Declaring variables in .rb file result unwanted output

下一篇: How to format duration ISO 8601 (PT45S)