2010-08-20 4 views
5

거의 모든 메소드 호출을 자식 객체 (기본적으로 위임자 패턴)로 전송하는 프록시 객체를 만들려고합니다. 대부분의 경우, 나는 단지 BasicObject를 사용하고 있고 method_missing을 가진 모든 호출을 자식 객체에 전달하고있다. 여태까지는 그런대로 잘됐다.루비의 대소 문자를 푸는 것 ===, 프록시 객체 사용

x = Proxy.new(15) 
Fixnum === x #=> false, no matter what I do 

물론이 어떤 case x 작업이 실패하게, 프록시를 수 있다는 뜻 :

트릭은 내가 루비의 경우 연산자를 속일 수 없다, 그래서 난 할 수 없어, 그게 내가 수도로 시도이다 다른 도서관으로 안전하게 전달할 수 없습니다.

나는 내 인생을 위해 사용할 수있는 것을 알아 내지 못합니다.

x.is_a?(Fixnum) #=> true 
x.instance_of?(Fixnum) #=> true 
x.kind_of?(Fixnum) #=> true 
x.class #=> Fixnum 

그냥 피할 수없는 마법 어떤 종류의 일을 Module#===가 : 프록시는 모두 올바르게 자식 개체에 전달 내가 알고있는 클래스 기반 성찰의 모든 잘 작동?

+0

경고 단어 : is_a?, instance_of?, kind_of?, class 등을 위임하여 프록시를 'Fixnum'으로 위장하지 않고 목표를 달성 할 수 있다면 그렇게하십시오! 이 방법을 변경하면 코드를 사용하거나 유지 관리하는 사람이 디버깅에 직결 될 수 있습니다. – molf

답변

1

그래, 그렇습니다. Module#===은 C에서 구현되어 객체의 클래스 계층 구조를 직접 검사합니다. 그것을 속일 방법이없는 것처럼 보입니다.

+0

감사합니다. 이것이 무슨 ennui 가져온다. – bhuga

0

나는 당신이 찾고있는 것이 Delegator 클래스라고 생각합니다.

프록시 클래스는 위임자 클래스를 서브 클래스화한 다음 __getobj____setobj__을 정의하여 대상 객체를 가져오고 설정해야합니다.

잊어 버렸습니다. 직접 사용해 보았습니다. 작동하지 않습니다.

편집 : === 방법 언급 grddev

같이, 기술적 인 문제는 Fixnum이라는이를 전송되는 것입니다. 그러나 더 생각해 보면 Ruby의 현재 동작이 정확하다고 생각합니다. Delegator는 구현 세부 사항을 숨기기위한 추상적 인 인터페이스이기 때문에 Proxy의 인스턴스는 kind_of로 정확하게 식별되지 않습니까? Fixnum.

Proxy 클래스를 일종의 Fixnum으로 만들고 메서드로 꾸미려면 python을 서브 클래스로 만들거나 ProxyMethods 모듈을 만들고 Fixnum의 개별 인스턴스를 확장해야합니다.

물론 Fixnum.new를 수행 할 수 없기 때문에 Fixnum을 서브 클래스 화하여 단일 인스턴스를 확장해야하지만 일반적인 규칙이 적용됩니다.

+0

기술적 인 행동은 프로그래머가 사용할 수없는 객체 인트로 스펙 션이 있다고 가정 할 때만 정확합니다. 프로그래머가 C에있는 것처럼 보입니다. 불행히도이 프록시는 Fixnums뿐만 아니라 모든 종류의 객체를 추적해야합니다. 그래서 확장은 실제로 도움이되지 못합니다 (그리고 다양한 이유로, 객체를 확장하는 것도 유용하지 않습니다). – bhuga

+0

글쎄, 나는 당신의 요점을 참조하십시오. 당신은 ============================================ ============================================================================== 그래도 개체로 가장 할려고하지만 일종의 메타 기능을 원한다면 개별 개체를 꾸미고 추적하는 Tracking 클래스를 만드는 것이 더 나은 디자인입니다. 비 - 싱글 톤 객체를 확장 할 수 있으며 싱글 톤 인스턴스 (Fixnum 및 Symbol)를 래핑하고 확장하거나 특수 처리 할 수 ​​있습니다. – guns

0

문제는 Fixnum === x입니다. 즉, === 메서드는 Fixnum에서 호출되며 x에서는 호출되지 않습니다. 모든 === 메소드를 대체 할 수 있으며 (새로운 === 메소드가 도입 된 시점을 지켜보십시오), 이는 많은 작업이 될 것이며 매우 취약합니다.

0

BlankSlate 클래스를 검색해야합니다. 이 클래스는 일반적인 Object에서 대부분의 메서드를 제거하고 웹 사이트는 호출되는 모든 메서드를 인쇄하는 간단한 Proxy 클래스의 예제를 제공합니다. 이 소리는 어떤 일이 일어나고 있는지 더 잘 보여줍니다. 미안해, 나는 풀어서 대답 할 수는 없지만 나는 내 전화에있어. 희망이 도움이됩니다.