Ruby'de pve putsRuby arasında herhangi bir fark var mı ?
Ruby'de pve putsRuby arasında herhangi bir fark var mı ?
Yanıtlar:
p foobaskılar foo.inspect, bir yeni satır ardından bu değerini yazar yani inspectyerine to_s(eğer örneğin arasındaki farkı nedeniyle ayıklama için daha uygundur, 1, "1"ve "2\b1"olmadan baskı yapmadığı zaman, hangi inspect).
pise de, nesnesinin değerini geri putsdeğildir. 1.9.3p125 :002 > (p "foo").class "foo" => String 1.9.3p125 :003 > (puts "foo").class foo => NilClass
to_s, Ruby'de standart dize yöntemidir. inspect. Dediğim gibi, hata ayıklama için daha uygun bir çıktı üreten bir dize yöntemidir. Hata ayıklamayı tamamladıktan sonra hata ayıklama ifadelerinizi açıkça kaldırmalısınız (veya daha ciddi projeler için muhtemelen bir günlük kaydı çerçevesi kullanmalı ve hata ayıklama için p veya puts kullanmamalısınız). pNesneyi döndüren gerçeği çoğu durumda ilgisiz görünüyor (ve bence bu cevabı durumdan önce verdim). Çıktıdaki fark ana farktır (ve eskiden tek olan).
p foo aynıdır puts foo.inspect
putsdöner nil, yerine fooyaptığı gibi p.
puts foo.inspect; foo
(-> {p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call ) . Birçok upvotes bunu iyi bir cevap DEĞİLDİR!
Yukarıdaki cevaplara ek olarak, konsol çıktısında ince bir fark vardır - yani, virgül / tırnak işaretlerinin varlığı / yokluğu - yararlı olabilir:
p "+++++"
>> "+++++"
puts "====="
>> =====
Basit bir ilerleme çubuğu yapmak istiyorsanız ben onların yakın akrabası kullanarak, bu yararlı bulmak, baskı :
array = [lots of objects to be processed]
array.size
>> 20
Bu% 100 ilerleme çubuğu verir:
puts "*" * array.size
>> ********************
Ve bu her yinelemeye artımlı * ekler:
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
>> ******
Gönderen yakut-2.4.1 belgesinde
puts(obj, ...) → nilBelirtilen nesneleri ios'a yazar. Önceden bir satırsonu dizisiyle bitmeyen herhangi bir satırdan sonra bir satırsonu yazar . Nil döndürür .
Akış yazmak için açılmalıdır. Dizi bağımsız değişkeniyle çağrılırsa , her öğeyi yeni bir satıra yazar . Dize veya dizi olmayan her bir nesne,
to_syöntemi çağrılarak dönüştürülür . Bağımsız değişken olmadan çağrılırsa, tek bir satırsonu verir.
hadi irb'de deneyelim
# 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
Her nesne için doğrudanobj.inspectprogramın standart çıktısına bir satırsonu yazar .
irb'de
# 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
Bu 2 eşittir:
p "Hello World"
puts "Hello World".inspect
( inspect , nesnenin to_s yöntemine kıyasla daha gerçek bir görünümünü verir )
(->{p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
Bu, anahtar farklılıklardan birini gösterebilir, yani pkendisine iletilen değerin değerini döndürür, burada putsdöndürür 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']
Karşılaştırma göstergeleri putsdaha yavaş
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)