Na przykład w tym wierszu kodu napisałem printi putsgeneruję różne wyniki.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Na przykład w tym wierszu kodu napisałem printi putsgeneruję różne wyniki.
1.upto(1000).each { |i| print i if i % 2 == 0 }
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:
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.
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.
nil
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 .
englishlib
Dokumenty API podają kilka dobrych wskazówek:
print() → nil
print(obj, ...) → nilZapisuje 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 jestnil, jest wstawiany między obiektami. Jeśli separator rekordów wyjściowych ($\) nie jestnil, jest dołączany do wyniku....
puts(obj, ...) → nilZapisuje 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
=> nilputsautomatycznie 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
=> nilprintzapisuje 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! => nilputswywoł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
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.
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.)