首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类似Ruby switch的习惯用法

类似Ruby switch的习惯用法
EN

Stack Overflow用户
提问于 2010-04-02 18:45:43
回答 3查看 323关注 0票数 0

我最近在Ruby on Rails中启动了一个项目。我以前所有的项目都是用Python完成的,但我决定给Ruby一次机会。

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

Dictionary or If statements, Jython

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

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

有谁能帮帮我吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-02 19:06:02

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

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2010-04-02 19:04:51

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

代码语言:javascript
运行
复制
case thing
when 'something'
   do_something
when 'nothing'
   do_nothing
else
   do_fail
end
票数 2
EN

Stack Overflow用户

发布于 2010-04-02 19:14:26

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

代码语言:javascript
运行
复制
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

然后,您可以执行以下操作:

代码语言:javascript
运行
复制
h = MyHandler.new
h.handle 'test', 'example'
h.handle 'other', 'example'
h.handle 'missing', 'example'

输出结果为:

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2566209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档