2013-07-19 7 views
0

편리한 util 메서드를 사용하고 싶습니다. Enumerable 계약 (즉, each 구현)을 충족하지만 Enumerable을 포함하지 않는 개체에 대해서는 특히 Enumerable#to_a입니다.해당 믹스 인을 포함하지 않는 객체에서 믹스 인 메서드 호출

나는이 작동하는 것 같다 것을 알아 냈어요 :

Enumerable.instance_method(:to_a).bind(obj).call 

그러나 이것은 정말 장황하고 해제 Rubyesque 것으로 보인다. 이 작업을 수행하는 더 나은/청소기/빠른 방법이 있습니까? 의도하지 않은 결과를 피하기 위해 기본 개체를 수정하지 않는 것이 좋습니다.

본질적으로, 나는 javascript의 apply 또는 call을 찾고 있습니다.

편집 :이에 대한 나의 동기는 본질적으로 캡슐화 : 나는, 내가 작성하지 않은 클래스의 객체에이 작업을 수행하고 싶습니다, 정말 깊이 이해 할 필요가 없습니다 통제하지 않으며, 수도 자신의 메서드가 범용 구현으로 대체 될 가능성이있는 것에 심하게 반응합니다. Enumerable을 포함하는 것이 대부분의 경우에 잘 작동한다는 것을 알지만, 잘못 될 경우 디버깅하는 것이 쉽지 않기 때문에 침입하지 않고 mixin의 이점을 얻을 수있는 간단한 방법이 있다면 좋을 것입니다.

+2

왜 당신은 그냥 고려하지 않고있다 Enumerable에서 포함 :

난 후 다음과 같은 것은 할 것? 그게 뭐가 잘못 됐어? –

+0

클래스는 내가 제어하지 못하는 라이브러리의 일부이며 일반적으로 모범 사례로서 내부 구조가 엉망이되는 것을 최소화하고 싶습니다. 기본적으로 클래스의 기존 메서드를 덮어 쓰고 해당 클래스의 다른 소비자에게 영향을 미칠 이유는 없습니다. 내 말은, 그럴 가능성이별로 없다는 것입니다. 하지만 다른 방법이 있다면 위험이 모호한 이유는 무엇입니까? –

답변

1

어떤 이유로 든 클래스 정의를 include Enumerable으로 수정하고 싶지는 않지만 특정 인스턴스를 확장 할 수도 있습니다.

그래서 당신은 obj 구현 each 그래서 그냥이 작업을 수행 할 수있는 것을 나타낼 :

obj.extend(Enumerable).to_a 

아, 원래의 질문에서 내가 목표는 그래서 인스턴스가이었다 확장, 단지 클래스를 수정하지라고 생각 가장 논리적 인 해결책. 그러나 클래스 또는 인스턴스를 수정하고 싶지 않은 것처럼 들립니다.

obj.to_enum.to_a 
+0

이렇게하면 개체의 모든 인스턴스가 확장되지 않지만 여전히 개체 캡슐화를 위반합니다. 그러나 이상적이지는 않습니다. 또한이 모든 작업을 수행하면 느린 해결책이 될 수 있습니다. –