2010-04-02 1 views
0

저는 최근 Ruby on Rails에서 프로젝트를 시작했습니다. 이전에 파이썬에서 모든 프로젝트를 해왔지만 Ruby를 사용하기로 결정했습니다. 나는 때문에 파이썬은 기본 스위치 기능을 갖는과하지에이 기술을 사용관용구처럼 루비 스위치

Dictionary or If statements, Jython

: 나는이 게시물에 정답으로 설명 좋은 작은 기술을 사용 파이썬에서 쓴 프로젝트에서

또한 다른 블럭을 없애 버려야합니다.

위의 방법을 Ruby에서 다시 만들려고 시도했지만 꽤 얻을 수없는 것 같습니다.

누구든지 도와 줄 수 있습니까?

+1

Ruby에는 대소 문자가 있습니다. 왜 이걸하고 싶어? –

+0

그 무엇보다 호기심이 더 많습니다 :) – RailsSon

+0

한 언어에서 다른 언어로 코드를 변환 할 때 새로운 언어에 대해 새 코드를 관용적으로 작성하는 것이 좋습니다. 다른 말로하면, 다른 언어의 구조를 무차별 적으로 강제하는 대신에 그 구조를 이용하십시오. 이 특별한 경우에, 루비의'Object # send'가 그것을 할 것입니다,하지만 나는 코드 가독성과 유지 보수를 위해서'case/when' 문을 사용하는 것이 더 나을 것이라고 생각합니다. 그들은 당신이 뭔가를 추가해야 할 때 일년 후 지불 할 일이 무엇인지 쉽게 보게합니다. –

답변

2

것은, 그 일을 표준 루비 방법은 방법 Object#send을 사용하고 있습니다 이미 제안 된대로.

+0

#to_sym 호출이 필요하지 않습니다. (send는 문자열과 기호를 모두 허용합니다.) – horseyguy

+0

이전 Ruby 버전에 대해서는 확실하지 않았습니다. 고마워, 나는 대답을 지금 업데이트 할 것이다. –

2

클래스 기반 접근 방식을 사용하는 데 방해가되는 것은 없지만 왜 ruby를 피해야합니까? case statement? 당신이 루비의 case 문을 사용할 수 있습니다, 그렇지 않으면

def extractTitle dom 
    puts "title from #{dom}" 
end 

def extractMetaTags dom 
    puts "metatags from #{dom}" 
end 

dom = 'foo' 

type = 'extractTitle' 
send type, dom 
#=> title from foo 
type = 'extractMetaTags' 
send type, dom 
#=> metatags from foo 

: 한 문자열에 저장된의 이름으로 메소드를 호출해야하는 경우

case thing 
when 'something' 
    do_something 
when 'nothing' 
    do_nothing 
else 
    do_fail 
end 
+0

'method_missing'에 뭔가 빠졌습니까? 확실히 method_missing에 도달하면 객체는 결코'call'에 응답 할 수 없습니다. –

+0

실제로! 멋지다. 어쨌든 메서드를 정의하고 있었기 때문에'method_missing' 만 예외를 트리거했습니다. 중복 코드 예제를 제거하기 위해 업데이트 할 것입니다. – ezpz

0

다른 사람들이 말했듯이 루비에서이 작업을 수행하는 다른 방법이 있습니다. 다만 호기심이 있다면 Ruby에서 파이썬 접근법과 동등합니다 (메서드 이름을 결정하면 Object#send 사용).

h = MyHandler.new 
h.handle 'test', 'example' 
h.handle 'other', 'example' 
h.handle 'missing', 'example' 

을 출력은 다음과 같습니다 :

class MyHandler 
    def handle_test(arg) 
    puts "handle_test called with #{arg}" 
    end 

    def handle_other(arg) 
    puts "handle_other called with #{arg}" 
    end 

    def handle(type, *args) 
    method_name = "handle_#{type}" 
    if respond_to? method_name 
     send(method_name, args) 
    else 
     raise "No handler method for #{type}" 
    end 
    end 
end 

당신은 할 수

handle_test called with example 
handle_other called with example 
handle.rb:15:in `handle': No handler method for missing (RuntimeError) 
     from handle.rb:23