:: 사이에 차이가 있나요?그리고 .Ruby에서 클래스 메소드를 호출할 때?
문제
간단한 질문인데 제가 궁금했던 질문인데...다음 두 명령 사이에 기능적 차이가 있나요?
String::class
String.class
둘 다 내가 기대하는 대로 수행합니다. 즉, 그들은 돌아옵니다. Class
-- 하지만 다음을 사용하는 것의 차이점은 무엇입니까? ::
그리고 .
?
상수가 정의된 클래스에서 탭을 누른 후 IRB의 자동 완성 기능이 상수를 사용 가능한 옵션으로 반환한다는 것을 확인했습니다. ::
하지만 그 이후는 아니야 .
, 그런데 그 이유가 무엇인지는 모르겠습니다...
해결책
그만큼 .
연산자는 기본적으로 "이 메시지를 개체에 보냅니다"라고 말합니다.귀하의 예에서는 특정 회원을 호출하고 있습니다.그만큼 ::
연산자는 연산자 왼쪽에 정의된 범위로 "드릴다운"한 다음 연산자 오른쪽에 정의된 멤버를 호출합니다.
당신이 사용할 때 ::
정의된 멤버를 참조해야 합니다.사용할 때 .
당신은 단순히 객체에 메시지를 보내는 것입니다.해당 메시지는 무엇이든 될 수 있으므로 자동 완성은 작동하지 않습니다. .
그러는 동안 ::
.
다른 팁
실제로 자동 완성 기능은 다음과 같은 경우에 작동합니다. .
.완성 옵션은 다음을 호출하여 찾을 수 있습니다. #methods
개체에.재정의하여 직접 확인할 수 있습니다. Object.methods
:
>> def Object.methods; ["foo", "bar"]; end
=> nil
>> Object.[TAB]
Object.foo Object.bar
>> Object.
이는 왼쪽에 있는 표현식이 있을 때만 작동합니다. .
리터럴입니다.그렇지 않으면 호출할 개체를 가져옵니다. #methods
부작용이 있을 수 있는 왼쪽 부분을 평가하는 것이 포함됩니다.이것을 직접 확인할 수도 있습니다.
[continuing from above...]
>> def Object.baz; Object; end
=> nil
>> Object.baz.[TAB]
Display all 1022 possibilities? (y or n)
메소드를 추가합니다 #baz
에게 Object
이는 반환 Object
그 자체.그런 다음 호출할 수 있는 메서드를 얻기 위해 자동 완성합니다. Object.baz
.IRB가 호출된 경우 Object.baz.methods
, 그것은 다음과 같은 결과를 얻을 것입니다 Object.methods
.대신 IRB에는 1022개의 제안이 있습니다.그것이 어디서 왔는지는 확실하지 않지만 실제로 문맥에 기초하지 않은 일반적인 목록임은 분명합니다.
그만큼 ::
연산자는 (또한) 모듈의 상수를 얻는 데 사용됩니다. .
아니다.그렇기 때문에 HTTP
완료 항목에 표시됩니다. Net::
, 하지만 다음에는 해당되지 않습니다. Net.
. Net.HTTP
정확하지 않지만 Net::HTTP
이다.