나는 루비 코드에서 타의 추종을 불허하는 File.open
호출 에서 여러 번 보았다
예를 들어 줄 수 있습니까? 나는 "파일 작업을위한 흐름이 개방-사용- 폐쇄적 이라는"대부분의 프로그래밍 언어에 대한 상식이 부족한 초보자가 작성한 코드에서만 볼 수 있습니다.
숙련 된 Rubyists는 파일을 명시 적으로 닫거나, 더 관용적 File.open
으로는 파일을 자동으로 닫는 블록 형식을 사용 합니다. 구현은 기본적으로 다음과 같습니다.
def File.open(*args, &block)
return open_with_block(*args, &block) if block_given?
open_without_block(*args)
end
def File.open_without_block(*args)
end
def File.open_with_block(*args)
yield f = open_without_block(*args)
ensure
f.close
end
스크립트는 특별한 경우입니다. 스크립트는 일반적으로 너무 짧게 실행되며 스크립트가 종료 될 때 운영 체제가 닫을 것이기 때문에 파일 설명자를 너무 적게 사용하여 닫는 것이 의미가 없습니다.
명시 적으로 닫아야합니까?
예.
그렇다면 GC가 자동으로 닫히는 이유는 무엇입니까?
객체를 수집 한 후에는 더 이상 파일을 닫을 방법이 없으므로 파일 설명자가 유출 될 수 있습니다.
파일을 닫는 것은 가비지 수집기가 아닙니다. 가비지 수집기는 개체를 수집하기 전에 개체에 대한 종료자를 실행합니다. 그냥 그렇게하는 것이 어떻게 File
클래스 파일을 닫습니다 파이널 라이저를 정의합니다.
그렇지 않다면 왜 옵션입니까?
낭비되는 메모리는 저렴하지만 낭비되는 파일 설명자는 그렇지 않기 때문입니다. 따라서 파일 설명 자의 수명을 일부 메모리 청크의 수명과 연결하는 것은 의미가 없습니다.
당신은 단순히 예측할 수 없습니다 때 가비지 수집기가 실행됩니다. 당신도 예측할 수없는 경우 가 실행됩니다 전혀 : 당신이 메모리가 부족하지 않을 경우, 가비지 컬렉터가 실행되지 않습니다, 그러므로 파이널이 실행되지 않습니다 따라서 파일이 폐쇄되지 않습니다.