`
fsword
  • 浏览: 165241 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[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 #<Rails::Application::Configuration:0x2c642c2e> (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)

 真是让人情何以堪阿)

0
0
分享到:
评论

相关推荐

    类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范

    类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范

    Ruby语言教程:Ruby 变量示例

    Ruby语言教程:Ruby 变量示例

    解析 ruby 全局变量

    ruby&gt; $foo nil ruby&gt; $foo = 5 5 ruby&gt; $foo 5 应谨慎使用全局变量.由于在任何地方都可以被写因此他们相当危险.滥用全局变量会导致很难隔离臭虫;同时也视为程序的设计未经严格考虑.当你发现必须要使用全局...

    Ruby中的变量学习总结

    Ruby中的变量有几种形式,分别是局部变量、实例变量、类变量、全局变量,对于初学者来说,常常容易搞混,尤其像本人这种做java的,理解起来还是头痛,经过仔细辨别学习,将这几种变量的差异及使用场景总结如下: ...

    Ruby-Ruby技巧惯用Ruby重构和最佳实践

    Ruby技巧,惯用Ruby,重构和最佳实践

    Ruby中类变量和实例变量的比较

    主要介绍了Ruby中类变量和实例变量的比较,本文讲解了4点类变量和实例变量的不同之处,并给出了代码实例,需要的朋友可以参考下

    ruby技巧

    ruby技巧.

    ruby 技巧文档

    ruby 技巧

    Ruby基本的环境变量设置以及常用解释器命令介绍

    Ruby 环境变量 Ruby 解释器使用下列环境变量来控制它的行为。ENV 对象包含了所有当前设置的环境变量列表。 对于 Unix,使用 env 命令来查看所有环境变量的列表。 HOSTNAME=ip-72-167-112-17.ip.secureserver.net ...

    01Ruby 变量.docx

    Ruby是一种动态、面向对象的编程语言,它具有简洁、易读的语法,被称为“程序员最好的朋友”。Ruby具有强大的元编程能力,允许开发者在运行时动态修改和生成代码。Ruby还有一个强大的标准库,提供了丰富的工具和功能...

    ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码

    ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码

    ruby 变量

    虽然无类型变量存在一定的缺点,但却有更多的优点并很好的符合Ruby快速简便(quick and easy)的哲学精神. 在大多数语言里,变量都必须指定其类型,可更改性(是不是个常数)和范围;由于类型的不存在,剩下的东西也可由...

    ruby 局部变量

    ruby&gt; $foo nil ruby&gt; @foo nil ruby&gt; foo ERR: (eval):1: undefined local variable or method `foo’ for main(Object) 对局部变量的第一次赋值做的很像一次声明.如果你指向一个未初始化的局部变量,...

    04Ruby 条件判断.docx

    Ruby是一种动态、面向对象的编程语言,它具有简洁、易读的语法,被称为“程序员最好的朋友”。Ruby具有强大的元编程能力,允许开发者在运行时动态修改和生成代码。Ruby还有一个强大的标准库,提供了丰富的工具和功能...

    Ruby-dotenv从env加载环境变量

    dotenv - 从.env加载环境变量

    Sass环境-Ruby2.6.5.zip

    Ruby 安装 - Windows 下面列出了在 Windows 机器上安装 Ruby 的步骤。 注意:在安装时,您可能有不同的可用版本。 Window 系统下,我们可以使用 RubyInstaller 来安装 Ruby 环境,下载地址为:请点击这里...

    Ruby语言教程及案例.docx

    在Ruby中,变量名以小写字母或下划线开头,支持动态类型。使用 `#{}` 可以在字符串中嵌入变量值。 #### 3. 控制结构 ```ruby # 条件判断 if age &gt;= 18 puts "You are an adult." else puts "You are a minor." ...

    Ruby中变量引用时的一些注意点

    主要介绍了Ruby中变量引用时的一些注意点,被当作变量或被当作方法调用的情况,需要的朋友可以参考下

    ruby DBI ruby DBI ruby DBI

    ruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ...

    Ruby技巧,惯用Ruby,重构和最佳实践-Ruby开发

    Ruby技巧,惯用Ruby,重构和最佳实践您是否知道为什么经验丰富的Ruby程序员倾向于获取基本的集合和哈希值,而其他语言的程序员则选择更专业的类? D Ruby技巧,惯用Ruby,重构和最佳实践您是否知道为什么经验丰富的...

Global site tag (gtag.js) - Google Analytics