Czy istnieje jakaś różnica między p
i puts
w Ruby?p vs puts w Ruby
Odpowiedz
p foo
drukuje foo.inspect
obserwowani przez nową linią, czyli wypisuje wartość inspect
zamiast to_s
, który jest bardziej odpowiedni do debugowania (bo można np odróżnić 1
, "1"
i "2\b1"
, czego nie, kiedy można drukowanie bez inspect
).
p foo
jest taka sama jak puts foo.inspect
ale 'puts' zwraca' nil', zamiast 'foo' tak samo jak' p'. – ribamar
To źle. Jest to to samo, co 'put foo.inspect; foo' –
ważne jest również, aby pamiętać, że puts
„reaguje” do klasy, która ma to_s
zdefiniowany, p
nie. Na przykład:
class T
def initialize(i)
@i = i
end
def to_s
@i.to_s
end
end
t = T.new 42
puts t => 42
p t => #<T:0xb7ecc8b0 @i=42>
Wynika to bezpośrednio z połączenia .inspect
, ale nie jest to oczywiste w praktyce.
umieszcza
puts(obj, ...) → nil
Zapisuje dany obiekt (ów) ios. Zapisuje nowy znak newline po tym, jak ten koniec nie jest już zakończony sekwencją nowej linii. Zwraca zero.
Strumień musi być otwarty do zapisu. Jeśli wywoływany z argumentem , zapisuje każdy element w nowej linii. Każdy podany obiekt, który nie jest łańcuchem lub tablicą, zostanie przekonwertowany przez wywołanie metody
to_s
. Jeśli zostanie wywołany bez argumentów, wypisze pojedynczy znak nowej linii.
spróbujmy go na IRB
# 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
p(obj) → obj click to toggle source
p(obj1, obj2, ...) → [obj, ...]
p() → nil
Dla każdego obiektu zapisuje bezpośrednioobj.inspect
, a następnie znak nowej linii do standardowego wyjścia programu.
w IRB
# 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
Oprócz powyższych odpowiedzi, jest subtelne różnice w wydajności konsoli - mianowicie obecność/brak odwróconych znaków przecinki/notowań - które mogą być przydatne:
p "+++++"
>> "+++++"
puts "====="
>> =====
Uważam to przydatne, jeśli chcesz zrobić prosty pasek postępu, korzystając z ich bliskiego krewnego drukiem:
array = [lots of objects to be processed]
array.size
>> 20
Daje to 100% pasek postępu:
puts "*" * array.size
>> ********************
I dodaje przyrostową * na każdej iteracji:
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
>> ******
- 1. bardzo podstawowe pytanie ruby / sinatra/heroku/debugowanie: jak wyświetlić wyjście puts i p?
- 2. Ruby: define_method vs. def
- 3. sprawdź (nieobecność) `puts` w RSpec
- 4. Jak testować puts w rspec
- 5. backtick vs system ruby
- 6. Ruby - leksykalna zakres vs dziedziczenia
- 7. Czy Ruby ma mkdir -p?
- 8. Ruby: co robi gwiazdki w "p * 1..10" oznaczają
- 9. Ruby: ProC# call vs yield
- 10. jeśli vs if (x == false) w Ruby
- 11. Metoda "puts" w szynach 3
- 12. Ruby vs. Ruby On Rails
- 13. Wyrażenie regularne - Ruby vs Perl
- 14. Ruby def i instance_eval vs. class_eval
- 15. Ruby: Struct vs Initialize
- 16. Ruby wysłać vs __send__
- 17. Operatory porównania Ruby? == vs. ===
- 18. p metoda w języku Ruby trudne do wyszukiwania
- 19. Ruby on Rails before_filter vs initialized ruby
- 20. Wydajność Ruby/Rails: OpenURI vs NET: HTTP vs Curb vs Rest-Client
- 21. Zmienna instancji klasy Ruby vs. zmienna klasy
- 22. Tablice w Ruby: Take vs Limit vs Pierwszy
- 23. Python yield vs Ruby yield
- 24. Ruby on Rails vs. Django
- 25. Ruby left vs right recursion
- 26. wydajność: ruby CSV.foreach vs CSV.parse
- 27. Klasa vs Moduł w projektowaniu API Ruby?
- 28. Przekieruj dane wyjściowe polecenia "puts" do pliku dziennika
- 29. Ruby Symbole vs smyczki mieszań
- 30. Ruby Regexp: + vs *. szczególne zachowanie?
Tak, p (i kładzie) są zarówno w module jądra więc możesz zobaczyć szczegóły tutaj: http://www.ruby-doc.org/core/classes/Kernel.html#M005961 – mikej
Zauważ, że 'p' również zwraca wartość obiektu, podczas gdy' puts' nie. '1.9.3p125: 002> (p" foo "). Class" foo "=> String 1.9.3p125: 003> (wstawia" foo ") class foo => NilClass' –
Świetne podsumowanie dostarczone przez Garetha Reesa post zatytułowany ["Ruby p vs puts vs print"] (http://www.garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/). – alexanderjsingleton