2010-02-24 7 views
3

개체의 인스턴스 변수 이름으로 매개 변수 값을 어떻게 사용합니까? Ruby - 메서드 매개 변수를 변수 이름으로 사용하는 방법?

내가 다음과 같은 방법 내가 요소 매개 변수에 따라 myVar에 또는 myothervar 중 하나 값 시험 방법의 반환을 어떻게

def test(element) 
    instanceofMyClass.element #this obviously doesnt work 
end 

를 가지고있는 객체

Class MyClass  
    def initialize(ex,ey) 
     @myvar = ex 
     @myothervar = ey 
    end 
end 

입니다. if 조건을 작성하고 싶지는 않지만 가능한 경우 요소를 통해 myvar 또는 myother var를 객체 인스턴스에 전달하려고합니다.

답변

4
def test(element) 
    instanceofMyClass.send(element.to_sym) 
end 

instanceofMyClass가 요소에 응답하지 않으면 누락 된 메서드 오류가 발생합니다. 그것은 하나 개의 나쁜 것은 음부에 액세스하는 데 사용할 수 있다는 것입니다하지만

+1

EmFi의 방법과 광산의 차이점을 명확히 설명합니다.이 방법은 인스턴스 변수에 대한 독자 방법이 필요하며 광산이이를 직접 액세스하는 과정을 거칩니다. – Chuck

+1

to_sym은 필요하지 않습니다. send는 문자열을받습니다. – sepp2k

+0

완벽, "instanceofMyClass.send (element)"모두를 아름답게 해줘서 고마워. 나는 이미 독자가 있기 때문에이 사람은 가장 깨끗하고/쉬운 것 같다. – eakkas

3
def test(element) 
    instanceofmyclass.instance_variable_get element 
end 

test :@myvar # => ex 
test :@myothervar # => ey 
+0

나는 이것이 좋은 깨끗한 것 같아요. – johannes

+0

솔직히 말하면 공공 재산 (EmFi의 경우는 가정)을 말하는 경우'send '를 사용합니다. 그런 식으로 재정의 할 수 있습니다. 이 질문에 대한 일반적인 대답은 인스턴스 변수에 관한 것입니다. – Chuck

0

나는, send()의 단순함을 좋아한다. 이 문제는 여전히 아래 해결 방법으로 남아 있지만 적어도 명시 적으로 지정되어 있으며 독자는 어떤 방법을 전달해야하는지 확인할 수 있습니다. 첫 번째는 위임을 사용하는 반면 두 번째는 위임을 정의하는 데보다 동적 인 방법을 사용합니다.

require 'forwardable' 
class A 
    extend Forwardable 
    def_delegators :@myinstance, :foo, :bar 

    class B 
    def foo 
     puts 'foo called' 
    end 

    def bar 
     puts 'bar called' 
    end 

    def quux 
     puts 'quux called' 
    end 

    def bif 
     puts 'bif called' 
    end 
    end 

    def initialize 
    @myinstance = B.new 
    end 

    %i(quux bif).each do |meth| # note that only A#quux and A#bif are defined dynamically 
    define_method meth do |*args_but_we_do_not_have_any| 
     @myinstance.send(meth) 
    end 
    end 
end 

a = A.new 

a.foo 
a.bar 

a.quux 
a.bif 
관련 문제