2009-10-06 4 views
8

어떻게 변환 할 수 있습니까? obj를 def 내부의 obj라는 변수로 다시 변환 할 수 있습니까?Ruby - 심볼을 변수로 변환

def foo(bar) 
    bar.some_method_call 
end 

foo :obj 

UPDATE : 마지막 코드는 이것보다 더 정교하지만 ...

내가

foo :obj 

대신

foo obj 
말할 수 있기를

일부 DSL과 유사한 구문으로 작업하고 있습니다. 그리고이 한 가지 변화는 일을 조금 더 명확하게 읽을 수있게합니다.

+0

이 바 안에 표시하여 심볼을 의미 하는가, 직접 인스턴스 변수에 해당

또 다른 대안은 foo는 호출하고 바인딩 전달하는 것입니다? – Matt

답변

0

당신은 거의 확실 할 수 없습니다. 이 정의는 호출 범위의 로컬 변수에 액세스 할 수 없습니다. 당신이하려고하는 것을 좀더 완전히 설명하고 싶다면, 우리는 유용한 대안을 제시 할 수있을 것입니다.

+0

업데이트 및 주석 참조 – BuddyJoe

11

예를 들어 어떤 종류의 변수가 obj입니까? foo가 호출 된 범위의 로컬 변수 인 경우 현재 바인딩을 두 번째 매개 변수로 전달하지 않으면 foo 내부에서 액세스 할 수 없습니다. 인스턴스 변수 @obj에 액세스하려면

, 그것은 쉽게 :

def foo(bar) 
    instance_variable_get("@#{bar}").length 
end 

@obj = "lala" 
foo("obj") #=> 4 
+0

obj가 foo의 범위 밖에 있습니다. +1 좋은 정보 – BuddyJoe

1

당신은 변수 나 접근 방법을 의미합니까? Sepp2k는 인스턴스 변수의 이름을 지정했습니다. 접근에 대한

def foo(bar) 
    self.send(bar).some_method_call 
end 
4

당신은 그것은 조금 이상한,하지만 당신은 빈 블록을 통과하고자하는 경우 (어쨌든 하나를 통과하는 경우 또는), 당신이 얻을 수있는 평가를

def foo(bar) 
    eval(bar.to_s).some_method_call 
end 
3

를 사용할 수 사용 하여 블록 바인딩, 다음 eval를 호출하고 바인딩을 통과 :

def foo(symbol, &block) 
    binding = block.send(:binding) 

    eval(symbol.to_s, binding) 
end 

var = 3 

puts foo(:var) {} 

이 인쇄됩니다 3.

또는 ActiveSupport에는 Binding.of_caller라는 항목이있을 수 있으므로 사용할 수 있으므로 블록을 통과 할 필요는 없지만 실제로 작동하는지는 잘 모릅니다.

def foo(binding, symbol) 
    eval(symbol.to_s, binding) 
end 

binding = self.send(:binding) 
var = 3 

puts foo(binding, :var) 
관련 문제