2017-01-03 3 views
4

내 루비 코드 Module.prepend 대신 alias_method_chain를 사용하는 방법을 배우고, 나는 어떤 사람들은 (example)를 호출하는 send를 사용하는 것으로 나타났습니다 :왜 사람들은`Module.send (: prepend, ...)`를 사용합니까?

ActionView::TemplateRenderer.send(:prepend, 
    ActionViewTemplateRendererWithCurrentTemplate) 

을 다른 사람이 직접 호출하는 동안 (example) :

ActionView::TemplateRenderer.prepend(ActionViewTemplateRendererWithCurrentTemplate) 

, 나는이 사람이 스타일을 사용 보지 못했다하더라도, 당신도 당신이에서 붙이는있는 모듈이 쓰기 수있는 문서에서 의심 :

module ActionViewTemplateRendererWithCurrentTemplate 
    # Methods you're overriding go here 

    prepend_features ActionView::TemplateRenderer 
end 

이 세 가지 스타일간에 약간의 차이가 있습니까? 다른 사람들보다 하나를 선호하는 이유가 있습니까?

+3

아마도 #include와 #prepend는 Ruby 2.1 이전에 개인적인 방법 이었기 때문에 사람들은 '오래된 습관'때문에이 방법으로이 코드를 작성했을 것입니다. – Matheno

+1

'prepend_features'는'prepend'에 의해 호출되고 일반적으로 직접 호출되지 않도록 의도되거나 설계되지 않은 후크 메소드입니다. –

답변

5

Module#prependadded에서 루비 버전 2.0.0입니다.

그것은 원래 의도 된 사용 사례는 다음과 같은 형식 인과 더불어, 개인 방법으로 추가되었습니다 많은 경우에 사람들에 모듈을 앞에 추가하고 싶다고

module Foo 
    # ... 
end 

class Bar 
    prepend Foo 

    # ... The rest of the class definition ... 
end 

그러나, 그것은 곧 명백하게되었다 클래스의 다른 측면을 정의하지 않은 클래스 (코드 섹션에서). 따라서, 다음과 같은 패턴이되었다 일반 :

Bar.send(:prepend, Foo) 

에서 루비 버전 2.1.0이 문제가 making Module#prepend a public method에 의해 해결되었다 - 그래서 당신은 이제 단순히이를 작성할 수 있습니다

Bar.prepend(Foo) 

을하지만,주의 경우 그 Ruby 2.0.0 (2016 년 2 월 24 일 official support ended에도 불구하고)을 지원하는 데 필요한 라이브러리를 작성한 경우 불행하게도 이전 .send(:prepend, ...) 접근 방식을 고수해야합니다.

Module#include (처음 출시 된 이래로 Ruby 언어 였음)은 <= 2.0.0 버전의 비공개 방법이며 2.1.0에 공개되었습니다.

관련 문제