Jaka jest różnica między drukiem a sprzedażą?

Odpowiedzi:

377

puts dodaje nowy wiersz na końcu każdego argumentu, jeśli jeszcze go nie ma.

print nie dodaje nowej linii.


Na przykład:

puts [[1,2,3], [4,5,nil]] Wróciłbym:

1
2)
3)
4
5

Podczas gdy print [[1,2,3], [4,5,nil]] wróci:

[[1,2,3], [4,5, zero]]
Zauważ, że puts nie wyświetla wartości zerowej, podczas gdy print.
mikewilliamson
źródło
88
Właściwie nowy wiersz po każdym argumencie. Jest to kluczowa kwestia, która nie jest jednoznaczna z dokumentami Ruby (ponieważ przykład zawiera tylko 1 argument).
cdunn2001
3
Jest jeszcze jedna rzecz ... rozszerzyć klasę tablicy i przesłonić metodę to_s. puts nie używa nowego to_s dla obiektu nowej klasy, podczas gdy print
kapv89,
1
użycie IRB 0.9.5 puts („a”) i puts („a \ n”) mają dokładnie to samo wyjście na REPL.
Marcus Junius Brutus
@ kapv89 To nieprawda: właśnie próbowałem i oba umieszczają e print za pomocą metody to_s. Tylko p go nie używa.
collimarco
6
@Fronker, to wciąż tylko jeden argument. Kompilator łączy sąsiednie łańcuchy.
cdunn2001
61

Duża różnica polega na tym, że wyświetlasz tablice. Zwłaszcza te z NIL. Na przykład:

print [nil, 1, 2]

daje

[nil, 1, 2]

ale

puts [nil, 1, 2]

daje

1
2

Uwaga: nie pojawia się żaden element (tylko pusty wiersz) i każdy element w innym wierszu.

MBentley
źródło
1
Zauważyłem to dzisiaj, co mnie tu sprowadziło. Chciałbym poznać sposób myślenia na ten temat. Wydaje się, że jest to specjalny przypadek dla putów obsługujących takie tablice. Zastanawiasz się, jakie było uzasadnienie ... Czy to tylko być analogiczne do innych języków?
Dan Barron
Ma to sens, ponieważ nil
puty wypisują
42

printwypisuje każdy argument, po nim $,, do $stdout, a następnie$\ . Jest to równoważne zargs.join($,) + $\

putsustawia zarówno $,i $\na „\ n”, a następnie robi to samo co print. Kluczową różnicą jest to, że każdy argument jest nowym wierszem puts.

Możesz uzyskać require 'english'dostęp do tych zmiennych globalnych za pomocą przyjaznych dla użytkownika nazw .

wersimmon
źródło
fajna wskazówka na temat englishlib
lacostenycoder
18

Dokumenty API podają kilka dobrych wskazówek:

print() → nil

print(obj, ...) → nil

Zapisuje podane obiekty w systemie iOS . Powraca nil.

Strumień musi być otwarty do zapisu. Każdy obiekt, który nie jest łańcuchem, zostanie przekonwertowany przez wywołanie jego to_smetody. Po wywołaniu bez argumentów drukuje zawartość $_.

Jeśli separator pól wyjściowych ( $,) nie jest nil, jest wstawiany między obiektami. Jeśli separator rekordów wyjściowych ( $\) nie jest nil, jest dołączany do wyniku.

...

puts(obj, ...) → nil

Zapisuje podane obiekty w systemie iOS . Zapisuje nowy wiersz po dowolnym, który jeszcze nie kończy się sekwencją nowego wiersza. Powraca nil.

Strumień musi być otwarty do zapisu. Wywołany z argumentem tablicowym zapisuje każdy element w nowym wierszu. Każdy dany obiekt, który nie jest łańcuchem ani tablicą, zostanie przekonwertowany przez wywołanie jego to_smetody. Wywołany bez argumentów, wyświetla pojedynczy znak nowej linii.

Eksperymentując trochę z powyższymi punktami, różnice wydają się następujące:

  • Wywoływany z wieloma argumentami, printoddziela je „separatorem pól wyjściowych” $,(który domyślnie nie przyjmuje nic), a putsseparuje je znakami nowej linii. putsrównież wstawia nowy wiersz po ostatnim argumencie, podczas gdy printnie.

    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
  • putsautomatycznie rozpakowuje tablice, a jednocześnie printnie:

    2.1.3: 001> drukuj [1, [2, 3]], [4]
    [1, [2, 3]] [4] => zero 
    2.1.3: 002> stawia [1, [2, 3]], [4]
    1
    2)
    3)
    4
     => zero
  • printbez argumentów wypisuje $_(ostatnia rzecz czytana gets), a putswypisuje nowy wiersz:

    2.1.3 :001 > gets
    hello world
     => "hello world\n" 
    2.1.3 :002 > puts
    
     => nil 
    2.1.3 :003 > print
    hello world
     => nil
  • printzapisuje separator rekordów wyjściowych $\po tym, co drukuje, putsignorując tę ​​zmienną:

    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
Mark Amery
źródło
4

putswywołaj to_skażdy argument i doda nowy wiersz do każdego łańcucha, jeśli nie kończy się on nowym wierszem. printpo prostu wypisz każdy argument, wywołując ich to_s.

na przykład puts "one two": one two

{Nowa linia}

puts "one two\n": one two

{nowa linia} #puts nie doda nowej linii do wyniku, ponieważ łańcuch kończy się nową linią

print "one two": one two

print "one two\n": one two

{Nowa linia}

I jest inny sposób na wyjście: p

Dla każdego obiektu zapisuje bezpośrednio obj.inspect, a następnie nowy wiersz na standardowe wyjście programu.

Pomocne jest wyświetlenie komunikatu debugowania. p "aa\n\t":aa\n\t

Ryan
źródło
-1

Jeśli chcesz wypisać tablicę w ciągu puts, otrzymasz taki sam wynik, jak gdybyś używał print:

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

Ale jeśli nie z cytowanym ciągiem, to tak. Jedyna różnica polega na tym, kiedy używamy nowej linii puts.

użytkownik2273663
źródło
1
-1 z dwóch powodów. Po pierwsze, brak jasności: nie rozumiem, co ma na myśli początkowe „Ale ...”, ani też nie rozumiem, na co odpowiada „tak” w ostatnim akapicie. Po drugie, z powodu braku poprawności: mówisz, że użycie printfzamiast putsw twoim przykładzie kodu da ten sam wynik, ale w rzeczywistości tak nie jest. putsWariant dodaje nowej linii na końcu, gdy printfnie każdy robi, podobnie jak przypadku, gdy nie ma żadnej tablicy interpolowana do łańcucha. (Koniecznie, ponieważ interpolacja zachodzi podczas oceny literału łańcucha.)
Mark Amery
Aha! Po przeczytaniu innych odpowiedzi, myślę, że rozumiem - zamierzałeś być odpowiedzią na stackoverflow.com/a/14534145/1709587 ? W każdym razie nie jest to odpowiedź sama w sobie.
Mark Amery