Print ve puts arasındaki fark nedir?


Yanıtlar:


377

puts henüz bir bağımsız değişken yoksa, her bir bağımsız değişkenin sonuna yeni bir satır ekler.

print yeni bir satır eklemez.


Örneğin:

puts [[1,2,3], [4,5,nil]] Dönecekti:

1
2
3
4
5

Oysa print [[1,2,3], [4,5,nil]] dönecekti:

[[1,2,3], [4,5, sıfır]]
Yazdırma işleminin koyarken nil değerini nasıl vermediğine dikkat edin.

88
Aslında, her argümandan sonra bir satırsonu. Bu önemli bir nokta ve Ruby belgelerinden net değil (örneğin sadece 1 argümanı olduğu için).
cdunn2001

3
Başka bir şey daha var ... dizi sınıfını genişletmek ve to_s yöntemini geçersiz kılmak. koyar, yeni sınıfınızdaki bir nesne için yeni to_s
işlevini

1
irb 0.9.5 puts ("a") ve puts ("a \ n") kullanarak REPL'de tam olarak aynı çıktı bulunur.
Marcus Junius Brutus

@ kapv89 Bu doğru değil: Ben sadece denedim ve her ikisi de e baskı to_s yöntemini kullanır koyar. Sadece p kullanmaz.
collimarco

6
@Fronker, bu hala sadece bir argüman. Derleyici bitişik dizeleri birleştirir.
cdunn2001

61

Büyük bir fark, dizileri görüntülemenizdir. Özellikle NIL'li olanlar. Örneğin:

print [nil, 1, 2]

verir

[nil, 1, 2]

fakat

puts [nil, 1, 2]

verir

1
2

Not, hiçbir görünür öğe (sadece boş bir satır) ve farklı bir satırdaki her öğe.


1
Bugün beni buraya getiren bunu fark ettim. Bunun üzerine düşünmeyi bilmek isterim. Böyle dizileri işlemek için özel bir durum gibi görünüyor. Gerekçenin ne olduğunu merak ediyorum ... Sadece diğer dillere benzer mi?
Dan Barron

Koymalar yeni bir satırla çıkacağından mantıklıdır, böylece diziyi nil
yineliyor

42

printher argümanı, ardından $,, ile $stdout, ardından da çıktılar $\. Eşdeğerdirargs.join($,) + $\

putsher ikisini de $,ve $\"\ n" olarak ayarlar ve sonra aynı şeyi yapar print. Temel fark, her argümanın yeni bir satır olmasıdır puts.

Bu require 'english'global değişkenlere kullanıcı dostu adlarla erişebilirsiniz .


englishlib güzel ipucu
lacostenycoder

18

API dokümanları bazı iyi ipuçları verir:

print() → nil

print(obj, ...) → nil

Verilen nesne (ler) yazar IOS . İade nil.

Akış yazmak için açılmalıdır. Dize olmayan belirli bir nesne, to_syöntemi çağrılarak dönüştürülür . Bağımsız değişken olmadan çağrıldığında, içeriğini yazdırır $_.

Çıktı alanı ayırıcısı ( $,) değilse nil, nesneler arasına yerleştirilir. Çıkış kayıt ayırıcısı ( $\) değilse nil, çıktıya eklenir.

...

puts(obj, ...) → nil

Verilen nesne (ler) yazar IOS . Önceden bir satırsonu dizisiyle bitmeyen herhangi bir satırdan sonra bir satırsonu yazar. İade nil.

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.

Yukarıda verilen noktalar ile biraz deneme yaparak, farklılıklar şöyle görünmektedir:

  • Birden çok argümanla çağrıldığında, printbunları 'çıkış alanı ayırıcısı' ile ayırır $,(varsayılan olarak hiçbir şey varsayılan değildir) putsve satırsonu satırlarıyla ayırır. putsayrıca son argümandan sonra yeni bir satır koyar, oysa printbunu yapmaz.

    2.1.3 :001 > print 'hello', 'world'
    helloworld => nil 
    2.1.3 :002 > puts 'hello', 'world'
    hello
    world
     => nil
    2.1.3 :003 > $, = 'fanodd'
     => "fanodd" 
    2.1.3 :004 > print 'hello', 'world'
    hellofanoddworld => nil 
    2.1.3 :005 > puts 'hello', 'world'
    hello
    world
     => nil
  • puts dizileri otomatik olarak açarken print şunları yapmaz:

    2.1.3: 001>  baskı [1, [2, 3]], [4]
    [1, [2, 3]] [4] => sıfır 
    2.1.3: 002>  [1, [2, 3]], [4]
    1
    2
    3
    4
     => sıfır
  • printbağımsız değişken olmadan yazdırılır $_(okunan son şey gets), putsyeni satır yazdırır:

    2.1.3 :001 > gets
    hello world
     => "hello world\n" 
    2.1.3 :002 > puts
    
     => nil 
    2.1.3 :003 > print
    hello world
     => nil
  • printbu değişkeni yok sayarken çıktı kaydı ayırıcısını $\her ne yazdırırsa yazar puts:

    mark@lunchbox:~$ irb
    2.1.3 :001 > $\ = 'MOOOOOOO!'
     => "MOOOOOOO!" 
    2.1.3 :002 > puts "Oink! Baa! Cluck! "
    Oink! Baa! Cluck! 
     => nil 
    2.1.3 :003 > print "Oink! Baa! Cluck! "
    Oink! Baa! Cluck! MOOOOOOO! => nil

4

putsto_sher bağımsız değişkenin çağrısını yapar ve yeni bir satırla bitmezse, her dizeye yeni bir satır ekler. printsadece her argümanı çağırarak çıktılar to_s.

örneğin puts "one two":: one two

{Yeni hat}

puts "one two\n": one two

{new line} #puts, dize yeni bir satırla bittiği için sonuca yeni bir satır eklemeyecek

print "one two": one two

print "one two\n": one two

{Yeni hat}

Ve çıktı almanın başka bir yolu var: p

Her nesne için, programın standart çıktısına doğrudan obj.inspect ve ardından bir yeni satır yazar.

Hata ayıklama iletisinin çıktısını almak yararlıdır. p "aa\n\t":aa\n\t


-1

Dizeyi kullanarak dizede çıktı putsalmak isterseniz, kullandığınız sonuçla aynı sonucu elde edersiniz print:

puts "#{[0, 1, nil]}":
[0, 1, nil]

Ancak alıntılanan bir dizeyle kalmıyorsa, evet. Tek fark kullandığımız zaman yeni hat arasında puts.


1
İki nedenden dolayı -1. İlk olarak, netlik eksikliği: Burada ilk "Ama ..." ın neyi takip etmeyi amaçladığını anlamıyorum, ne de son paragraftaki "evet" in neye cevap verdiğini anlamıyorum. İkincisi, doğruluk eksikliği için: örnek kodunuz printfyerine kullanmanın putsaynı sonucu vereceğini söylersiniz , ama aslında vermez. putsVaryant sonunda bir yeni satır ekler ederken printfdeğildir önemlidir, sadece dize yansıtılmadan hiçbir dizi var vaka gibi. (Mutlaka böyle, çünkü dize hazır bilgisi değerlendirilirken enterpolasyon gerçekleşir.)
Mark Amery

Aha! Diğer cevapları okuduktan sonra anlıyorum - bunun stackoverflow.com/a/14534145/1709587 adresine bir yanıt olmasını istediniz mi? Her halükarda, gerçekten kendi başına bir cevap vermez.
Mark Amery
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.