답변:
현재 파일 이름에 대한 참조입니다. 파일 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
`__FILE__`
얻을 __FILE__
.
의 값은 __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이며 최신 루비 버전 으로이 문제가 해결되었을 수 있습니다.
__FILE__
실행중인 코드가 포함 된 파일 확장자를 가진 파일 이름입니다.
이어 foo.rb
, __FILE__
"foo.rb"일 것이다.
경우 foo.rb
디렉터리에 있던 /home/josh
다음 File.dirname(__FILE__)
반환합니다 /home/josh
.
어쨌든 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")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )