2012-01-20 6 views
2

데이터를 받고 처리하는 데 rake 태스크를 사용하고 있습니다.쌍의 메소드가있는 루비 해시

데이터는 "code:value"처럼 보이며 각 코드는 특정 작업에 매핑됩니다.

예를 들어, "0xFE:0x47"0x47 매개 변수를 사용하여 0xFE 태그에 해당하는 메소드를 호출합니다. 메시지가 수신 될 때

tags = Hash[0xFA => taskA, 0xFB => taskB, 0xFC => taskC] 

def taskA(value) 
    ... 
end 

def taskB(value) 
    ... 
end 

def taskC(value) 
    ... 
end 

다음,하는 split을하고 해시 메소드를 호출, 같은 :이이 해시에 매핑해야한다고 생각하고, 방법은 아래에 정의한 확장 성을 목적으로

:

tokens = message.split(':') 
tags[tokens[0]](tokens[1]) 

루비는 Hash 초기화를 좋아하지 않습니다. 이 문제를 해결하는 올바른 방법은 무엇입니까?

답변

2

자바 스크립트 에서처럼 메소드가 호출 될 때까지 참조 일 뿐이지 만, 그렇지 않은 경우가있을 것입니다. 가장 좋은 방법은 문자로 유지하는 것입니다 다음을 호출 할 send 방법을 사용하십시오

# Define a mapping table between token and method to call 
tags = { 
    0xFA => :taskA, 
    0xFB => :taskB, 
    0xFC => :taskC 
} 

tokens = message.split(/:/) 

# Call the method and pass through the value 
send(tags[tokens[0]], tokens[1]) 

Hash[] 초기화는 일반적으로 해시로 배열을 변환 할 때와 같은 특별한 경우, 예약되어 있습니다. 이 경우 혼란스럽지 않으면 중복되므로 최상의 결과를 얻을 수 없습니다. { ... }에는 암시 적으로 해시를 만드는 효과가 있습니다.

+0

나는 이미 JavaScript에서 비슷한 구현을 사용하고있다 : 어느 쪽이든, send 메소드는 훌륭하게 작동했다. – dcarneiro

+0

JavaScript에서'taskA'는 메소드 참조이고'taskA()'는 메소드 호출입니다. 루비에서는 대괄호가 선택적이므로'taskA'와'taskA()'는 모두 메소드 호출입니다. 'taskA_proc = method (: taskA)'를 사용하여 Proc를 캡쳐 한 다음'taskA_proc.call()'을 사용하여 나중에 호출 할 수는 있지만 보통'send'를 사용하는 것보다 더 어색합니다. – tadman

2

"좋아하지 않음"을 정의하십시오.

당신이 함수 이름을 사용하여 해시를 초기화하려고하면 다음 함수가 정의

  1. 하기 전에, 당신은 정의되지 않은 기호를 얻을 수 있습니다.
  2. 함수가 정의 된 후에는 함수를 실행하고있는 것입니다.

당신은 프로세서 수/람다 같은 방법을 정의하는 고려, 당신이 호출 할 수있는 기능에 값을 매핑 할 경우 : 당신은 너무 심볼을 저장할 수

> taskA = lambda { |value| puts "foo #{value}" } 
> h = { 0x42 => taskA } 
> h[0x42].call("bar") 
foo bar 

,하지만 난 알려진 기존의 아티팩트를 사용하는 것을 선호 변수처럼, IDE는 – 기호가 임의적이라는 것을 알 수있는대로 내가하는 일을 올바르게 할 수 있도록 도와 줄 수 있으며, 호출하는 대신 다른 기존 방법과 정렬되도록하는 방법이 없습니다.

+0

이것은 잘 작동하고 루비가 어떻게 작동하는지에 대해 머리를 고맙게 생각합니다. 하지만 나는 더 깨끗한 것 같아 @ tadman 솔루션 beucase 끝납니다. 어느 쪽이든 작동 대답 +1 +1 – dcarneiro

+0

@ 대니얼 IMO 오류의 가능성이 커지기 때문에 실제로는 덜 깨끗하지만 단위 테스트는이를 제거하는 데 도움이 될 수 있습니다. IMO는 실제로 알려진 인터페이스를 가진 클래스 여야합니다. * 가장 깨끗한 - IDE 지원, 캡슐화 및 기호를 사용할 필요가 없습니다. –