সেখানে কোন পার্থক্য আছে কী p
এবং puts
রুবি মধ্যে?
সেখানে কোন পার্থক্য আছে কী p
এবং puts
রুবি মধ্যে?
উত্তর:
p foo
কপি করে প্রিন্ট foo.inspect
, একটি newline দ্বারা অনুসরণ অর্থাৎ মান ছাপে inspect
পরিবর্তে to_s
, যা ডিবাগ করার জন্য অধিক উপযুক্ত (কারণ আপনি যেমন মধ্যে পার্থক্য বলতে পারেন 1
, "1"
এবং "2\b1"
, যা আপনি যখন ছাড়া হয় না মুদ্রণ করতে পারেন inspect
)।
p
অবজেক্টের মান প্রদান করে, যখন puts
তা দেয় না। 1.9.3p125 :002 > (p "foo").class "foo" => String 1.9.3p125 :003 > (puts "foo").class foo => NilClass
to_s
হ'ল রুবীর স্ট্যান্ডার্ড টু-স্ট্রিং পদ্ধতি। inspect
। যেমনটি আমি বলেছি, স্ট্রিং পদ্ধতির বিকল্প, যা ডিবাগিংয়ের জন্য আরও উপযুক্ত একটি আউটপুট উত্পাদন করে। ডিবাগিংয়ের সমাপ্তির পরে আপনার স্পষ্টতই আপনার ডিবাগিং বিবৃতিগুলি সরিয়ে ফেলা উচিত (বা আরও গুরুতর প্রকল্পের জন্য আপনার সম্ভবত একটি লগিং ফ্রেমওয়ার্ক ব্যবহার করা উচিত এবং ডিবাগিংয়ের জন্য পি বা পুটগুলি ব্যবহার করা উচিত নয়)। p
বস্তুটি প্রত্যাবর্তনের বিষয়টি বেশিরভাগ পরিস্থিতিতে অপ্রাসঙ্গিক বলে মনে হয় (এবং আমি বিশ্বাস করি যে এটি হওয়ার আগে আমি এই উত্তর দিয়েছিলাম)। আউটপুট পার্থক্য হ'ল মূল পার্থক্য (এবং একমাত্র ব্যবহৃত হত)।
এটি লক্ষ করাও গুরুত্বপূর্ণ যে 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
কল থেকে অনুসরণ করে , তবে বাস্তবে এটি সুস্পষ্ট নয়।
p foo
হিসাবে একই puts foo.inspect
puts
ফিরে আসে । nil
foo
p
puts foo.inspect; foo
(-> {p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
। অনেকগুলি আপোভেটস এটিকে একটি ভাল উত্তর দেয় না!
উপরের উত্তরগুলি ছাড়াও, কনসোল আউটপুটে একটি সূক্ষ্ম পার্থক্য রয়েছে - যথা উল্টো কমা / উদ্ধৃতি চিহ্নের উপস্থিতি / অনুপস্থিতি - যা দরকারী হতে পারে:
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.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
এই 2 সমান:
p "Hello World"
puts "Hello World".inspect
( পরিদর্শন টি_এস পদ্ধতির তুলনায় অবজেক্টটির আরও আক্ষরিক দৃষ্টিভঙ্গি দেয় )
(->{p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
এটি কী পার্থক্যগুলির মধ্যে একটি চিত্রিত করতে পারে যা এটি যা 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)