我最近在 Ruby on Rails 中启动了一个项目。我以前用 Python 完成所有项目,但决定试一试 Ruby。
在我用 Python 编写的项目中,我使用了一个很好的小技巧,这篇文章的正确答案解释了这一点:
我使用这种技术是因为 Python 没有原生的 switch 函数,而且它也摆脱了大的 if else 块
我一直在尝试在 Ruby 中重新创建上述方法,但似乎无法完全理解。
谁能帮帮我?
我最近在 Ruby on Rails 中启动了一个项目。我以前用 Python 完成所有项目,但决定试一试 Ruby。
在我用 Python 编写的项目中,我使用了一个很好的小技巧,这篇文章的正确答案解释了这一点:
我使用这种技术是因为 Python 没有原生的 switch 函数,而且它也摆脱了大的 if else 块
我一直在尝试在 Ruby 中重新创建上述方法,但似乎无法完全理解。
谁能帮帮我?
虽然没有什么可以阻止您使用基于类的方法,但为什么要避免使用 rubyscase
语句呢?
case thing
when 'something'
do_something
when 'nothing'
do_nothing
else
do_fail
end
如果您只需要通过存储在字符串中的名称来调用方法,那么标准的 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
语句,如前所述。
正如其他人所说,在 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