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?往往不是你需要的,要当心使用。
分享到:
相关推荐
5. 构造器与初始化:在Ruby中,`initialize`方法是构造器,用于对象的初始化。 三、模块和混入 1. 模块(Module):模块用于封装代码,可以包含常量、方法和类。模块之间可以通过`include`或`extend`进行混入,...
Ruby 是一种面向对象的编程语言,以其优雅的语法和强大的面向对象特性著称。在Ruby中,方法和类是构建程序的基本元素,它们是实现代码重用和组织的关键概念。 ### 方法(Methods) 方法在Ruby中是可重复使用的代码...
- `initialize`是类的构造方法,用于初始化实例变量。 - 类方法通过`def self.method_name`定义。 - 实例方法通过`def method_name`定义。 - `@`前缀的变量为实例变量,`@@`前缀的为类变量。 - 创建类对象:`f ...
Ruby on Rails(简称Rails)是一种基于Ruby编程语言的开源Web应用程序框架,专为敏捷开发而设计,强调简洁的代码和“约定优于配置”的原则。它主要用于构建数据驱动的Web应用,借助于MVC(Model-View-Controller)...
- **定义类**:使用`class`关键字定义类,通过`initialize`方法初始化实例变量,并可以通过方法实现类的行为。 - **模块和包含** - **模块**:模块可以包含方法和常量,通过`include`关键字将模块的功能合并到类...
- **初始化方法:** `initialize` 方法在创建新对象时自动调用。 - **访问器方法:** `attr_accessor` 用于定义getter和setter方法。 **3.5 类变量与类方法** - **类变量:** 在类的所有实例间共享的变量。 - **类...
- **初始化方法**:`initialize`用于初始化对象。 - **访问器方法**:`attr_accessor`等用于自动创建getter和setter方法。 - **其他特殊方法**:如`to_s`、`==`等用于对象之间的比较和转换。 ##### 3.5 类变量与类...
**初始化方法**:定义`initialize`方法。 7. **公共实例方法**:定义公共实例方法。 8. **保护类方法**:定义受保护的类方法。 9. **保护控制属性**:定义受保护的控制属性。 10. **保护实例方法**:定义受保护...
- **特殊方法与特殊类**:例如初始化方法、比较方法等特殊方法的作用和用法。 - **类变量与类方法**: - 类变量的定义和使用场景。 - 类方法与实例方法的区别。 - **存取控制**:访问修饰符(如public、private)...
块(Block)则是Ruby中用于传递代码片段的机制,常用于迭代器和高阶函数中。 #### 五、比较运算符与条件判断 `<=>`运算符在Ruby中用于比较两个对象的大小,返回值为-1、0或1,分别表示小于、等于或大于。这个...
10. **变量初始化**:使用`||=`初始化变量,但注意不要用于布尔类型变量。 11. **特殊变量名**:避免使用Perl风格的变量名(如$1到$9),以保持代码的Ruby风格。 #### 命名规范 1. **变量与方法**:变量和方法名称...
- 实例变量可通过初始化方法传递,如上述`"Pat"`。 - **访问控制**: - 直接访问实例变量会导致错误,如尝试访问`g.name`会失败。 - 需要通过方法(如getter和setter)来安全地访问实例变量。 #### 六、总结 ...
- **初始化方法**:`initialize`方法在创建新对象时被自动调用。 - **其他特殊方法**:如`to_s`、`==`等方法,它们为对象提供了标准的行为。 ##### §3.5 类变量与类方法 - **类变量**:以`@@`开头的变量可以在类的...
- 特殊方法通常用于定义对象的行为,例如`initialize`方法用于初始化对象。 - 特殊类如`Kernel`类包含了常用的功能,如输入输出等。 **3.5 类变量与类方法** - **类变量**:在类的所有实例间共享。 - **类方法**:...
- `initialize`:构造方法,用于初始化对象状态。 - `self`:指向当前类的引用。 **3.5 类变量与类方法** 类变量以`@@`开头,可以在整个类的所有实例间共享。类方法则通过`self.method_name`形式定义: ```ruby ...
8. 魔法方法(Magic Methods):如`initialize`(初始化方法)、`to_s`(转化为字符串方法)等,这些方法在特定上下文中自动调用。 9. 元编程:Ruby支持元编程,即在运行时修改程序结构的能力。这使得Ruby代码可以...
11 章 - 保存和加载YAML 简介字符串插值Ruby IO 特性第 12 章 - 对象的新类时间类介绍哈希简介范围介绍第 13 章 - 创建新类,更改现有类创建一个新类实例变量与类变量Ruby 中的初始化过程向现有
反初始化和自动引用计数(ARC)是Swift内存管理的一部分。Swift使用ARC来自动管理内存,避免了内存泄漏问题。自判断链接是Swift中的一个特性,用于安全地访问可选类型中的值,避免强制解包可能引发的运行时错误。...
- **文本解读**:本书包含大量示例代码和解释性文字,帮助读者理解Ruby编程的基本概念和技术细节。 ### 第一部分:基础语法与概念 #### 1. 字符串与内嵌求值 - **字符串操作**:介绍字符串的基本用法,包括创建、...