在红宝石中打印阵列

时间:2013-11-25 10:34:14

标签: ruby arrays

我正在尝试在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 个答案:

答案 0 :(得分: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对象的数组。

没有为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    10000,   150,   5>, <Lod      500,    10,   1>, <Lod     8000,   171,   3>]
<Lod    10000,   150,   5>
<Lod      500,    10,   1>
<Lod     8000,   171,   3>    

您可以根据首选输出调整to_s方法。

一些评论:

  • 您在课堂内编写了主要编码(读取文件,创建全局数据......)。那编码很糟糕。
  • 如果你想要类中的代码,那么你可以使用类变量而不是全局变量。
  • 我用__END__DATA替换了外部文件。 (使制作MWE更容易)
  • 根据ruby版本,输出会有所不同(有更改,如何编写数组)。

答案 1 :(得分:0)

将to_s定义添加到类Lod:

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