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

时间:2015-12-26 11:43:15

标签: ruby irb

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

在课程Assign之后的某个时刻,VariableNumber被定义(我认为这实际上是不相关的),我在 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>

我不知道错误是否在我声明statementenvironment的方式上?

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

我检查this question@variable_name似乎不能使用非字符串变量。

1 个答案:

答案 0 :(得分:1)

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

变量的定义如下:

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。您通过调用变量reducestatement的内容nil来初始化它们,因为statement尚未初始化(我们正处于毕竟,初始化它,并且在Ruby中将非本征化变量计算为nil)作为参数传递变量environment的内容(出于同样的原因也是nil)。

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

  

我该怎么解决?

你已经做过:第一段代码可以工作。