2011-05-11 2 views
2

자바에서 왔고 인트로 스펙 션을 사용하여 객체의 인스턴스 변수를 '설정'할 수 있는지 알고 싶습니다. 예를 들어인트로 검사를 통해 메소드가 읽기 - 쓰기, 읽기 전용 또는 쓰기 전용인지 어떻게 알 수 있습니까?

, 나는 두 개의 인스턴스 변수, first_attributesecond_attribute 다음과 같은 클래스 선언이있는 경우 :

class SomeClass 
    attr_accessor :first_attribute 
    attr_reader :second_attribute 

    def initialize() 
    # ... 
    end 
end 

내가 인스턴스 방법을 얻을 수 있도록하려면 아마도 SomeClass.instance_methods를 호출하고 알을하는 이러한 인스턴스 메소드 중 읽기/쓰기 대 읽기 전용입니다. 내가 루비에서이 작업을 수행하려면 어떻게

PropertyDescriptor[] properties = PropertyUtils.GetPropertyDescriptors(SomeClass); 
for (prop : properties) { 
    if (prop.getWriteMethod() != null) { 
    // I can set this one! 
    } 
} 

: 나는이 작업을 수행 할 수 있습니다 자바에서

?

+0

좋은 소식 : attr_accessor 또는 attr_reader 뒤에 세미콜론이 필요하지 않습니다. –

+0

매우 비슷한 질문입니다 : http://stackoverflow.com/questions/4466541/is-there-a-better-way-to-get-the-public-properties-of-a-ruby-object –

답변

4

가 내장 된 자바 속성 물건처럼 아무것도 정말 아니지만, 당신은 다음과 같이 아주 쉽게 작업을 수행 할 수 있습니다

self.class.instance_methods.grep(/\w=$/) 

가 어떤 클래스의 모든 setter 메소드의 이름을 반환합니다.

+1

'attr_reader : x' getter 인'x' 메소드를 추가합니다. 'attr_writer : x'는 setter 인'x ='메소드를 추가합니다. 'attr_accessor : x'는 둘 다 수행합니다. 즉, "매크로"를 사용하여 필드를 조작하는 클래스에 메서드를 추가합니다. 그래서 Austin Taylor는 정확합니다. 인스턴스 메소드를 하나의 "="로 끝나는 사람들에게만 필터링하고 세터 메소드를 얻는다. 추가로 5 분이 있다면 다음 짧은 글을 참고하십시오 : http://www.rubyist.net/~slagell/ruby/accessors.html – dimitarvp

+0

루비에서는 새로운 클래스 1을 정의하는 동안 실제로 클래스에서 코드를 실행합니다 '문맥에 따라서'self.class.instance_methods'와'self.instance_methods'의 사용은 이것이 쓰여진 문맥에 달려 있습니다. 전자가 ** 내부 ** 메소드 정의와 후자 ** 외부 ** 메소드 정의 인 경우, 이들은 동일한 결과를 산출합니다. – Laas