2014-02-26 2 views
3

다음 진술은 무엇이 다른가요?루비에있는 파일에 액세스 - 차이점

#(not working) 
File.exists?("path to file") 

#(working) 
::File.exists?("path to file") 

저는 Ruby의 Chef 프레임 워크에서 위의 문장을 사용했습니다.

작동하지 : 여기

+0

전체 코드를 확인해야합니다. 공유하십시오 –

+3

이 질문은 실제로 요리사와 관련하여 매우 합법적입니다. Chef에서'File'은'Chef :: Resource :: File'을 가리키고, :: :: File은 최상위 루비'File' 클래스를 가리 킵니다. – sethvargo

답변

5

이 문제를 복제하려고 수

class Foo< BasicObject 
    def self.file_size 
    File.size(__FILE__) 
    end 
end 

p Foo.file_size # uninitialized constant Foo::File (NameError) 

이유는 File 클래스는 내부 (클래스 Object의 범위에서 예) 최상위 레벨에서 사용할되고있다 직접/간접 서브 클래스 Object의 모든 클래스. 그러나 FooObject과 아무런 관련이 없습니다. 에 액세스 할 수 없으며, 실제로 액세스 할 수있는 곳은 File입니다.

작업 :

class Foo< BasicObject 
    def self.file_size 
    ::File.size(__FILE__) 
    end 
end 

p Foo.file_size # => 132 

여기에도 있지만, FooObject와 관계없는, 그러나 우리는 루비를 말하는 (:: 일정 범위 결정 연산자를 사용하여) 명시 적으로있는 것을 우리는 File 클래스에 액세스하려고하는 곳에서 (클래스도 Ruby에서 일정 함을 기억하십시오. Foo 클래스 안에 있습니다. 따라서 여기에 루비로부터 아무런 이의가 없습니다.

코드에 이러한 상황이 있는지 확인하십시오.

6

File.exists?("path to file")을 사용하는 범위에 File이라는 다른 상수가 있습니다. 당신이 :: 연산자를 사용하는 경우, 당신은 사이드 노트, File.exists에 Object (Object::File)

+0

* 당신이 사용하고있는 범위에'File'이라는 이름의 다른 상수가 있습니다 ... * 어떻게 이것을 알게 되었습니까? 또 다른 상수'File'이 있습니까? –

+0

@ArupRakshit chef는''Chef :: Provider :: File''처럼 정의 된 몇 가지 자체''File'' 상수를 가지고 있기 때문에 그 중 하나가''Object :: File'' 상수를 숨기고 있습니다. – avlazarov

+0

첫 번째 것은 Chef Provider 파일입니다. Cookbook 파일은이 클래스를 확장합니다. – PatrickWalker

-1

에서 File 상수를 찾기 위해 루비를 말하는거야? File.exist를 사용합니까?

는 소탈한에 따르면, 문제는 이런 식으로 질문한다 : "개체가, 당신이 존재한다"

가 "object.exist?"

염두에 두라. 예, "파일이 존재하는 경우"는 적절한 영어가 아니며, 이지만 루비 오브젝트에서 잘못했을 수 있습니다. point.

주요 내용 :: - 이것은 최상위 범위를 나타냅니다.

일반적으로 클래스 또는 모듈의 이름이 인 경우에만 필요하지 않습니다.

관련 문제