루비를 넣는 pvs.
사이에 차이가 있습니까?p
그리고.puts
루비에?
p foo
인쇄물foo.inspect
다음에 새로운 선이 나옵니다. 즉, 그것은 가치를 인쇄합니다.inspect
대신에to_s
디버깅에 더 적합한 것은 (예를 들어, 당신이 사이의 차이를 말할 수 있기 때문입니다.)1
,"1"
그리고."2\b1"
인쇄할 때는 인쇄할 수 없습니다.inspect
).
또한 주의해야 할 점은puts
를 가진 클래스에 "추가"합니다.to_s
정의됨,p
하지 않다.예:
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>
이는 직접적으로 다음과 같습니다..inspect
호출, 그러나 실제로는 명확하지 않습니다.
p foo
와 동일합니다.puts foo.inspect
Ruby-2.4.1 문서에서
놓다
puts(obj, ...) → nil
지정된 개체를 ios에 씁니다.새 줄 시퀀스로 끝나지 않은 줄을 새 줄로 씁니다.0을 반환합니다.
쓰기 위해 스트림을 열어야 합니다.배열 인수와 함께 호출되는 경우 각 요소를 새 줄에 씁니다.문자열 또는 배열이 아닌 각 지정된 개체는 해당 개체를 호출하여 변환됩니다.
to_s
방법.인수 없이 호출되면 새 줄 하나를 출력합니다.
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
각 개체에 대해 직접 쓰기obj.inspect
프로그램의 표준 출력에 대한 새로운 행이 뒤따릅니다.
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
위의 답변 외에도 콘솔 출력, 즉 역콤마/따옴표의 존재/존재에 있어 유용한 부분이 있습니다.
p "+++++"
>> "+++++"
puts "====="
>> =====
가까운 친척을 사용하여 간단한 진행률 표시줄을 만들고 싶을 때 유용합니다.
array = [lots of objects to be processed]
array.size
>> 20
그러면 100% 진행 표시줄이 표시됩니다.
puts "*" * array.size
>> ********************
각 반복마다 증분*이 추가됩니다.
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
>> ******
이 두 가지는 동일합니다.
p "Hello World"
puts "Hello World".inspect
(inspect는 _s 메서드에 비해 객체를 더 문자 그대로 볼 수 있습니다.)
이것은 주요 차이점 중 하나를 설명할 수 있습니다. 즉,p
전달된 내용의 값을 반환합니다. 반면,puts
돌아온다nil
.
def foo_puts
arr = ['foo', 'bar']
puts arr
end
def foo_p
arr = ['foo', 'bar']
p arr
end
a = foo_puts
=>nil
a
=>nil
b = foo_p
=>['foo', 'bar']
b
['foo', 'bar']
벤치마크 쇼puts
더 느림
require 'benchmark'
str = [*'a'..'z']
str = str*100
res = Benchmark.bm do |x|
x.report(:a) { 10.times {p str} }
x.report(:b) { 10.times {puts str} }
end
puts "#{"\n"*10}"
puts res
0.010000 0.000000 0.010000 ( 0.047310)
0.140000 0.090000 0.230000 ( 0.318393)
p
메소드는 더 광범위한 디버깅 가능한 메시지를 인쇄할 것입니다.puts
메시지 코드를 예쁘게 표시합니다.
예: 아래 코드 행 참조:
msg = "hey, Use \#{ to interpolate expressions"
puts msg #clean msg
p msg #shows \ with #
출력은 다음과 같습니다.
hey, Use #{ to interpolate expressions
"hey, Use \#{ to interpolate expressions"
언급URL : https://stackoverflow.com/questions/1255324/p-vs-puts-in-ruby
'source' 카테고리의 다른 글
안드로이드 앱의 이름을 변경하는 방법은 무엇입니까? (0) | 2023.06.01 |
---|---|
WPF에서 파일 선택 대화 상자는 어디에 있습니까? (0) | 2023.06.01 |
기호 배열 만들기 (0) | 2023.06.01 |
PostgreSQL에 대해 데이터베이스 생성 시뮬레이션이 없는 경우 (0) | 2023.06.01 |
항목이 "리소스" 매개 변수에 두 번 이상 지정되었습니다.중복 항목은 "리소스" 매개 변수에서 지원되지 않습니다. (0) | 2023.06.01 |