[ruby技巧] 如何判断属性、变量是否存在

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

if config.spring
    require 'java_side/spring'
    p 'spring supported'
end

 

但是,这么做有问题——用户很容易就忘记设置config里面的spring参数,结果这个读取属性的方法不存在

.../railties-3.0.6/lib/rails/railtie/configuration.rb:77:in `method_missing': undefined method `spring'
 for # (NoMethodError)
	from /home/john/projects/demo/vendor/plugins/java_side/init.rb:14

 

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

if config.respond_to? 'spring'
    require 'java_side/spring'
end

 

respond_to? 作用类似反射,会检查当前是否存在一个名为指定参数的 method ( 详见 这里 )

 

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

 

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

begin
    config.spring
rescue
    nil
end

 

可以简化为

config.spring rescue nil

 

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

 

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

    if (config.spring rescue nil)
      require 'java_side/spring'
      p 'spring supported'
    end

    if (Warbler.class rescue nil)
      require 'java_side/warbler'
      p 'warbler extended'
    end

 

看起来好多了,收工!

 

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

require 'java_side/warbler' if defined?(::Warbler)

 真是让人情何以堪阿)

你可能感兴趣的:(Ruby,Spring,Rails,Java)