> 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 Typically, methods like `succ` don't change the state of an object, but instead return a new object. Example: i=1 i.succ # returns 2, but the return value is discarded... i # i=>1 , i is still 1 x=i.succ i # i=>1, i is STILL 1 x # x=>2 , method returned 2 Another example, if you sort an Array using `sort`, a new, sorted array is returned and the original array is left unsorted. arr = [5,4,3,2,1] arr_sorted = arr.sort arr_sorted # [1,2,3,4,5] arr # [5,4,3,2,1] still unsorted Methods that behave like this often have a counterpart that does it's work in place. Those method's names end with an exclamation point: `sort!` arr = [5,4,3,2,1] arr.sort! arr # [1,2,3,4,5] So for the above example, you have 2 options: vu = VU.new(1) vu = vu.succ or, implement an `succ!` method, that changes the volume in place. ... def succ! raise(IndexError, "Volume too big") if @volume >= 9 @volume+=1 end ... Then you can just call `vu.succ!` -tim