Ruby转换就像成语

时间:2010-04-02 10:45:43

标签: ruby switch-statement idioms

我最近在Ruby on Rails上开始了一个项目。我曾经在Python中做过我的所有项目,但决定给Ruby一个镜头。

在我用Python编写的项目中,我使用了一个很好的小技术,在这篇文章的正确答案中解释了:

Dictionary or If statements, Jython

我使用这种技术是因为Python没有本机切换功能,它也摆脱了大的if else块

我一直在尝试在Ruby中重新创建上面的方法,但似乎无法完全理解它。

有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:2)

虽然没有什么能阻止你使用基于类的方法,为什么要避免使用rubys case语句?

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

答案 1 :(得分:2)

如果你只需要通过存储在字符串中的名称来调用方法,那么标准的Ruby方法就是使用方法Object#send

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

否则,您可以使用Ruby的case语句,如已建议的那样。

答案 2 :(得分:0)

正如其他人所说,在Ruby中有另外的方法可以做到这一点,但是如果你只是好奇那么就相当于Ruby中的Python方法(一旦你确定了方法名称就使用Object#send)将是:

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

然后你可以这样做:

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

,输出为:

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