프린트와 풋의 차이점은 무엇입니까?


답변:


377

puts 각 인수의 끝에 새 줄을 추가합니다 (없는 경우).

print 새 줄을 추가하지 않습니다.


예를 들면 다음과 같습니다.

puts [[1,2,3], [4,5,nil]] 돌아올 것이다 :

1
2
삼
4
5

print [[1,2,3], [4,5,nil]] 반품 하는 반면 :

[[1,2,3], [4,5, nil]]
puts는 nil 값을 출력하지 않지만 print는 어떻게 출력되는지 주목하십시오.

88
실제로, 각 인수 뒤에 줄 바꿈. 핵심 포인트이며 Ruby 문서에서 명확하지 않습니다 (예제에는 인수가 하나뿐이므로).
cdunn2001

3
또 다른 것이 있습니다 ... 배열 클래스를 확장하고 to_s 메소드를 재정의하십시오. puts는 새로운 클래스의 객체에 대해 새로운 to_s를 사용하지 않습니다
kapv89

1
irb 0.9.5 사용 puts ( "a") 및 puts ( "a \ n")는 REPL에서 정확히 동일한 출력을 갖습니다.
마커스 주니 우스 브루투스

@ kapv89 사실이 아닙니다 : 방금 시도한 두 가지 모두 to_s 메소드를 사용하여 e print를 넣습니다. p 만 사용하지 않습니다.
collimarco

6
@Fronker, 그것은 여전히 ​​하나의 논쟁입니다. 컴파일러는 인접한 문자열을 연결합니다.
cdunn2001

61

큰 차이점은 배열을 표시하는 것입니다. 특히 NIL을 가진 것들. 예를 들면 다음과 같습니다.

print [nil, 1, 2]

준다

[nil, 1, 2]

그러나

puts [nil, 1, 2]

준다

1
2

빈 항목이없는 항목은 나타나지 않으며 각 항목은 다른 행에 있습니다.


1
나는 오늘 이것을 알아 차렸다. 나는 그것에 대한 생각을 알고 싶습니다. puts가 그런 배열을 처리하는 특별한 경우처럼 보입니다. 이론적 근거가 무엇인지 궁금합니다. 다른 언어와 유사합니까?
Dan Barron

puts가 새로운 라인으로 출력되기 때문에 의미가 있습니다. 따라서 배열에서 반복하고 각 라인에서 put을 호출하는 것으로 생각할 수 있습니다. 그러나 출력되지 않는 것은 이상합니다nil
Muers

42

print각 인수 뒤에 $,, to $stdout,을 차례로 출력합니다 $\. 그것은args.join($,) + $\

puts세트 모두 $,$\에 "\ n"은 다음과 같은 일을한다 print. 주요 차이점은 각 인수가 와 함께 새 줄이 있다는 것입니다 puts.

사용자에게 친숙한 이름으로require 'english' 전역 변수에 액세스 할 수 있습니다 .


englishlib 에 대한 좋은 팁
lacostenycoder

18

API 문서 는 좋은 힌트를 제공합니다.

print() → nil

print(obj, ...) → nil

주어진 객체를 ios에 씁니다 . 를 반환 nil합니다.

쓰기 위해 스트림을 열어야합니다. 문자열이 아닌 각 주어진 객체는 to_s메소드 를 호출하여 변환됩니다 . 인수없이 호출하면의 내용을 인쇄합니다 $_.

출력 필드 구분 기호 ( $,)가 아닌 nil경우 객체 사이에 삽입됩니다. 출력 레코드 구분 기호 ( $\)가 아닌 nil경우 출력에 추가됩니다.

...

puts(obj, ...) → nil

주어진 객체를 ios에 씁니다 . 개행 시퀀스로 끝나지 않은 개행 후에 개행을 씁니다. 를 반환 nil합니다.

쓰기 위해 스트림을 열어야합니다. 배열 인수와 함께 호출되면 각 요소를 새 줄에 씁니다. 문자열이나 배열이 아닌 각 주어진 객체는 to_s메소드 를 호출하여 변환됩니다 . 인수없이 호출하면 단일 줄 바꿈이 출력됩니다.

위의 요점을 약간 실험 해 보면 차이점은 다음과 같습니다.

  • 여러 인수 print를 사용하여 '출력 필드 구분 기호' $,(기본값은 없음)로 puts구분하고 개행으로 구분합니다. puts또한 마지막 인수 뒤에 개행을 print넣지 만 그렇지 않습니다.

    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
  • puts자동으로 배열의 압축을 풉니 다 print.

    2.1.3 : 001> 인쇄 [1, [2, 3]], [4]
    [1, [2, 3]] [4] => nil 
    2.1.3 : 002> 풋 [1, [2, 3]], [4]
    1
    2
    삼
    4
     => nil
  • print인수없이 인쇄하고 $_(마지막으로 읽은 것 gets) puts개행 을 인쇄합니다.

    2.1.3 :001 > gets
    hello world
     => "hello world\n" 
    2.1.3 :002 > puts
    
     => nil 
    2.1.3 :003 > print
    hello world
     => nil
  • print$\인쇄 후 출력 레코드 구분 기호 를 puts쓰고이 변수는 무시합니다.

    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

4

putsto_s각 인수 의 를 호출하고 새 줄로 끝나지 않으면 각 문자열에 새 줄을 추가합니다. print그냥를 호출하여 각 인수를 출력하십시오 to_s.

예를 들면 puts "one two": one two

{새 줄}

puts "one two\n": one two

{new line} #puts는 문자열이 새 줄로 끝나기 때문에 결과에 새 줄을 추가하지 않습니다.

print "one two": one two

print "one two\n": one two

{새 줄}

그리고 출력하는 또 다른 방법이 있습니다. p

각 객체에 대해 obj.inspect를 직접 작성하고 프로그램의 표준 출력에 개행을 씁니다.

디버깅 메시지를 출력하는 데 도움이됩니다. p "aa\n\t":aa\n\t


-1

를 사용하여 문자열 내에서 배열을 출력 puts하려면 다음을 사용하는 것과 동일한 결과를 얻습니다 print.

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

그러나 인용 된 문자열을 사용하지 않으면 예. 유일한 차이점은 우리가 사용할 때 줄 바꿈 puts입니다.


1
두 가지 이유로 -1입니다. 첫째, 명확성 부족 : 초기 "그러나 ..."가 이것의 뒤를 따르려는 의도를 이해하지 못하며, 마지막 단락의 "예"가 무엇을 응답하는지 이해하지 못합니다. 둘째, 정확성이 부족한 경우 : 예제 코드 printf대신 대신 사용 puts하면 동일한 결과를 얻을 수 있지만 실제로는 그렇지 않습니다. puts변형 마지막에 개행을 추가하는 동안 printf하나하지 않습니다, 단지 문자열로 보간에는 배열이 없습니다 경우 등이있다. (문자열 리터럴을 평가할 때 반드시 그렇게, 이후 보간이 발생합니다.)
마크 Amery

아하! 다른 답변을 읽은 후에 나는 이것이 이해한다고 생각합니다-당신은 이것이 stackoverflow.com/a/14534145/1709587에 대한 답장을 의도했습니다 . 어쨌든, 그것은 실제로 그 자체로 답이 아닙니다.
Mark Amery 12
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.