2010-01-01 2 views
3

루비에는 stdio에 대한 상수 및 전역 변수가 있습니다.루비 stdio consts 및 전역, 용도는 무엇입니까?

즉, consts STDIN, STDOUT, STDERR, 그 변수에 대응, $stdin, $stdout, $stderr.

상수와 변수의 차이점을 이해합니다. 나는 상수가 스크립트가 exec'd되는 순간에 파일 기술자에게 고정적으로 설정된다는 것을 안다.

또한 런타임시 변수를 (일부) 변경할 수 있음을 알고 있습니다.

그런 기능의 실제적인 사용에 관해 궁금합니다. 왜 그걸하고 싶니? 무엇을 얻을 수 있습니까?

실제 프로젝트에서 추출한 일부 샘플 코드 또는 사용 사례 만 보아도 대단 할 것입니다.


업데이트 : 지금까지 수집 무엇을, 당신의 자신의 라이브러리/프로그램을 작성할 때, 당신은 그 사용자와 오물을 촉진 할 수 있도록 정수를 변수를 사용하는 것을 선호한다 보인다에서. 권리?

답변

3

이 기능의 더 정교한 버전은 생산 코드에 사용중인에서는 error.log에 기록됩니다 print 또는 puts을 사용하여 콘솔에 기록 된 내용을 확인하십시오.

$ 변수는 표준 오류, 루비 다른 IO는 표준 입력, 표준 출력을 위해 개체를 제공하자

$stdout = buffer 

는 상수 (프로그램이 시작할 때) 쉽게 원래로 다시 값을 $ 변수를 얻을 수 있도록 :

$stdout = STDOUT 
+0

왜 버퍼를 StringIO로 초기화하지 않습니까? – kch

+0

수십 년 전에이 기능을 썼을 때, 나는 빨갛고 StringIO에 대해 몰랐습니다. 지옥, 그것은 루비 1.6이었다. 그때 이후로 나는이 코드를 처음으로 살펴 보았습니다. 그러나 코드가 StringIO를 사용하는지 여부는 주변 문제입니다. –

+1

실제로 주변 문제이며 문자열이 적어 지므로 예제의 관련 부분을 쉽게 읽을 수 있습니다. 답변을 수락하겠습니다. 나는 stringio를 사용하기 위해 그것을 편집 할 것이고, 나의 변화가 마음에 들지 않는다면 그것을 되돌릴 수있다. – kch

0

출력물의 일부를 파일로 보낸 다음 완료되면 콘솔로 다시 덤프 할 수 있습니다.

+0

정교하게 신경 써야할까요? – kch

+0

파일에 쓰는 부분을 이해하지 못합니까? –

+1

"해당 기능의 실제 사용"을 어디에 쓰는지 확인 하시겠습니까? – kch

2

마츠모토의 저서에 대한 답이있는 것 같습니다. 9.7.1.4에서 인용 미리 정의 된 스트림 : "printputs과 같은 전역 함수는 기본적으로 $ stdout에 쓰며 스크립트가이 전역 변수의 값을 변경하면 해당 메서드의 동작이 변경됩니다."

생각이 마치 잘못 구현 된 프로그램을 쉽게 해결할 수있는 것처럼 들리는 것 같습니다. 에 원하는

#!/usr/bin/env ruby -rstringio 

def capture_stdout 
    $stdout = StringIO.new 
    begin 
    yield 
    $stdout.string 
    ensure 
    $stdout = STDOUT 
    end 
end 

output = capture_stdout do 
    print "Line" 
    puts " 1" 
end 

p output  # => "Line 1\n" 

그것은 단위 테스트에 사용됩니다

+1

/아마도 잘못 구현 된 프로그램/아마도 쓸모없는 유닉스 스크립트/ – kch

+0

'print'와'puts'는 실제로'$ stdout'으로 설정되어 있지만 변경 될 수 있다는 사실을 기억하십시오. 또는 그렇게 생각합니다. – kch

+0

아, 유머 감각이 있습니다. 항상 재미 있습니다. –

1
$stderr = File.open 'error.log', 'w' 

모든 오류는

+0

흠. stderr 대신에 파일에 로그해야한다고 결정한 설정 파일이 있다면 의미가 있습니다. – kch

관련 문제