2010-11-25 6 views
32

루비는 표준 입력을 참조하는 두 가지 방법 : STDIN 상수와 $stdin 전역 변수를 가지고 있습니다. 을 제외하고는, STDIN$stdin의 차이점은 무엇입니까 (예를 들어, 내 아이의 IO를 리디렉션 분기 전) 일정이 아니기 때문에 내가 $stdin에 다른 IO 객체를 할당 할 수 있다는 사실에서

? 각 코드를 언제 사용해야합니까?

$stdin을 재 할당하면 STDIN에 영향을 줍니까?

이 내용은 STDOUT/$stdoutSTDER/$stderr에도 적용됩니까?

+2

'$ stdin'은 더럽습니다. –

답변

35

$stdin이 재 할당되는 경우 STDIN은 영향을받지 않습니다. 마찬가지로 $stdinSTDIN이 재 할당 될 때 영향을받지 않습니다 (무의미하지만 완벽하게 가능하지만 경고를 생성합니다). 그러나 두 변수가 다시 할당되지 않으면 둘 다 동일한 IO 객체를 가리키므로 하나의 변수에 reopen을 호출하면 다른 변수에 영향을줍니다.

모든 내장 루비 메소드는 입력을 읽기 위해 $< (a.k.a. ARGF)을 사용합니다. ARGV이 비어 있으면 ARGF$stdin에서 읽습니다. 따라서 $stdin을 재 할당하면 모든 기본 제공 방법에 영향을 미칩니다. STDIN을 재 할당하면 일부 제 3 자 방법이 STDIN을 사용하지 않는 한 효과가 없습니다.

자신의 코드에서 기본 제공 방법 ²과 일치하려면 $stdin을 사용해야합니다.

¹ reopen은 IO 개체를 다른 스트림이나 파일로 리디렉션 할 수있는 방법입니다. 그러나 IO를 StringIO로 리디렉션하는 데 사용할 수 없으므로 $stdin을 재 할당하는 모든 사용 사례가 제거되지는 않습니다.

당신은 물론 또한 $</ARGF가 내장 된 방법과 더욱 일치하는 데 사용할 수있는 ²,하지만 당신은 명시 적으로 표준 입력 스트림을 사용하는 경우 대부분의 시간을 당신은는 ARGF 행동을하지 않으려는 .

+0

필자는 내장 메소드가'$ <'(기본 입력 스트림)과'$>'(기본 출력 스트림)을 사용하고'$ stdin' /'STDIN'도'$ stdout' /'' STDOUT'. 사실,'$ <' and '$>'의 요점은 stdin/stdout에 영향을주지 않고'Kernel # puts' *와 같은 메소드의 입력과 출력을 리다이렉션 할 수 있다는 것입니다. –

+3

@ Jörg : 당신 말이 맞아요, 그들은'$ <' and '$>'을 사용합니다. 나는 바로 잡을 것입니다. 하지만 두 번째 요점에 대해서는 옳지 않습니다.'$>'와'$ stdout'는 별칭이므로, 재 할당하면 영향을받지 않는 STDOUT과 달리 다른 것에 영향을줍니다. '$ < '는'ARGF'와 동일합니다. 둘 다 * 재 할당 할 수 없습니다.그러나'$ stdin' *을 재 할당하는 것은'ARGV'가 비어 있다면'$ stdin'에서'ARGF'가 읽어 오기 때문에'$ <'와'ARGF'에 영향을줍니다. – sepp2k

+2

매일 새로운 것을 배웁니다 ... –

0

STDERR과 $ stderr은 처음에 같은 것을 가리키고 있습니다. 당신은 전역 변수를 재 할당 할 수 있지만 상수를 혼동해서는 안됩니다. $ stdin 및 STDIN, $ stdout 및 STDOUT 쌍이 같습니다.

STDERR.puts를 사용하여 오류 메시지를 출력하는 일부 보석을 원숭이 패치하는 대신 STDERR을 두 번 변경해야했습니다. STDERR = $ stdout으로 재 지정하면 STDERR.reopen ('nul', 'w')이 표시되는 동안 경고가 나타납니다.

관련 문제