Печать массива в рубине

Я пытаюсь напечатать этот массив в Ruby. Выход, который я получаю, составляет 3 строки:

#Lod: 0x0000000002690170>

Если я использую проверку, я получаю ее так:

@lodnr = "10000", @lobnr = "150" и так далее.

Здесь мой код

class Lod
attr_accessor :lodnr
attr_accessor :lobnr
attr_accessor :stknr
def initialize(lodnr, lobnr, stknr) @lodnr = lodnr @lobnr = lobnr @stknr = stknr.chomp
end
$sold = Array.new
input = File.open("lodsedler.txt", "r")
input.each do |line| l = line.split(',') $sold << Lod.new(l[0], l[1], l[2])
end
puts $sold
end

Входной файл выглядит так:

10000, 150, 5
500, 10, 1
8000, 171, 3
2 ответа

Если вы попробуете p $sold вы можете увидеть больше проблем.

В результате

[#<lod:0x26d8fa0 @lodnr="10000" ,="" @lobnr=" 150" @stknr=" 5">, #<lod:0x26d8ee0 @lodnr="500" ,="" @lobnr=" 10" @stknr=" 1">, #<lod:0x26d8e20 @lodnr="8000" ,="" @lobnr=" 171" @stknr=" 3">]
</lod:0x26d8e20></lod:0x26d8ee0></lod:0x26d8fa0>

Вы получаете массив из трех объектов LOD.

Для объектов Lod нет определенного выхода, поэтому они напечатаны в технической версии, которую вы видите. С помощью to_s вы можете определить свой собственный результат.

Пример:

class Lod attr_accessor :lodnr attr_accessor :lobnr attr_accessor :stknr def initialize(lodnr, lobnr, stknr) @lodnr = lodnr @lobnr = lobnr @stknr = stknr.chomp end def to_s "<lod %8s,="" %5s,="" %3s="">" % [@lodnr, @lobnr, @stknr] end def inspect; to_s; end
end
$sold = Array.new
DATA.each do |line| l = line.split(',') $sold << Lod.new(l[0], l[1], l[2])
end
p $sold
puts $sold
__END__
10000, 150, 5
500, 10, 1
8000, 171, 3
</lod>

Выход:

[<lod 5="" 10000,="" 150,="">, <lod 1="" 500,="" 10,="">, <lod 3="" 8000,="" 171,="">]
<lod 5="" 10000,="" 150,="">
<lod 1="" 500,="" 10,="">
<lod 3="" 8000,="" 171,="">
</lod></lod></lod></lod></lod></lod>

Вы можете адаптировать метод to_s для вашего предпочтительного вывода.

Некоторые замечания:

  • Вы написали свое основное кодирование (прочитать файл, создать глобальные данные...) внутри класса. Это плохое кодирование.
  • Если вам нужен код внутри класса, вы можете использовать переменные класса вместо глобальной переменной.
  • Я заменил внешний файл на __END__ и DATA. (упрощает создание MWE)
  • В зависимости от версии ruby выход отличается (есть изменения, как записываются массивы).


Добавить to_s в класс Lod:

class Lod def to_s "#{@lodnr} #{@lobnr} #{@stknr}" end
end

licensed under cc by-sa 3.0 with attribution.