p বনাম রাখে রুবিতে


270

সেখানে কোন পার্থক্য আছে কী pএবং putsরুবি মধ্যে?

উত্তর:


334

p fooকপি করে প্রিন্ট foo.inspect, একটি newline দ্বারা অনুসরণ অর্থাৎ মান ছাপে inspectপরিবর্তে to_s, যা ডিবাগ করার জন্য অধিক উপযুক্ত (কারণ আপনি যেমন মধ্যে পার্থক্য বলতে পারেন 1, "1"এবং "2\b1", যা আপনি যখন ছাড়া হয় না মুদ্রণ করতে পারেন inspect)।


7
হাঁ, পি (এবং রাখে) কার্নেল মডিউলে উভয় যাতে আপনি বিস্তারিত জানতে এখানে দেখতে পারেন: ruby-doc.org/core/classes/Kernel.html#M005961
mikej

17
নোট করুন যে pঅবজেক্টের মান প্রদান করে, যখন putsতা দেয় না। 1.9.3p125 :002 > (p "foo").class "foo" => String 1.9.3p125 :003 > (puts "foo").class foo => NilClass
ড্যারেন চেং

2
"রুবি পি বনাম পুটস বনাম প্রিন্ট" শিরোনামে গ্যারেথ রিস তার পোস্টে দুর্দান্ত সংক্ষিপ্তসার সরবরাহ করেছেন ।
আলেকজান্দারসিংলেটন

কিন্ডা মনে হচ্ছে এটি আমাকে প্রশ্নের খরগোশের ছিদ্র দিয়ে ফেলেছে। কী পরিদর্শন করবেন? কি? কেন আমি ভেরিয়েবলের পরিবর্তে মুদ্রিত পাঠ্যটি পরীক্ষা করতে চাই? আপনার ডিবাগিং, পি বা পুটসের উল্লেখের কারণে প্রোগ্রামিং জগতের জন্য কোনটি আরও বেশি প্রমিত? সমস্ত "পি" কে ডিবাগিং শেষ হওয়ার পরে "পুটস" দিয়ে প্রতিস্থাপন করা উচিত ?? আমি উপরের মন্তব্যে দেখছি, যে পি একটি বস্তুটি ফিরিয়ে দেয়, যা একটি বিশাল পার্থক্য। আমি নিশ্চিত না যে যদি এই উত্তরটি সম্পূর্ণ হয় তবে এটি যদি কেবলমাত্র একটি ছোট পার্থক্য উল্লেখ করে যা আরও বড় প্রশ্নগুলির দিকে পরিচালিত করে যা এখনও ধরণের মূল প্রশ্নের উত্তর দেয়।

1
@ আরোনলফটেন to_sহ'ল রুবীর স্ট্যান্ডার্ড টু-স্ট্রিং পদ্ধতি। inspect। যেমনটি আমি বলেছি, স্ট্রিং পদ্ধতির বিকল্প, যা ডিবাগিংয়ের জন্য আরও উপযুক্ত একটি আউটপুট উত্পাদন করে। ডিবাগিংয়ের সমাপ্তির পরে আপনার স্পষ্টতই আপনার ডিবাগিং বিবৃতিগুলি সরিয়ে ফেলা উচিত (বা আরও গুরুতর প্রকল্পের জন্য আপনার সম্ভবত একটি লগিং ফ্রেমওয়ার্ক ব্যবহার করা উচিত এবং ডিবাগিংয়ের জন্য পি বা পুটগুলি ব্যবহার করা উচিত নয়)। pবস্তুটি প্রত্যাবর্তনের বিষয়টি বেশিরভাগ পরিস্থিতিতে অপ্রাসঙ্গিক বলে মনে হয় (এবং আমি বিশ্বাস করি যে এটি হওয়ার আগে আমি এই উত্তর দিয়েছিলাম)। আউটপুট পার্থক্য হ'ল মূল পার্থক্য (এবং একমাত্র ব্যবহৃত হত)।
sepp2k

54

এটি লক্ষ করাও গুরুত্বপূর্ণ যে putsএকটি শ্রেণীর to_sসংজ্ঞা দেওয়া হয়েছে, যা "প্রতিক্রিয়া" pকরে। উদাহরণ স্বরূপ:

class T
   def initialize(i)
      @i = i
   end
   def to_s
      @i.to_s
   end
end

t = T.new 42
puts t   => 42
p t      => #<T:0xb7ecc8b0 @i=42>

এটি সরাসরি .inspectকল থেকে অনুসরণ করে , তবে বাস্তবে এটি সুস্পষ্ট নয়।


37

p foo হিসাবে একই puts foo.inspect


4
কিন্তু পরিবর্তে, পরিবর্তে putsফিরে আসে । nilfoop
ribamar

10
ওইটা ভুল. এটি একই রকমputs foo.inspect; foo
এরিক ডুমিনিল

এটি প্রমাণ করে যে আপনার উত্তরটি ভুল (-> {p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call ) । অনেকগুলি আপোভেটস এটিকে একটি ভাল উত্তর দেয় না!
lacostenycoder

3

উপরের উত্তরগুলি ছাড়াও, কনসোল আউটপুটে একটি সূক্ষ্ম পার্থক্য রয়েছে - যথা উল্টো কমা / উদ্ধৃতি চিহ্নের উপস্থিতি / অনুপস্থিতি - যা দরকারী হতে পারে:

p "+++++"
>> "+++++"

puts "====="
>> =====

আপনি যদি তাদের নিকটাত্মীয়, প্রিন্ট ব্যবহার করে একটি সাধারণ অগ্রগতি বার তৈরি করতে চান তবে আমি এটি দরকারী বলে মনে করি :

array = [lots of objects to be processed]
array.size
>> 20

এটি 100% অগ্রগতি বার দেয়:

puts "*" * array.size
>> ********************

এবং এটি প্রতিটি পুনরাবৃত্তিতে একটি বর্ধিত * যুক্ত করে:

array.each do |obj|
   print "*"
   obj.some_long_executing_process
end

# This increments nicely to give the dev some indication of progress / time until completion
>> ******

2

থেকে রুবি-2.4.1 নথির

রাখে

puts(obj, ...) → nil

আইওএসকে প্রদত্ত বস্তু (গুলি) লিখেছেন। ইতিমধ্যে একটি নতুন লাইন ক্রম দিয়ে শেষ হয় না যে কোনও পরে একটি নতুন লাইন লিখেছেন । রিটার্নস Nil

স্ট্রিমটি অবশ্যই লেখার জন্য খুলতে হবে। যদি অ্যারে আর্গুমেন্টের সাথে ডাকা হয় , প্রতিটি উপাদানকে একটি নতুন লাইনে লিখুন। স্ট্রিং বা অ্যারে নয় এমন প্রতিটি প্রদত্ত বস্তু তার to_s পদ্ধতিটি কল করে রূপান্তরিত হবে । যদি আর্গুমেন্ট ছাড়াই ডাকা হয় তবে একটি নতুন লাইনের আউটপুট দেয়।

আসুন এটি চেষ্টা করি

# always newline in the end 
>> puts # no arguments

=> nil # return nil and writes a newline
>> puts "sss\nsss\n" # newline in string
sss
sss
=> nil
>> puts "sss\nsss" # no newline in string
sss
sss
=> nil

# for multiple arguments and array
>> puts "a", "b"
a
b
=> nil
>> puts "a", "b", ["c", "d"]
a
b
c
d
=> nil

পি

p(obj) → obj click to toggle source
p(obj1, obj2, ...) → [obj, ...] p() → nil
প্রতিটি বস্তুর জন্য, সরাসরি obj.inspectপ্রোগ্রামের স্ট্যান্ডার্ড আউটপুটে একটি নতুন লাইন অনুসরণ করে।

আইআরবি মধ্যে

# no arguments
>> p
=> nil # return nil, writes nothing
# one arguments
>> p "sss\nsss\n" 
"sss\nsss\n"
=> "aaa\naaa\n"
# multiple arguments and array
>> p "a", "b"
"a"
"b"
=> ["a", "b"] # return a array
>> p "a", "b", ["c", "d"]
"a"
"b"
["c", "d"]
=> ["a", "b", ["c", "d"]] # return a nested array

0

এই 2 সমান:

p "Hello World"  
puts "Hello World".inspect

( পরিদর্শন টি_এস পদ্ধতির তুলনায় অবজেক্টটির আরও আক্ষরিক দৃষ্টিভঙ্গি দেয় )


তারা সমান বলে মনে হয়, তবে তারা তা নয়। এটি ব্যবহার করে দেখুন:(->{p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
lacostenycoder

0

এটি কী পার্থক্যগুলির মধ্যে একটি চিত্রিত করতে পারে যা এটি যা pপাস করে তার মান দেয় যেখানে putsফিরে আসে nil

def foo_puts
  arr = ['foo', 'bar']
  puts arr
end

def foo_p
  arr = ['foo', 'bar']
  p arr
end

a = foo_puts
=>nil
a
=>nil

b = foo_p
=>['foo', 'bar']
b
['foo', 'bar']

বেঞ্চমার্ক শো putsধীর

require 'benchmark'
str = [*'a'..'z']
str = str*100
res = Benchmark.bm do |x|
  x.report(:a) { 10.times {p str} }
  x.report(:b) { 10.times {puts str} }
end
puts "#{"\n"*10}"
puts res

0.010000   0.000000   0.010000 (  0.047310)
0.140000   0.090000   0.230000 (  0.318393)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.