[ruby-list:50828] クラスや構造体に対する print の挙動
From:
大田黒 俊夫 <toshio.otaguro@...>
Date:
2019-09-28 10:36:07 UTC
List:
ruby-list #50828
以下のようにクラスと構造体を定義し,インスタンスを配列の要素として配置します.その配列を 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"
# ----------
以上,よろしくお願いいたします.
俊(とし)