58


11

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

この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_s」と「inspect」の違いは?

  • そして、「puts」、「print」、「p」の違いは何ですか?

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

#
#

9 Answer


48


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

たとえば、 [1,2,3] .to_s`と [1,2,3] .inspect`は異なる出力を生成します。


31


inspect`は、デフォルトでクラス名、インスタンスの object_id`を通知し、インスタンスのインスタンス変数をリストするメソッドです。

ご存知のように、オブジェクトの to_s`メソッドの値を STDOUT`に入れるために、 print`と puts`が使用されます。 Rubyのドキュメントに示されているように、http://ruby-doc.org/core/classes/Object.html#M000359 [Object#to_s]はオブジェクトを表す文字列を返します。これは、エンドユーザーが読みやすくするために使用されます。

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


13


Pythonと比較すると、 to_s`は str`に似ており、 inspect`は repr`に似ています。 「to_s」は文字列を提供し、「inspect」はオブジェクトの文字列表現を提供します。 必要に応じて、後者を使用してオブジェクトを構築できます。


5


さらに、特定のオブジェクトには to_str`メソッドがあります。これは、文字列表現だけでなく、文字列のようなオブジェクトが必要なときに呼び出します。 (IRBで試してみてください。[1,2,3] .to_str`は失敗しますが、 `[1,2,3] .to_s`は失敗しません。)それの前に:)


3


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

inspect`と to_s`には微妙な違いがあります:

  • `inspect`は、オブジェクトに適用されると、オブジェクトの16進コードを返します インスタンス変数とともに

  • `to_s`は、オブジェクトに適用されると、オブジェクトの16進コードのみを返します

    class Item
     def initialize(abc)
      @abc=abc
     end
    end
    
    x= Item.new(22)
    
    puts x         #prints object x hex code
    puts x.inspect #prints object x hex code WITH INSTANCE VARIABLE @abc
    puts x.to_s    #prints object x hex code
    
    p x            #prints object x hex code WITH INSTANCE VARIABLE @abc
    p x.inspect    #prints object x hex code WITH INSTANCE VARIABLE @abc
    p x.to_s       #prints object x hex code


3


Ruby Koansで始めた後にここに到着した人にとって、 to_s`と inspect`の出力が異なる単純な例は次のとおりです。

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


1


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


1


Chris PineのLearn To Programブックからの回答

「inspectメソッドはto_sによく似ていますが、返される文字列は、渡したオブジェクトを構築するためのルビーコードを表示しようとする点が異なります。」

したがって、inspectメソッドは次のような配列を返します…​

[25, 16, 9, 4, 1, 0]

as ass / to_sが戻る場所

25
16
9
4
1
0


0


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