2016-12-31 7 views
4

루비에서 일부 보석은 "전역 네임 스페이스를 오염"하도록 선택합니다."전역 네임 스페이스를 오염시키는"것은 무엇을 의미합니까?

이것은 무엇을 의미합니까?
어디에서 어떻게되는지 알 수 있습니까?
왜 보석을 사용해야합니까?

글로벌 네임 스페이스와 충돌하는 두 개의 보석에 직면했을 때 내가 "격리"할 때 어떤 단점이 있습니까? 예를 들어

: 나는 모두 전역 네임 스페이스를 오염 두 개의 보석을 사용하고

: prygli 그래서 나는 더 이상 원하는 내 binding.pry의를 배치 할 수 아니에요.

solution

는 모듈의 전체 CLI를 래핑하는 것입니다 :
module Wrapper 
    include GLI::App 

    extend self 
    program_desc "..." 
    ... 

    exit run ARGV 
end 

지금 내가 원하는 목적지까지 내 binding.pry의를 사용할 수 있어요.

왜 작동 했습니까?
"gli 격리"를 선택하면 어떤 상쇄 관계가 있습니까? 또는 "GLI::App 모듈을 분리합니까?"

답변

1

루비는 모든 코드에서 공유하는 단일 루트 네임 스페이스를 가지고 있으며 거기에서 정의하는 모든 상수 및 전역 변수는 전체 애플리케이션에서 보편적입니다. 네임 스페이스를 조심하지 않으면 충돌이 불가피합니다.

구조체는 네임 스페이스 프리미티브로, 모든 상수는 거기에 정의 된 모든 클래스에 로컬됩니다. 원한다면 클래스를 네임 스페이스로 사용할 수도 있습니다. 여러분에게 달려 있습니다.

include을 루트 네임 스페이스에 강제로 삽입하는 것이 큰 문제입니다. 이것은 대개 아주 작고 독립적 인 빠른 스크립트에서만 수행됩니다. 그 두 가지 맥락에서 모든 상수와 방법을 함께 모으고, 잠재적으로 그것들을 덮어 쓰는 것처럼 당신이 사소한 일을 할 때 들어가는 것은 나쁜 습관입니다.

+0

왜 두 가지가 그리 좋지 않은데 GLI는 글로벌 네임 스페이스를 오염 시키려고합니까? – mbigras

+1

'pry'와 같이 핀을 잡아 당기면'irb'와 같이 기본적으로 Ruby를 제어합니다. 잘 동작 할 것으로 기대되지 않습니다. 조건부로 실행해야하는 경우, 귀하의 접근 방식은 대개 유효합니다. – tadman