Range.to_a "Programming Ruby"中的示例



感谢您回答这个问题。这是我的第一个问题,所以感谢任何帮助/批评。我正在自己(初学者)学习免费的在线版Ruby编程:实用程序员指南,第一版。下面的例子没有按照书上说的去做(当我这么做的时候):

class VU

  include Comparable

  attr :volume

  def initialize(volume)  # 0..9
    @volume = volume
  end

  def inspect
    '#' * @volume
  end

  # Support for ranges

  def <=>(other)
    self.volume <=> other.volume
  end

  def succ
    raise(IndexError, "Volume too big") if @volume >= 9
    VU.new(@volume.succ)
  end
end

应该做以下的,根据书,在irb:

medium = VU.new(4)..VU.new(7)
medium.to_a     »   [####, #####, ######, #######]
medium.include?(VU.new(3))  »   false

但是发生在我身上的是中等的。to_a返回VU对象的数组,如下所示:

#<VU:0x9648918>                                                              
#<VU:0x96488b4>                                                              
#<VU:0x964888c>                                                              
#<VU:0x9648878>

这对我来说是有意义的(我认为)。对我来说没有意义的是,书中断言应该返回的是一个"#"数组。难道我们不需要调用inspect方法来获取这些"#"吗?

谢谢!伊恩。

这是你在irb中看到的吗?在irb的返回值上隐式调用inspect。你是正确的,数组充满VU对象,但应该显示的是inspect对这些对象的输出。

> x = VU.new(5)
=> #####
> x.class
=> VU
> x.succ
=> ######

最新更新