0

我最近在 Ruby on Rails 中启动了一个项目。我以前用 Python 完成所有项目,但决定试一试 Ruby。

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

字典或 If 语句,Jython

我使用这种技术是因为 Python 没有原生的 switch 函数,而且它也摆脱了大的 if else 块

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

谁能帮帮我?

4

3 回答 3

2

虽然没有什么可以阻止您使用基于类的方法,但为什么要避免使用 ruby​​scase语句呢?

case thing
when 'something'
   do_something
when 'nothing'
   do_nothing
else
   do_fail
end
于 2010-04-02T11:04:51.427 回答
2

如果您只需要通过存储在字符串中的名称来调用方法,那么标准的 Ruby 方法是使用 method 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语句,如前所述。

于 2010-04-02T11:06:02.180 回答
1

正如其他人所说,在 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
于 2010-04-02T11:14:26.320 回答