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
12
Uwaga: nie pojawia się żaden element (tylko pusty wiersz) i każdy element w innym wierszu.
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.
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.
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
-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.
Odpowiedzi:
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:Podczas gdy
print [[1,2,3], [4,5,nil]]
wróci:źródło
Duża różnica polega na tym, że wyświetlasz tablice. Zwłaszcza te z NIL. Na przykład:
daje
ale
daje
Uwaga: nie pojawia się żaden element (tylko pusty wiersz) i każdy element w innym wierszu.
źródło
nil
print
wypisuje każdy argument, po nim$,
, do$stdout
, a następnie$\
. Jest to równoważne zargs.join($,) + $\
puts
ustawia zarówno$,
i$\
na „\ n”, a następnie robi to samo coprint
. Kluczową różnicą jest to, że każdy argument jest nowym wierszemputs
.Możesz uzyskać
require 'english'
dostęp do tych zmiennych globalnych za pomocą przyjaznych dla użytkownika nazw .źródło
english
libDokumenty API podają kilka dobrych wskazówek:
Eksperymentując trochę z powyższymi punktami, różnice wydają się następujące:
Wywoływany z wieloma argumentami,
print
oddziela je „separatorem pól wyjściowych”$,
(który domyślnie nie przyjmuje nic), aputs
separuje je znakami nowej linii.puts
również wstawia nowy wiersz po ostatnim argumencie, podczas gdyprint
nie.puts
automatycznie rozpakowuje tablice, a jednocześnieprint
nie:print
bez argumentów wypisuje$_
(ostatnia rzecz czytanagets
), aputs
wypisuje nowy wiersz:print
zapisuje separator rekordów wyjściowych$\
po tym, co drukuje,puts
ignorując tę zmienną:źródło
puts
wywołajto_s
każdy argument i doda nowy wiersz do każdego łańcucha, jeśli nie kończy się on nowym wierszem.print
po prostu wypisz każdy argument, wywołując ichto_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
Pomocne jest wyświetlenie komunikatu debugowania.
p "aa\n\t"
:aa\n\t
źródło
Jeśli chcesz wypisać tablicę w ciągu
puts
, otrzymasz taki sam wynik, jak gdybyś używałprint
:Ale jeśli nie z cytowanym ciągiem, to tak. Jedyna różnica polega na tym, kiedy używamy nowej linii
puts
.źródło
printf
zamiastputs
w twoim przykładzie kodu da ten sam wynik, ale w rzeczywistości tak nie jest.puts
Wariant dodaje nowej linii na końcu, gdyprintf
nie 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.)