2012-12-10 8 views
2

메소드를 문자열로 호출하는 방법을 아는 사람이 있습니까? 예 :이름으로 메소드 호출하기

case @setting.truck_identification 
when "Make" 
    t.make 
when "VIN" 
    t.VIN 
when "Model" 
    t.model 
when "Registration" 
    t.registration 

.to_sym이 작동하지 않는 것 같습니다.

+0

이 질문은 정당하다, 그것은 변수에 주어진 메서드를 호출하는 방법에 관한 것입니다. – rewritten

답변

5

사용 .send :

t.send @setting.truck_identification.downcase 

2

당신은 Object#send을 사용하려는거야 (작동하는 vin가와 downcase한다),하지만 당신은 올바른 케이스로 전화를해야합니다 .

[1,2,3].send('length') 
=> 3 

편집 : 예를 들어 예기치 않은 버그로 이어질 것입니다 나쁜 관행처럼 보인다 때문에 나는 그것을 추천 주저 것이지만 또한, 당신은 방법의 목록을 검색하여 다른 케이스를 처리 할 수 객체 지원.

method = [1,2,3].methods.grep(/LENGth/i).first 
[1,2,3].send(method) if method 
=> 3 

우리는 대소 문자를 구분하지 정규식을 사용하여 모든 방법을 통해 grep을, 어떤이 발견 된 경우 다음 개체에 먼저 반환 기호를 보냅니다.

1

Object#send 메서드를 사용하면 메서드 이름을 문자열로 전달할 수 있습니다. 예를 들어 :

t.send(@setting.truck_identification) 

당신은 String#downcase 방법으로 truck_identification을 정상화해야 할 수도 있습니다.

1

방법을 통해 그릴 때 가장 깨끗한 방법이 아닙니다. 그냥 사용 #respond_to?()

method = @setting.truck_identification.downcase 
if t.respond_to?(method) 
    t.send(method) 
end 
+0

깨끗한 방법을 이용해 주셔서 감사합니다. 정말 고마워. –

관련 문제