免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4000 | 回复: 1
打印 上一主题 下一主题

如何判断属性、变量是否存在 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-31 13:22 |只看该作者 |倒序浏览
如何判断属性、变量是否存在




java_side 这个插件,运行时需要分辨rails应用是否激活了一些功能,常用的方法是判断参数值,比如:

Ruby代码
  1. if config.spring
  2.     require 'java_side/spring'
  3.     p 'spring supported'
  4. end
复制代码
但是,这么做有问题——用户很容易就忘记设置config里面的spring参数,结果这个读取属性的方法不存在

Ruby代码
  1. .../railties-3.0.6/lib/rails/railtie/configuration.rb:77:in `method_missing': undefined method `spring'
  2. for #<Rails::Application::Configuration:0x2c642c2e> (NoMethodError)
  3.         from /home/john/projects/demo/vendor/plugins/java_side/init.rb:14

复制代码
细节不解释了,关键是这里会抛出异常,不过ruby很灵活,于是我找到了这个方法:

Ruby代码
  1. if config.respond_to? 'spring'
  2.     require 'java_side/spring'
  3. end
复制代码
respond_to? 作用类似反射,会检查当前是否存在一个名为指定参数的 method ( 详见 这里 )



不过,这个方法也不是很通用,因为有时候要判断的不是 method ,例如我判断当前项目是否使用了 warbler 这个 gem,用的方法是看看有没有 Warbler 这个 module,这时 respond_to? 就不管用了



ruby有一个rescue机制,类似java的异常系统,不过语法比较灵活,例如:

Ruby代码
  1. begin
  2.     config.spring
  3. rescue
  4.     nil
  5. end
复制代码
可以简化为

Ruby代码
  1. config.spring rescue nil
复制代码
而且,无论是前一个 begin...end 块,还是后一个代码行,本身都是一条表达式,表达式的值取决于执行结果,如果有异常,那么就返回 rescue 的值(这里是nil,即java中的null)



有了这个武器,最后我是这么做的:

Ruby代码
  1. if (config.spring rescue nil)
  2.       require 'java_side/spring'
  3.       p 'spring supported'
  4.     end

  5.     if (Warbler.class rescue nil)
  6.       require 'java_side/warbler'
  7.       p 'warbler extended'
  8.     end
复制代码
看起来好多了,收工!



(后记:昨天看别人的代码,我还是太土了,更好的方式应该是这样:

Ruby代码
  1. require 'java_side/warbler' if defined?(::Warbler)
复制代码
真是让人情何以堪阿)

论坛徽章:
0
2 [报告]
发表于 2011-05-31 14:31 |只看该作者
顶村艹!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP