web-dev-qa-db-ja.com

なぜこれがRubyオブジェクトにはto_sと同じことをするように見えるメソッドを検査するの両方があるのですか?

なぜこれを行う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
  • それでは、なぜRubyは2つの関数が同じことをするのですか?to_sinspectの違いは何ですか?
  • putsprint、およびpの違いは何ですか?

to_sまたはinspect関数をコメントアウトすると、次のようになります。

#<Graph:0x100124b88>
#<Graph:0x100124b88>
61
prosseek

inspectはデバッグに使用され、to_sエンドユーザーまたは表示用。

例えば、 [1,2,3].to_sおよび[1,2,3].inspectは異なる出力を生成します。

50
David

inspectは、デフォルトで、クラス名、インスタンスのobject_id、およびインスタンスのインスタンス変数をリストします。

printputsは、オブジェクトのto_sメソッドをSTDOUTに。 Rubyのドキュメントで示されているように、 Object#to_s は、オブジェクトを表す文字列を返します。エンドユーザーが読みやすくするために使用されます。

printputsは、putsが自動的に改行を追加するのに対し、printは追加しないことを除いて、互いに同一です。

32
Mark Rushakoff

Pythonと比較するには、to_s のようなものです __str__inspect__repr__to_sは文字列を提供しますが、inspectはオブジェクトの文字列表現を提供します。必要に応じて、後者を使用してオブジェクトを構築できます。

14
grokus

さらに、to_strメソッド。特定のオブジェクトで、文字列表現だけでなく、文字列のようなオブジェクトが必要な場合に呼び出します。 (IRBでお試しください:[1,2,3].to_str失敗しますが、_[1,2,3].to_sはしません。)以前に噛まれたことがあるので、これについて言及する必要があると思います:)

5
RobH

Ruby Koans で始めた後にここに到着した人には、to_sinspectの出力の違いは次のとおりです。

nil.to_s     # will yield an empty string, ie ""
nil.inspect  # will yield the string "nil"

putsは通常、オブジェクトにto_sを適用した結果を出力しますが、pはオブジェクトをinspectingした結果を出力します。

inspectto_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進コードを印刷
3
pintua

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
1
codebreeze
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チュートリアル から

1
Feuda

「to_s」と「inspect」の違いと「puts」と「p」の違いを説明する詳細と例については、次のリンクを参照してください。 https://rubymonk.com/learning/books/4-Ruby-primer-ascent/chapters/45-more-classes/lessons/108-displaying-objects

0
Gitanjali