2009-12-11 7 views
41
obj = SomeObject.new 

def obj.new_method 
    "do some things" 
end 

puts obj.new_method 
> "do some things" 

괜찮습니다. 그러나, 나는 기존의 방법 내에서 같은 일을 수행해야합니다인스턴스화 된 개체에 메서드 추가

def some_random_method 
    def obj.new_method 
    "do some things" 
    end 
end 

뿐만 아니라 작품을 좋아하지만, 방법 내부의 방법을 가진 것은 꽤 끔찍한 보인다. 문제는 그러한 방법을 추가하는 다른 방법이 있습니까?

+0

당신에게 코드의 두 번째 조각 작품 확신 다음과 같이 루비 1.9+에서, define_singleton_method를 사용하여이 일을 더 나은 방법이? 때문에 메서드 인수를 먼저 그것을 통해 싱글 톤 메서드를 정의하는'obj' 받아야한다고 생각하기 때문에. – Chirantan

답변

66

것은 그것은 오랜 시간이되었습니다) 가지 흥미로운 그럼에도 불구하고

직접 귀하의 질문에 관련 아니지만.

obj = SomeObject.new 

obj.define_singleton_method(:new_method) do 
    "do some things" 
end 
+2

이'do' 블록 안에'@field'를 사용하면 어떻게 될까요? 현재 클래스의 필드에 액세스합니까, 아니면'obj'의 필드를 사용합니까? – ciembor

+1

정말 제대로 테스트하지 않았지만 믹스 인을 말할 수있는 한이 접근법은 동등하지 않습니다. mixin은 그렇지 않지만 외부 값에 액세스 할 수 있습니다. – vise

43

믹스 인을 사용하십시오.

module AdditionalMethods 
    def new_method 
    "do some things" 
    end 
end 

obj = SomeObject.new 
obj.extend(AdditionalMethods) 

puts obj.new_method 
> "do some things" 
6

모듈을 사용할 수 있습니다.

module ObjSingletonMethods 
    def new_method 
    "do some things" 
    end 
end 


obj.extend ObjSingletonMethods 

puts obj.new_method # => do some things 

이제 개체에 메서드를 추가해야하는 경우 모듈에 메서드를 구현하기 만하면됩니다.

7

그냥 흥미로운 점은 주목할 : 대신 들어갔 더라면

:

def my_method 
    def my_other_method; end 
end 

다음 my_other_method 실제로 my_method의 수신기가 인스턴스 인 것을 견딜 수없는 객체의 클래스에 정의된다 .

가고 그러나 경우

(당신처럼) :

def my_method 
    def self.my_other_method; end 
end 

그런 my_other_method는 인스턴스의 eigenclass에 정의된다. 나는이 질문 때문에

관련 문제