来自O' Reilly的Understanding Computation中的Ruby类参数

时间:2015-01-15 14:13:56

标签: ruby

阅读理解O' Reilly的计算我遇到了一些问题 (我对Ruby完全不熟悉,本书的介绍是我获得的唯一Ruby知识)

在第44页上有一个例子

class Number
   def evaluate(environment)
       self
   end
end

根据本书评估Number.new(23).evaluate({})应该给23但是我得到一个错误,Number类有零参数而我正在传递一个 将类定义更改为类Number<结构(:val)有效,但没有任何反应 我改为代码后

class Number < Struct.new(:value)
  def evaluate(environment)
    environment[self] = value
    self.value = value
    value
  end
  def to_s
    print(self)
 end
end

这似乎有效,但我无法弄清楚为什么作者会开始发布非工作代码?我错过了什么吗? 如果有人读过这本书可以帮助

,那就太好了

另一个快速的问题,我如何使用irb来评估一个带有Ruby类的文件,但是保持解释器打开,这样我就可以继续..当我做irb test.rb时,它会进行评估但是然后退出.. 感谢

2 个答案:

答案 0 :(得分:1)

您需要在irb中评估先前页面中的代码块。要使'Number.new(23).evaluate({})'工作,请将下面的代码复制并粘贴到irb。

在ruby中,您可以打开现有类的类定义,并执行添加方法或更改类行为等操作。谷歌的“开放课程”了解更多细节。

class Number < Struct.new(:value)
end

class Number
  def to_s
    value.to_s
  end

  def inspect
    "«#{self}»"
  end
end

class Number
  def evaluate(environment)
    self
  end
end

要评估irb中的文件,请使用“require”。

irb > require 'number' # evaluates ./number.rb

答案 1 :(得分:0)

当使用类方法initialize构造对象时调用new方法,因此两者的arity必须匹配,默认initialize不带参数,这就是为什么你得到的错误。

class Number
  def initalize(number)
    # ...
  end
end

Number.new(1)

您问题中的代码不正确。