`
fsword
  • 浏览: 168547 次
  • 性别: 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中的方法可以定义在类、模块或对象上,支持块(block)和Proc对象。 - 控制结构:包括条件语句(如if、unless)、循环(如for、while...

    eloquent ruby

    - 调试技巧,包括使用p方法打印变量值、调试工具如byebug等。 7. **Ruby生态系统** - 宝石(Gems)管理:Bundler用于项目依赖管理。 - 社区资源和最佳实践。 - 部署和运维相关的工具与服务。 8. **面向Web开发**...

    Ruby语言入门教程

    Ruby是一种面向对象的脚本...通过学习这个教程,你将能够理解Ruby的基本概念,编写简单的程序,并逐渐掌握更高级的编程技巧。在实践过程中,不断加深对Ruby的理解,你将发现它不仅是一种工具,更是一种享受编程的方式。

    Programming Ruby.pdf

    书中通过大量的实例和详细的解释,帮助读者掌握Ruby的核心概念和编程技巧。此外,该书还涵盖了Ruby生态系统中的各种工具和库,如Rake、RSpec等,这些工具极大地丰富了Ruby的开发环境,使得Ruby成为了一种既强大又...

    Programming-Ruby-1.9源代码

    - 变量:Ruby支持局部变量、实例变量、类变量和全局变量,源代码中会展示它们的用法和作用域。 - 数据类型:包括字符串、数字、布尔值、数组、哈希等,通过代码你可以看到它们的操作和转换方式。 - 控制结构:如...

    Ruby中文教程。。。

    本教程将针对中文用户,深入浅出地讲解Ruby的基础知识和进阶技巧,帮助大家快速掌握这门强大的编程工具。 一、Ruby基础 1. 变量:Ruby中的变量分为局部变量、实例变量、类变量和全局变量,它们有不同的标识符和...

    ruby元编程.pdf

    Ruby元编程是Ruby编程语言中的一个重要特色,它指的是Ruby语言允许程序员在运行时对类、方法和变量等进行操作的能力。通过元编程,开发者可以编写出更加简洁、灵活和高效的代码。《Metaprogramming Ruby》这本书深入...

    Ruby - Ruby for Rails

    - **变量类型**:介绍 Ruby 中不同类型的变量,如局部变量、实例变量、类变量等。 - **变量作用域**:讲解变量的作用域规则,包括局部作用域、块作用域、类作用域等。 - **动态类型**:探讨 Ruby 的动态类型系统,...

    Ruby 学习指南.rar

    - 变量:Ruby有五种变量类型,包括局部变量、实例变量、类变量、全局变量和常量,它们以不同的符号开头,如`$`、`@`、`@@`、`=`和大写字母。 - 数据类型:Ruby是动态类型语言,支持字符串、数字、布尔值、数组、...

    Ruby最简单的初级教程

    1. 变量:Ruby有四种变量类型,分别是局部变量(以小写字母或下划线开头)、实例变量(以`@`开头)、类变量(以`@@`开头)和全局变量(以`$`开头)。 2. 数据类型:Ruby支持基本数据类型如整数、浮点数、字符串、...

    Ruby完全自学手册光盘里的源代码

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力...通过逐个研究和实践这些代码,你不仅可以理解Ruby的基础概念,还能掌握更高级的编程技巧,为成为熟练的Ruby开发者奠定坚实基础。

    Ruby 从入门到精通

    "Ruby 从入门到精通"这本书应该会涵盖Ruby的基础知识、核心概念以及实战技巧。除此之外,还有在线资源如Ruby Docs、Ruby Koans、Ruby Weekly等,以及社区如Ruby China和Stack Overflow,都可以为学习者提供帮助。 ...

    ruby初级中文教程与实例

    1. 变量:Ruby中的变量分为五种类型:局部变量(以小写字母或下划线开头)、实例变量(以`@`开头)、类变量(以`@@`开头)、全局变量(以`$`开头)和常量(以大写字母开头)。每种变量都有其作用域和使用场景。 2. ...

    《Ruby从入门到精通》PDF版本下载.txt

    1. **变量与常量**:Ruby中的变量分为局部变量、实例变量、类变量和全局变量等不同类型。常量则用于存储固定不变的数据。 2. **数据类型**:包括数值类型(整型、浮点型等)、字符串、数组、哈希表等。 3. **控制...

    Ruby黑客指南(Minero Aoki)Ruby Hacking Guide (Minero Aoki)

    在解释器中,哈希表用于实现变量作用域、对象属性、类和模块等。 4. 扫描器和解析器:扫描器的作用是将源代码文本分解成一系列的标记(tokens),而解析器则根据语言的语法规则将这些标记组织成语法树(syntax tree...

    Ruby on Rails入门权威经典

    总的来说,《Ruby on Rails入门权威经典》是一本内容丰富、实践性强的教程,它不仅教授了Ruby on Rails的基础知识,还提供了许多实用技巧和最佳实践,是初学者入门Rails的理想选择。通过阅读本书,读者不仅能学会...

    Ruby语言教程.docx

    - **变量声明**:Ruby中的变量无需显式声明类型,如`a = 10`。 - **数据类型**: - 基本类型:整型、浮点型、布尔型、字符串等。 - 复合类型:数组、哈希表等。 - **运算符**:算术运算符、比较运算符、逻辑运算符...

    ruby hacking guide 中文版教程

    读者将学习如何创建和使用自定义类,理解实例变量、类变量、属性访问器,以及如何利用模块来实现代码重用和分类。 3. **块、迭代器与闭包**:Ruby中的块、迭代器和闭包是其强大的特性之一,它们在处理集合和控制流...

Global site tag (gtag.js) - Google Analytics