我最近在Ruby on Rails上开始了一个项目。我曾经在Python中做过我的所有项目,但决定给Ruby一个镜头。
在我用Python编写的项目中,我使用了一个很好的小技术,在这篇文章的正确答案中解释了:
Dictionary or If statements, Jython
我使用这种技术是因为Python没有本机切换功能,它也摆脱了大的if else块
我一直在尝试在Ruby中重新创建上面的方法,但似乎无法完全理解它。
有人可以帮帮我吗?
答案 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