Ruby에서 __FILE__은 무슨 뜻입니까?


답변:


144

현재 파일 이름에 대한 참조입니다. 파일 foo.rb에서 __FILE__로 해석됩니다 "foo.rb".

편집 : Ruby 1.9.2 및 1.9.3은 Luke Bayes가 그의 의견 에서 말한 것과 약간 다르게 행동하는 것으로 보입니다 . 이 파일들로 :

# test.rb
puts __FILE__
require './dir2/test.rb'
# dir2/test.rb
puts __FILE__

러닝 ruby test.rb출력

test.rb
/full/path/to/dir2/test.rb

87
이 답변은 정확하지 않습니다. FILE 은 현재 실행 디렉토리에서 파일 에 대한 "상대적"경로입니다. 절대 경로는 아닙니다. 절대 경로를 얻으려면 File.expand_path ( FILE )를 사용해야 합니다
Luke Bayes

7
위의 주석에서 이중 밑줄이 자동으로 제거되었습니다.
Luke Bayes

1
루비 1.9.2에서도 이것이 사실입니까?
Zasz

4
@Zasz 1.9.2에서 약간 다르게 작동합니다. 처음에로드 된 파일에는 상대 __FILE__이 있지만 다른 포함 / 필수 파일에는 절대 경로가 있습니다.
Geoff

9
@LukeBayes 리터럴 텍스트를 백틱으로 묶어 Stack Overflow 주석에서 밑줄 및 기타 특수 문자를 보존 할 수 있습니다. 쓰기 `__FILE__`얻을 __FILE__.
Rory O'Kane

62

의 값은 __FILE__파일이로드 될 때 만들어지고 저장되지만 업데이트되지는 않는 상대 경로입니다. 즉 Dir.chdir, 응용 프로그램의 다른 곳으로 전화를 거는 경우이 경로가 잘못 확장됩니다.

puts __FILE__
Dir.chdir '../../'
puts __FILE__

이 문제에 대한 한 가지 해결 방법은 __FILE__응용 프로그램 코드 외부의 확장 된 값을 저장하는 것 입니다. 언제 까지나 당신으로 require문이 정의의 상단에있는 (또는를 호출하기 전에 적어도 Dir.chdir),이 값은 디렉토리를 변경 한 후 유용 할 것입니다.

$MY_FILE_PATH = File.expand_path(File.dirname(__FILE__))

# open class and do some stuff that changes directory

puts $MY_FILE_PATH

This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.내 테스트에서 경로가 올바르게 확장되었습니다. 내 루비 버전은 2.3.7이며 최신 루비 버전 으로이 문제가 해결되었을 수 있습니다.
Alec.Zhou

28

__FILE__ 실행중인 코드가 포함 된 파일 확장자를 가진 파일 이름입니다.

이어 foo.rb, __FILE__"foo.rb"일 것이다.

경우 foo.rb디렉터리에 있던 /home/josh다음 File.dirname(__FILE__)반환합니다 /home/josh.


정확히 이것을 찾고 있습니다. +1 : =) @Ethan
KM Rakibul Islam


17

어쨌든 Windows 버전 인 Ruby에서는 방금 확인 __FILE__했으며 파일의 전체 경로를 포함하지 않았습니다. 대신 파일이 실행되는 위치를 기준으로 파일 경로를 포함합니다.

PHP __FILE__에는 전체 경로가 있습니다 (제 의견으로는 바람직합니다). 따라서 Ruby에서 경로를 이식 가능하게하려면 다음을 사용해야합니다.

File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")

Ruby 1.9.1 __FILE__에는 파일의 전체 경로가 포함되어 있으며, 위의 설명은 Ruby 1.8.7을 사용할 때였습니다.

Ruby 1.8.7 및 1.9.1 (1.9에 대해서는 확실하지 않음) 모두와 호환 되려면 위에 표시된 구문을 사용하여 파일이 필요합니다.


상대 경로에 슬래시를 추가해야합니다.File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe 2013

3
디렉토리 구분 기호를 하드 코딩해서는 안됩니다. 사용 File.join 대신 : File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
앤드류 Hodgkinson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.