なぜこれを行うRuby=同じことをするように見えるto_s
メソッドとinspect
メソッドの両方をオブジェクト化するのですか?]
p
メソッドはinspect
を呼び出し、puts/printはオブジェクトを表すためにto_s
を呼び出します。
走ったら
class Graph
def initialize
@nodeArray = Array.new
@wireArray = Array.new
end
def to_s # called with print / puts
"Graph : #{@nodeArray.size}"
end
def inspect # called with p
"G"
end
end
if __FILE__ == $0
gr = Graph.new
p gr
print gr
puts gr
end
私は得る
G
Graph : 0
Graph : 0
to_s
とinspect
の違いは何ですか?puts
、print
、およびp
の違いは何ですか?to_s
またはinspect
関数をコメントアウトすると、次のようになります。
#<Graph:0x100124b88>
#<Graph:0x100124b88>
inspect
はデバッグに使用され、to_s
エンドユーザーまたは表示用。
例えば、 [1,2,3].to_s
および[1,2,3].inspect
は異なる出力を生成します。
inspect
は、デフォルトで、クラス名、インスタンスのobject_id
、およびインスタンスのインスタンス変数をリストします。
print
とputs
は、オブジェクトのto_s
メソッドをSTDOUT
に。 Rubyのドキュメントで示されているように、 Object#to_s
は、オブジェクトを表す文字列を返します。エンドユーザーが読みやすくするために使用されます。
print
とputs
は、puts
が自動的に改行を追加するのに対し、print
は追加しないことを除いて、互いに同一です。
Pythonと比較するには、to_s
のようなものです __str__
とinspect
は__repr__
。 to_s
は文字列を提供しますが、inspect
はオブジェクトの文字列表現を提供します。必要に応じて、後者を使用してオブジェクトを構築できます。
さらに、to_str
メソッド。特定のオブジェクトで、文字列表現だけでなく、文字列のようなオブジェクトが必要な場合に呼び出します。 (IRBでお試しください:[1,2,3].to_str
失敗しますが、_[1,2,3].to_s
はしません。)以前に噛まれたことがあるので、これについて言及する必要があると思います:)
Ruby Koans で始めた後にここに到着した人には、to_s
とinspect
の出力の違いは次のとおりです。
nil.to_s # will yield an empty string, ie ""
nil.inspect # will yield the string "nil"
puts
は通常、オブジェクトにto_s
を適用した結果を出力しますが、p
はオブジェクトをinspect
ingした結果を出力します。
inspect
とto_s
には微妙な違いがあります:
inspect
は、オブジェクトに適用されると、インスタンス変数とともにオブジェクトの16進コードを返しますto_s
は、オブジェクトに適用されると、オブジェクトの16進コードのみを返します
class Item def initialize(abc) @ abc = abc end end x = Item.new(22 ) puts x #printsオブジェクトx hexコード puts x.inspect #prints object x hexコードWITH INSTANCE VARIABLE @abc puts x.to_s #printsオブジェクトx 16進コード px#インスタンス変数@abc p x.inspect#オブジェクトx 16進コードをインスタンス変数@abc [.____で印刷します。 ] p x.to_s#オブジェクトx 16進コードを印刷
Chris PineのLearn To Programブックからの回答
「inspectメソッドはto_sによく似ていますが、返される文字列は、渡したオブジェクトをビルドするためのRubyコードを表示しようとします。]
したがって、inspectメソッドは、たとえば次のような配列を返します...
[25, 16, 9, 4, 1, 0]
As ass/to_sが戻る場所
25
16
9
4
1
0
2.0.0p195 :075 > puts (1..5).to_a # Put an array as a string.
1
2
3
4
5
=> nil
2.0.0p195 :076 > puts (1..5).to_a.inspect # Put a literal array.
[1, 2, 3, 4, 5]
=> nil
2.0.0p195 :077 > puts :name, :name.inspect
name
:name
=> nil
2.0.0p195 :078 > puts "It worked!", "It worked!".inspect
It worked!
"It worked!"
=> nil
2.0.0p195 :079 > p :name # Same as 'puts :name.inspect'
:name
=> :name
Railsチュートリアル から
「to_s」と「inspect」の違いと「puts」と「p」の違いを説明する詳細と例については、次のリンクを参照してください。 https://rubymonk.com/learning/books/4-Ruby-primer-ascent/chapters/45-more-classes/lessons/108-displaying-objects