다음 진술은 무엇이 다른가요?루비에있는 파일에 액세스 - 차이점
#(not working)
File.exists?("path to file")
#(working)
::File.exists?("path to file")
저는 Ruby의 Chef 프레임 워크에서 위의 문장을 사용했습니다.
작동하지 : 여기
다음 진술은 무엇이 다른가요?루비에있는 파일에 액세스 - 차이점
#(not working)
File.exists?("path to file")
#(working)
::File.exists?("path to file")
저는 Ruby의 Chef 프레임 워크에서 위의 문장을 사용했습니다.
작동하지 : 여기
이 문제를 복제하려고 수
class Foo< BasicObject
def self.file_size
File.size(__FILE__)
end
end
p Foo.file_size # uninitialized constant Foo::File (NameError)
이유는 File
클래스는 내부 (클래스 Object
의 범위에서 예) 최상위 레벨에서 사용할되고있다 직접/간접 서브 클래스 Object
의 모든 클래스. 그러나 Foo
은 Object
과 아무런 관련이 없습니다. 에 액세스 할 수 없으며, 실제로 액세스 할 수있는 곳은 File
입니다.
작업 :
class Foo< BasicObject
def self.file_size
::File.size(__FILE__)
end
end
p Foo.file_size # => 132
여기에도 있지만, Foo
은 Object
와 관계없는, 그러나 우리는 루비를 말하는 (::
일정 범위 결정 연산자를 사용하여) 명시 적으로있는 것을 우리는 File
클래스에 액세스하려고하는 곳에서 (클래스도 Ruby에서 일정 함을 기억하십시오. Foo
클래스 안에 있습니다. 따라서 여기에 루비로부터 아무런 이의가 없습니다.
코드에 이러한 상황이 있는지 확인하십시오.
File.exists?("path to file")
을 사용하는 범위에 File
이라는 다른 상수가 있습니다. 당신이 ::
연산자를 사용하는 경우, 당신은 사이드 노트, File.exists에 Object
(Object::File
)
* 당신이 사용하고있는 범위에'File'이라는 이름의 다른 상수가 있습니다 ... * 어떻게 이것을 알게 되었습니까? 또 다른 상수'File'이 있습니까? –
@ArupRakshit chef는''Chef :: Provider :: File''처럼 정의 된 몇 가지 자체''File'' 상수를 가지고 있기 때문에 그 중 하나가''Object :: File'' 상수를 숨기고 있습니다. – avlazarov
첫 번째 것은 Chef Provider 파일입니다. Cookbook 파일은이 클래스를 확장합니다. – PatrickWalker
에서 File
상수를 찾기 위해 루비를 말하는거야? File.exist를 사용합니까?
는 소탈한에 따르면, 문제는 이런 식으로 질문한다 : "개체가, 당신이 존재한다"
가 "object.exist?"
염두에 두라. 예, "파일이 존재하는 경우"는 적절한 영어가 아니며, 이지만 루비 오브젝트에서 잘못했을 수 있습니다. point.
주요 내용 :: - 이것은 최상위 범위를 나타냅니다.
일반적으로 클래스 또는 모듈의 이름이 인 경우에만 필요하지 않습니다.
전체 코드를 확인해야합니다. 공유하십시오 –
이 질문은 실제로 요리사와 관련하여 매우 합법적입니다. Chef에서'File'은'Chef :: Resource :: File'을 가리키고, :: :: File은 최상위 루비'File' 클래스를 가리 킵니다. – sethvargo