web-dev-qa-db-ja.com

Rubyの「p」とは何ですか?

知っている人にはばかげた質問だと思いますが、それが何をしているのか、それが何であるのかについての説明は見つかりません。

CSV.open('data.csv', 'r') do |row|
  p row
end

"p row" 行う?

44
James P. Wright

p()はカーネルメソッドです

_obj.inspect_を標準出力に書き込みます。

オブジェクトはカーネルモジュールに混在しているため、p()メソッドはどこでも使用できます。

それは、詩モードで使用するのが一般的です。つまり、括弧が削除されます。 CSVスニペットは次のように書くことができます...

_CSV.open 'data.csv', 'r' do |row|
  p row
end
_

文書化されています ここではカーネルの残りの部分 モジュール。

80
DigitalRoss

Kernel#pKernel#putsの小さなデバッグ兄弟です。ほぼ同じように機能しますが、#inspectではなく#to_sを使用して引数を変換します。

このように不可解な名前が付けられているのは、デバッグ時にすぐに式に入れて再度取り出すことができるようにするためです。 (Rubyがどんどん「適切な」デバッグサポートを提供するようになったので、今ではあまり役に立たないと思います。)

Kernel#pの代わりとなるものは、pp標準ライブラリのKernel#pp(きれいな印刷)とyaml標準ライブラリのKernel#y(YAML)です。

22
Jörg W Mittag

やってみませんか?

>> [1,2,3].each { |d| p d }
1
2
3
5
rfunduk

システムにすでにあるドキュメントのもう1つのオプションは、riコマンドです。いつでも次のように入力できます:ri pまたはpが中央のコマンドの多くの場所(定義されている)で定義されている場合は、ri Kernel.p。他の良い賭けはArray.<whatever method>またはString.<whatever method>

たくさんの宝石をインストールしてしまうと、速度が大幅に低下しますが、fastri宝石を検索して、ルックアッププロセスを信じられないほど高速化できます。

2
Chuck Vose

Kernel#pは、printとputよりもよく知られていません。

改行を追加するという点でputsに似ていますが、to_sを呼び出すのではなく、pはinspectを呼び出します。

参考文献

http://garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-Ruby/

1
Don Lee

Pとputの違いを理解するには、to_s()メソッドとinstance()メソッドの違いを理解する必要があります。

to_sはオブジェクトの文字列表現を取得するために使用されますが、 instance は、オブジェクトのコンテンツも提供するto_sのより開発者にやさしいバージョンです。

class Dog
        def initialize(name, breed)
            @name = name
            @breed = breed
        end
        def to_s
            puts  "#@name's breed is #@breed."
        end
end

terra=Dog.new("Terra","Husky")
puts terra #Terra's breed is Husky.
p terra    #<Dog:0x00007fbde0932a88 @name="Terra", @breed="Husky">  
0
Nitin A.