[ruby-list:50826] クラスや構造体に対する Kernel.#print について

From: 大田黒 俊夫 <toshio.otaguro@...>
Date: 2019-09-27 23:56:02 UTC
List: ruby-list #50826
以下のようなクラスと構造体を定義し,インスタンスを配列の要素として配置します.その配列を print で出力する場合,配列の要素が暗黙のうちに
to_s で文字列に変換されて出力されると思っていたのですが,どうやら p と同様に inspect で変換されているようです.

自前の inspect を定義しない場合もデフォルトの inspect
で出力されます.単純な配列でもネストした配列でも同様のようです.これは仕様でしょうか?なお,使用している Ruby は以下の通りです.

Ruby 2.6.4p104 (2019-08-28 revision 67798) [x64-mingw32] on WIndows 10
# ----------
class A
  attr_reader :serial, :name
  def initialize(serial, name)
    @serial = serial
    @name = name
  end
  def inspect
    "#{@serial.to_s}:#{@name}"
  end
  def to_s
    "#{@name}"
  end
end

B = Struct.new(:serial, :name) do
  def inspect
    "#{serial.to_s}:#{name}"
  end
  def to_s
    "#{name}"
  end
end

a1 = A.new(1, "a1")
a2 = A.new(2, "a2")
a3 = A.new(3, "a3")
ary_a1 = [a1, a2, a3]
ary_a2 = [a1, [a2, [a3]]]

p ary_a1            #=> [1:a1, 2:a2, 3:a3]
print ary_a1, "\n"  #=> [1:a1, 2:a2, 3:a3]
puts ary_a1         #=> "a1\na2\na3\n"
p ary_a2            #=> [1:a1, [2:a2, [3:a3]]]
print ary_a2, "\n"  #=> [1:a1, [2:a2, [3:a3]]]
puts ary_a2         #=> "a1\na2\na3\n"

b1 = B.new(1, "b1")
b2 = B.new(2, "b2")
b3 = B.new(3, "b3")
ary_b1 = [b1, b2, b3]
ary_b2 = [b1, [b2, [b3]]]

p ary_b1            #=> [1:b1, 2:b2, 3:b3]
print ary_b1, "\n"  #=> [1:b1, 2:b2, 3:b3]
puts ary_b1         #=> "b1\nb2\nb3\n"
p ary_b2            #=> [1:b1, [2:b2, [3:b3]]]
print ary_b2, "\n"  #=> [1:b1, [2:b2, [3:b3]]]
puts ary_b2         #=> "b1\nb2\nb3\n"
# ----------

以上,よろしくお願いいたします.
俊(とし)

In This Thread

Prev Next