2016-07-18 2 views
0

레일스 네임 스페이스 및 모듈 조회에 관한이 글을 정말 잘 읽고 있습니다. HereRails와 Ruby 네임 스페이스 규칙.

나는 이것이 무엇을 의미하는지 이해하지 않는다 : 그들은 처음 런타임에 발생하는 경우에만 때 상수는 다음 필요성 자신의로드 순서에 의해,로드

경우 개별 실행 경로에 따라 달라집니다.

individual execution path은 무엇입니까?

나는 비 이해 생각이 이해하지 않는 날 리드 :

을 즉시 이미로드 일정 바즈가 발생 될 때, 레일은 찾고있는 바즈 수 없습니다 이 알고, 그리고 알고리즘이 NameError를 발생시킵니다.

또는 더 중요한 것은이 :

처음, 이전, 아래로 중첩 정보의 손실이다. 레일즈는 Foo :: Qux가 우리가 쫓아 가고 있다는 것을 알 수 없으므로 일단 이 Foo :: Bar :: Qux가 존재하지 않는다는 것을 깨닫게되면 행복하게로드합니다.

그러나 두 번째로 Foo :: Qux가 이미로드되었습니다. 그래서 우리의 레퍼런스는 그 상수가 될 수 없었습니다. 그렇지 않으면 Ruby는 을 해결할 것이고, 자동 로딩은 절대로 호출되지 않을 것입니다. 그래서 우리의 참조가 일 수 있고 (아직) un-yet-unloaded :: Qux로 해결되었을지라도 룩업은 NameError로 종료됩니다.

왜 이미로드 된 상수가 레일을 사용하지 않습니까? 또한 실행하는 이유는 무엇입니까?

Foo::Bar.print_qux 

두 번 다른 결과가 나옵니까?

답변

1

"실행 경로"란 코드가 실행되는 방식을 의미합니다. if 블록 안에있는 X::Y 클래스에 대한 참조가 실행되지 않으면 실행 경로가 무시되어로드되지 않는다는 의미입니다.

이것은 구문 분석 할 때 코드에서 참조하는 모든 클래스를 강제로로드하는 것과는 다릅니다. 주어진 코드 행이 실행될 때만 운동을하면서로드됩니다.

오토로더는 가장 구체적인 것으로 시작하여 점차 글로벌 이름을 찾는 모듈을로드하려는 전략이 있습니다. Qux은 현재 모듈 컨텍스트와 루트 모듈의 루트에 대해 테스트됩니다. 이것이 상징이 어떻게 해석되는지입니다.

이 예제에서 자동로드 된 버전은 실제로 우선 순위면에서 ::Qux보다 앞에 Foo::Qux 정의를 푸시합니다. 이것이 바로 주요 변화입니다.