:: 사이에 차이가 있나요?그리고 .Ruby에서 클래스 메소드를 호출할 때?

StackOverflow https://stackoverflow.com/questions/43134

  •  09-06-2019
  •  | 
  •  

문제

간단한 질문인데 제가 궁금했던 질문인데...다음 두 명령 사이에 기능적 차이가 있나요?

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 이다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top