Przedzialy, zle odczytuje elementy

Cześć

Mam pytanie, dlaczego w linijce przedostatniej, źle wyświetla mi listę? Zastanawiam się, czy w metodzie ‘inspect’ źle w ogóle mi powiela krzyżyki. Chodzi o efekt: [####, #####, ######, #######]
Poradźcie proszę.

[code] class VU
include Comparable

attr :volume

def initialize(volume)
@volume = volume
end

def inspect
‘#’ * @volume
end

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

def succ
raise(IndexError, “Zbyt duze natezenie glosnosci”) if @volume >= 9
VU.new(@volume.succ)
end
end

medium_volume = VU.new(4)…VU.new(7)
puts medium_volume.to_a
puts medium_volume.include?(VU.new(3))[/code]

Określ proszę dokładnie co chcesz uzyskać, a co dostajesz, najlepiej na przykładowych danych :wink:

Co chcę uzyskać: [####, #####, ######, #######]
A to co dostaję: #<VU:0x78bc3b> #<VU:0x8ddc4c> #<VU:0x17a1767> #<VU:0x968fda>
Przykładowe dane to jak w kodzie powyżej: 4…7

puts medium_volume.map {|a| a.inspect}

Zakres który tworzysz nie obejmuje liczb od 4 do 7, tylko obiekty VU z parametrami od 4 do 7. Skoro więc zamieniasz zakres na tablicę, tworzysz tablicę elementów VU i to wypisujesz. Metoda inspect działa dobrze, tylko nigdzie jej nie wywoływałeś.

[code=ruby]class VU
include Comparable

attr :volume

def initialize(volume)
@volume = volume
end

def to_s
‘#’ * @volume
end

def inspect
to_s
end

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

def succ
raise(IndexError, “Zbyt duze natezenie glosnosci”) if @volume >= 9
VU.new(@volume.succ)
end
end

require ‘test/unit’

class VUTest < Test::Unit::TestCase
def test_to_s
assert (VU.new(3).to_s == “###”)
end

def test_array_of_vu_meters
meters = VU.new(3)…VU.new(5)
assert meters.to_a.inspect == “[###, ####, #####]”
end
end[/code]
u mnie to działa

[quote=Elavi]Co chcę uzyskać: [####, #####, ######, #######]
A to co dostaję: #<VU:0x78bc3b> #<VU:0x8ddc4c> #<VU:0x17a1767> #<VU:0x968fda>
Przykładowe dane to jak w kodzie powyżej: 4…7[/quote]
Jeśli dobrze pamiętam puts używa to_s do “wyświetlania” obiektu, a defaultowa implementacja tej metody zwraca #<nazwa_klasy:id_obiektu> (lub “main” w specyficznym przypadku) – to co jest u Ciebie wyświetlane. Polecam zamienić inspect na to_s (; – zgodnie z dokumentacją inspect wywołuje to_s jeśli inna implementacja nie jest dostarczona.

Wszystkim dziękuję, po prostu zmieniłam inspect na to_s i już działa. Fakt, jeszcze mi się myli kiedy jak co powinnam wyświetlać.