2012-06-06 3 views
0

때로는 파일을 열고 내용을 읽고 일부 기능 조작을하고 변수에 데이터를 저장해야하는 경우가 있습니다.매개 변수로 전달 된 임시 (익명) File 객체를 닫는 방법?

  • 파일 인스턴스 File.open()이 줄 끝에서 폐쇄 하는가 : 여기 두 가지 질문이

    @some_vars = File.open("items.txt").read.chomp!.split(',') 
    

    :이 코드의 다음 행으로 끝날 것인가?

  • 가독성을 희생하지 않고 파일 인스턴스를 닫는 방법?

답변

4

아니요, File.open은 파일 핸들을 열어 둡니다.

IO.read("items.txt").chomp!.split(',') 

File.open에 블록을 통과하는 것보다 하나의 라이너 비트 짧은 : 당신은 파일의 전체 내용을 반환하고 당신이 일을 끝낼 때를 종료하는 대신 IO.read을 사용해야합니다.

+0

정말인가요? 나는'File'이'IO'의 하위 클래스이고 그것으로부터'read' 메소드를 상속 받았다고 생각했습니다. – steenslag

+0

'IO.read'와'File.read'는 같지만'read'는'File'에 문서화 된 메소드가 아니기 때문에'IO'에 링크하고 참조하는 것이 덜 혼란 스럽습니다. –

+0

+1은 내가 제안한 블록 구문보다 한 줄짜리 코드로 더 읽기 쉽기 때문에 +1 블록은 일반적인 경우에 들어갈 수있는 올바른 방법이라고 생각합니다. IO # 읽기는 본질적으로 수풀이며 모든 수반과 빼기가 수반됩니다. 모든 것이 절충입니다. :) –

1

게시 한 예가 자동으로 파일 설명자를 닫지 않습니다. 설명자에서 File # close를 수동으로 호출하거나 인터프리터가 종료 될 때 Ruby가 자동으로 파일을 닫도록해야합니다.

자동으로 파일을 닫아야 할 경우

, 당신은 File#open block syntax 필요 블록이 종료 할 때마다

File.open('items.txt') { |f| f.read.chomp!.split(',') } 

루비는 다음 파일을 닫습니다.

0

File.open에있는 블록을 사용해도 응용 프로그램이 일시 중단 된 경우와 같이 파일이 항상 닫혀 있는지 확인하지 않습니다. 이런 종류의 상황을 방지하는 트릭이 있습니다.

f = File.open('items.txt', 'w') 

at_exit { f.flush; f.close } 

이어서 at_exit 블록 애플리케이션 또는 프로그램이 종료의 끝에서 실행된다.

+0

오류,이 작업 예제를 제공 할 수 있습니까? 'File.open'의 블록 구문은'sure'를 사용합니다.'at_exit'가 성공했을 때 실행되지 않을 것이라고 저는 생각하지 않습니다. –

+3

인터프리터가 종료되면 OS는 열려있는 모든 파일 핸들을 닫습니다. –

+0

@AndrewMarshall, 나는이 트릭을 한 번만 사용했고 대회 주최자의 요구 사항이었습니다. 여기에서이 사용법을 볼 수 있습니다. https://gist.github.com/be91b8e176f85326e656 – megas

관련 문제