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

나는 루비에서 항상 이것을 본다.

require File.dirname(__FILE__) + "/../../config/environment"  

무슨 __FILE__뜻입니까?



답변

현재 파일 이름에 대한 참조입니다. 파일 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__파일이로드 될 때 만들어지고 저장되지만 업데이트되지는 않는 상대 경로입니다. 즉 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


답변

__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에 대해서는 확실하지 않음) 모두와 호환 되려면 위에 표시된 구문을 사용하여 파일이 필요합니다.


답변