2010-12-27 3 views
2

저는 Ruby 모듈에 임시 수정을 편리하게 적용 할 수있는 Ruby 라이브러리를 보았습니다 (저는 보석으로 패키지 된 적이 없었습니다). 그것은 당신이 바로 얻을 수 영구적으로 (코어) 모듈을 오염 특정 장소에서 수행 특별한 뭔가가 필요하지 않은 것을 확인했다임시적으로 Ruby 모듈을 수정하는 라이브러리

with(modifications) do 
    [interesting stuff requiring the modifications] 
end 

: 이러한 수정은처럼 '과'선언 내에서 실행 블록 내에서 활성화 될 것입니다.

내가 원하는 것의 구체적인 예로 : 'in'을 정의하고 싶습니다. Fixnum이라는의 방법은, 내부 DSL 사용자가 입력 할 수 있도록 :

if value.in? [12, 16, 27, 28] 
    [do something interesting] 
end 

은 내가 '와'방법으로 DSL 평가를 포장 것이고 나는이 함께 Fixnum이라는 오염해야하지 않을까요? 방법. 나는 이것을하기에는 너무 어렵지 않다는 것을 압니다. 그러나 어쩌면 어두운 구석이있을 것입니다. 그리고 저는이 도서관이이 목적에 매우 편리하다는 인상을 받았습니다.

내가 찾는이 라이브러리의 이름을 아는 사람이 있습니까? 나는 그것이 'plusplus'와 같은 것이었던 것을 기억하는 것처럼 보이지만, Google은 나에게 아무것도주지 않는다.

답변

1

나는 결국 대답을 보니 : Rewrite gem by raganwald. 불행하게도 그것은 단지 개념의 증거 일 뿐이며 그다지 많은 것이 없습니다. 루비를 구문 분석하여 AST로 변환하고, 트리를 mangling하고, 결과를 다시 Ruby로 변환합니다. 이것은 물론 엄청나게 강력하지만, raganwald는 특정 manglings을 구현하기위한 일반적인 도구를 소개하는 데 결코 몰두하지 않으며 새로운 mangings을 만드는 것은 자신의 말로 '고문'입니다.

문자열에 in? 메서드를 구현하면 문자열에서 in?을 호출하고이를 다른 메서드 호출로 변환하는 것을 나타내는 특정 S- 식을 AST에서 검색한다는 의미입니다. 로컬 이름 공간에 in?(string, args) 일 수 있습니다. 이것은 곧 정적 유형 검사의 문제로 바뀝니다. 각 in?String#in?으로 해석하지 않도록하십시오.

+1

[GitHub 저장소 링크] (https://github.com/raganwald/rewrite)가 깨졌으며 저장소가 [raganwald의 GitHub 프로필] (https://github.com/raganwald)에 없습니다. 하지만 다시 쓰기에는 [RubyForge 페이지] (http://rewrite.rubyforge.org/)가 있으며 [RubyGem] (https://rubygems.org/gems/rewrite)이지만 마지막으로 업데이트되었습니다. 2008 년 7 월 18 일. –

0

이 방법 교체 많이 (등등 alias_method, 모듈 포함 등)에 접근이다 그래서 추상적 인 코드를 제공합니다 :

def with_modification 
    replace_method # for instance, alias_method 

    yield  

    replace_method_back 
end 

작동합니다. 물론이 방법을 유연하게 만들기 위해 정확히 무엇을 변경하고 싶은지에 대한 설명을 제공함으로써이 DSL을 향상시킬 수 있습니다. 이는 완전히 당신에게 달린 것입니다.

+2

아주 간단한 구현은 어렵지 않지만, 알기도 전에 이름 충돌, 예외 처리 및 문제가되지 않거나 명백한 다른 합병증 처리를 적절하게 처리하여 확장 할 것입니다. 먼저. 재미 있긴하지만 이미이 기능을 제공하는 데 꽤 성숙한 라이브러리를 본적이 있다는 것을 확신 할 때 내 고용주의 시간 낭비입니다. – Confusion

관련 문제