`

艺术的Ruby 优雅代码 关于变量初始化和返回值

阅读更多

Chris Wanstrath曾有一篇博文优化初始化变量和返回值。下面是一些进一步的讨论:


原始的丑陋代码如下:
def logger
  unless @logger
    @logger = Logger.new(STDOUT)
    @logger.level = Logger::WARN
  end
  @logger
end


Chris'的改进:
def logger
  return @logger if defined? @logger
  @logger = Logger.new(STDOUT)
  @logger.level = Logger::WARN
  @logger
end


作者本人更倾向:

def logger
  @logger || begin
    @logger = Logger.new(STDOUT)
    @logger.level = Logger::WARN
    @logger
  end
end


值得探讨的是,博主的愿意是希望用@logger ||=的方式表达,如果有一个构造函数返回本身会看起来更漂亮。或者,在加上一个反射,如下:

def logger
  @logger ||= default_logger
end

def default_logger
  logger = Logger.new(STDOUT)
  logger.level = Logger::WARN
  logger
end


当然,如果你有更强的风格,也可写成这样:
def logger
  @logger ||= Logger.new(STDOUT).tap {|l| l.level = Logger::WARN}
end


另外,defined? @logger 和if @logger并不一样,如下:
引用
>> defined?(@logger)
=> nil
>> @logger
=> nil
>> @logger = nil
=> nil
>> defined?(@logger)
=> "instance-variable"


因此,当你试图判断@logger是否为nil的时候,defined?往往不是你需要的,要当心使用。

0
0
分享到:
评论
3 楼 Hooopo 2009-12-17  
还是 ||= 帅
2 楼 夜鸣猪 2009-12-17  

哈哈,常来常往
black_star 写道
打酱油的,路过。

1 楼 black_star 2009-12-17  
打酱油的,路过。

相关推荐

    ruby初级中文教程与实例

    5. 构造器与初始化:在Ruby中,`initialize`方法是构造器,用于对象的初始化。 三、模块和混入 1. 模块(Module):模块用于封装代码,可以包含常量、方法和类。模块之间可以通过`include`或`extend`进行混入,...

    Ruby 方法、类

    Ruby 是一种面向对象的编程语言,以其优雅的语法和强大的面向对象特性著称。在Ruby中,方法和类是构建程序的基本元素,它们是实现代码重用和组织的关键概念。 ### 方法(Methods) 方法在Ruby中是可重复使用的代码...

    ruby语法自整理

    - `initialize`是类的构造方法,用于初始化实例变量。 - 类方法通过`def self.method_name`定义。 - 实例方法通过`def method_name`定义。 - `@`前缀的变量为实例变量,`@@`前缀的为类变量。 - 创建类对象:`f ...

    ruby on rails api

    Ruby on Rails(简称Rails)是一种基于Ruby编程语言的开源Web应用程序框架,专为敏捷开发而设计,强调简洁的代码和“约定优于配置”的原则。它主要用于构建数据驱动的Web应用,借助于MVC(Model-View-Controller)...

    Ruby教程及案例.docx

    - **定义类**:使用`class`关键字定义类,通过`initialize`方法初始化实例变量,并可以通过方法实现类的行为。 - **模块和包含** - **模块**:模块可以包含方法和常量,通过`include`关键字将模块的功能合并到类...

    Ruby程序设计.doc

    - **初始化方法:** `initialize` 方法在创建新对象时自动调用。 - **访问器方法:** `attr_accessor` 用于定义getter和setter方法。 **3.5 类变量与类方法** - **类变量:** 在类的所有实例间共享的变量。 - **类...

    ruby基础知识

    - **初始化方法**:`initialize`用于初始化对象。 - **访问器方法**:`attr_accessor`等用于自动创建getter和setter方法。 - **其他特殊方法**:如`to_s`、`==`等用于对象之间的比较和转换。 ##### 3.5 类变量与类...

    Ruby语言规范

    **初始化方法**:定义`initialize`方法。 7. **公共实例方法**:定义公共实例方法。 8. **保护类方法**:定义受保护的类方法。 9. **保护控制属性**:定义受保护的控制属性。 10. **保护实例方法**:定义受保护...

    Ruby程序设计高级教程

    - **特殊方法与特殊类**:例如初始化方法、比较方法等特殊方法的作用和用法。 - **类变量与类方法**: - 类变量的定义和使用场景。 - 类方法与实例方法的区别。 - **存取控制**:访问修饰符(如public、private)...

    ruby简单笔记

    块(Block)则是Ruby中用于传递代码片段的机制,常用于迭代器和高阶函数中。 #### 五、比较运算符与条件判断 `<=>`运算符在Ruby中用于比较两个对象的大小,返回值为-1、0或1,分别表示小于、等于或大于。这个...

    GitHub倡导的Ruby代码编写风格总结

    10. **变量初始化**:使用`||=`初始化变量,但注意不要用于布尔类型变量。 11. **特殊变量名**:避免使用Perl风格的变量名(如$1到$9),以保持代码的Ruby风格。 #### 命名规范 1. **变量与方法**:变量和方法名称...

    Ruby入门

    - 实例变量可通过初始化方法传递,如上述`"Pat"`。 - **访问控制**: - 直接访问实例变量会导致错误,如尝试访问`g.name`会失败。 - 需要通过方法(如getter和setter)来安全地访问实例变量。 #### 六、总结 ...

    ruby 程序设计

    - **初始化方法**:`initialize`方法在创建新对象时被自动调用。 - **其他特殊方法**:如`to_s`、`==`等方法,它们为对象提供了标准的行为。 ##### §3.5 类变量与类方法 - **类变量**:以`@@`开头的变量可以在类的...

    Ruby经典学习教程(口碑不错)

    - 特殊方法通常用于定义对象的行为,例如`initialize`方法用于初始化对象。 - 特殊类如`Kernel`类包含了常用的功能,如输入输出等。 **3.5 类变量与类方法** - **类变量**:在类的所有实例间共享。 - **类方法**:...

    RUBY基础入门指南

    - `initialize`:构造方法,用于初始化对象状态。 - `self`:指向当前类的引用。 **3.5 类变量与类方法** 类变量以`@@`开头,可以在整个类的所有实例间共享。类方法则通过`self.method_name`形式定义: ```ruby ...

    运动-Ruby轨迹

    8. 魔法方法(Magic Methods):如`initialize`(初始化方法)、`to_s`(转化为字符串方法)等,这些方法在特定上下文中自动调用。 9. 元编程:Ruby支持元编程,即在运行时修改程序结构的能力。这使得Ruby代码可以...

    learntoprogram:我在 Chris Pine 的《学习编程》第二版中工作时的代码片段

    11 章 - 保存和加载YAML 简介字符串插值Ruby IO 特性第 12 章 - 对象的新类时间类介绍哈希简介范围介绍第 13 章 - 创建新类,更改现有类创建一个新类实例变量与类变量Ruby 中的初始化过程向现有

    The Swift Programming Language中文完整版.pdf

    反初始化和自动引用计数(ARC)是Swift内存管理的一部分。Swift使用ARC来自动管理内存,避免了内存泄漏问题。自判断链接是Swift中的一个特性,用于安全地访问可选类型中的值,避免强制解包可能引发的运行时错误。...

    LittleBookOfRuby

    - **文本解读**:本书包含大量示例代码和解释性文字,帮助读者理解Ruby编程的基本概念和技术细节。 ### 第一部分:基础语法与概念 #### 1. 字符串与内嵌求值 - **字符串操作**:介绍字符串的基本用法,包括创建、...

Global site tag (gtag.js) - Google Analytics