2

나는 루비의 싱글 톤 클래스에서 일하고 있었고 단지 그것이 작동하는 방식을 기억했다. factory_girl. 그들은 그것을 모두 사용할 수 있도록 긴 방법Factory.create(...)짧은 방법Factory(...) 나는 그것에 대해 생각하고 그들이 어떻게 클래스를 만들 었는지 궁금했습니다. Factory 또한 메소드처럼 작동합니다.루비는 메소드와 클래스가 같은 이름을 어떻게 허용합니까?

그들은 단순히과 같이 두 번 Factory을 사용 :

def Factory (args) 
    ... 
end 

class Factory 
    ... 
end 

내 질문은 : 어떻게 루비는이 작업을 수행합니까? 그리고이 겉으로는 기발한 패턴을 사용할 때 위험이 있습니까?

답변

6

메서드와 변수는 다른 네임 스페이스에 있습니다. 따라서 메소드와 변수 (또는이 경우에는 상수)를 같은 이름으로 가질 수 있습니다. 그러나, 그들을 사용할 때, 루비는 그들을 구별 할 수 있어야합니다. 일반적으로 이는 문제가되지 않습니다. 메시지에는 수신자가 있고 변수에는 없습니다. 메시지에는 인수가 있지만 변수에는 없습니다. 변수는에 할당되며 메시지는 할당되지 않습니다.

수신자가없고 인수가없고 할당이없는 경우에만 문제가 발생합니다. 그렇다면 Ruby는 인수없이 수신자가없는 메시지와 변수를 구분할 수 없습니다. 그래서, 어떤 임의의 규칙을 구성해야하고, 그 규칙은 기본적으로 다음과 같습니다 소문자로 시작하는 모호한 토큰

  • , 하지 않는 긍정적 그것이 알고, 메시지 전송으로 해석하는 것을 선호 변수 상수

참고로 해석하는 것을 선호 대문자로 시작 모호한 토큰

  • 합니다 (파서 (안 (!) 인터프리터) 예는 이전에 할당을 볼 수있다) 그 인수가있는 메시지 보내기 (심지어 i 인수 목록이 비어 있음), 모호성이 없습니다.

    • test() : 분명히 메시지 전송, 여기에 어떤 모호함
    • test : 될 수있는 메시지를 보내거나 변수; 분명히 메시지를 보내고, 여기에는 모호함
    • self.Test : 또한 분명히 메시지 전송, 여기에 어떤 모호함
    • 해상도 규칙은
    • Test() (전 test에 할당이 없었다 제외)가 메시지 전송라고
    • Test : 메시지 보내기 또는 상수 일 수 있습니다. 해상도 규칙은 상수라고합니다.
  • 관련 문제