《Effective Ruby:改善Ruby程序的48条建议》一第1条:理解Ruby中的True

第1条:理解Ruby中的True

似乎每门语言处理布尔值都有其自己的方式。有些语言仅有一种真假值的表示方法。其他语言使用令人困惑的多种类型来表示,它们时真时假。当对条件表达式的真假值判断错误时会导致程序错误。比如,你知道有多少语言用零值表示假吗?零值为真的语言又有哪些呢?
Ruby有自己的做事方式,包括布尔值。幸好,区别真假值的规则非常简单。因为它不同于其他语言(这也是写这一条的原因),所以请确认你理解了以下内容。在Ruby中,除了false和nil,其他值都是真值。
我们有必要花点时间来想一想这意味着什么。这条简单的规则相比其他主流语言显得有些奇怪。在很多编程语言中,数字0表示false,而其他数字表示true。而在Ruby的规则中,数字0表示true。这也许是从其他编程语言转为Ruby程序员时会遇到的最大的陷阱。
如果你过去熟悉的编程语言假设true和false是关键字,这将是Ruby对你玩弄的另一个把戏。它们不是。事实上,true和false被描述为不遵循命名和赋值规范的全局变量。也就是说,它们并不像大多数全局变量一样以字符“$”开头,并且不可以被作为赋值语句的左半边。不过在其他方面都可以将它们视为全局变量。你看:

正如你所见的,true和false的行为都和全局对象一样,与任何对象一样,你能够调用它们之上的方法。(Ruby也定义了TRUE和FALSE这种常量,它们是对这些true和false对象的引用。)同样,它们来源于两个类:TrueClass和FalseClass。两个类中任何一种都允许你创建新的对象;你创建的对象就是true或false。如果了解Ruby条件表达式的用法,你就知道true对象的存在只是为了方便而已。因为false和nil是唯二的假值,因此用true对象表示真值是冗余的,任何非false、非nil的对象都可以表示真值。
用两个值表示假而用其他所有值表示真有时候可能造成困扰。一个常见的例子是如何区别false和nil。这在表示配置信息的对象中会贯穿始终。这些对象中,false表示应该被禁用,而nil表示选项没有显式定义,因而应使用默认值。最简单的区分方法是使用nil?方法,我会在第2条中进一步描述nil?方法。另一种方式是使用“==”操作符并将false作为左操作对象:

在某些语言中,形式化规则要求必须把不变量放在等号操作符的左边。这并不是我建议把false放在“==”操作符左边的原因。在该情况下是有功能性而非形式化原因的。将false放在左边意味着Ruby会将表达式解析为对FalseClass#==方法的调用(该方法继承自Object类)。这样我们可以很放心地知道:如果右边的操作对象也是false对象,那么返回值为true。换句话说,把false置为右操作对象是有风险的,可能不同于我们的期望,因为其他类可能覆盖Object#==方法从而改变这个比较:

当然,这样的写法太愚蠢了。不过在我的经验中,这种方式发生的可能性很大。(顺便提一下,我们将在第12条中多讲一点“==”操作符。)
要点回顾
除了false和nil外所有值都表示真值。
和很多语言不同,Ruby中的0值是真值。
如果你需要区分false和nil,可以使用nil?方法或“==”操作符并将false作为左操作对象。

时间: 2024-10-14 08:19:34

《Effective Ruby:改善Ruby程序的48条建议》一第1条:理解Ruby中的True的相关文章

编写高质量代码改善C#程序的157个建议[IEnumerable<T>和IQueryable<T>、LINQ避免迭代、LINQ替代迭代]

原文:编写高质量代码改善C#程序的157个建议[IEnumerable<T>和IQueryable<T>.LINQ避免迭代.LINQ替代迭代] 前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议29.区别LINQ查询中的IEnumerable<T>和IQueryable<T> 建议30.使用LINQ取代集合中的比较器和迭代器 建议31.在LINQ查询中避免不必要的迭代

编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]

原文:编写高质量代码改善C#程序的157个建议[为泛型指定初始值.使用委托声明.使用Lambda替代方法和匿名方法] 前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊,它是对方法的引用.事件本身也是委托,它是委托组,C#中提供了关键字event来对事件进行特别区分.一旦我们

编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误、不要在不恰当的场合下引发异常、重新引发异常时使用inner Exception]

原文:编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误.不要在不恰当的场合下引发异常.重新引发异常时使用inner Exception] 前言 自从.NET出现后,关于CLR异常机制的讨论就几乎从未停止过.迄今为止,CLR异常机制让人关注最多的一点就是"效率"问题.其实,这里存在认识上的误区,因为正常控制流程下的代码运行并不会出现问题,只有引发异常时才会带来效率问题.基于这一点,很多开发者已经达成共识:不应将异常机制用于正常控制流中.达成的另一个共识是:CLR异常机制带来

编写高质量代码改善C#程序的157个建议[4-9]

原文:编写高质量代码改善C#程序的157个建议[4-9] 前言 本文首先亦同步到http://www.cnblogs.com/aehyok/p/3624579.html.本文主要来学习记录一下内容: 建议4.TryParse比Parse好 建议5.使用int?来确保值类型也可以为null 建议6.区别readonly和const的使用方法 建议7.将0值设为枚举的默认值 建议8.避免给枚举类型的元素提供显式的值 建议9.习惯重载运算符 建议4.TryParse比Parse好 如果注意观察,除st

编写高质量代码改善C#程序的157个建议[C#闭包的陷阱、委托、事件、事件模型]

原文:编写高质量代码改善C#程序的157个建议[C#闭包的陷阱.委托.事件.事件模型] 前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议38.小心闭包中的陷阱 建议39.了解委托的实质 建议40.使用event关键字对委托施加保护 建议41.实现标准的事件模型 建议38.小心闭包中的陷阱 首先我们先来看一段代码: class Program { static void Main(string[] arg

编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]

原文:编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串.实现浅拷贝和深拷贝.用dynamic来优化反射] 前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议13.为类型输出格式化字符串 建议14.正确实现浅拷贝和深拷贝 建议15.使用dynamic来简化反射实现 建议13.为类型输出格式化字符串   有两种方法可以为类型提供格式化的字符串输出. 一种是意识到类型会产生格式化字符串输出,于是

编写高质量代码改善C#程序的157个建议[匿名类型、Lambda、延迟求值和主动求值]

原文:编写高质量代码改善C#程序的157个建议[匿名类型.Lambda.延迟求值和主动求值] 前言 从.NET3.0开始,C#开始一直支持一个新特性:匿名类型.匿名类型由var.赋值运算符和一个非空初始值(或以new开头的初始化项)组成.匿名类型有如下基本特性: 1.既支持简单类型也支持复杂类型.简单类型必须是一个非空初始值,复杂类型则是一个以new开头的初始化项. 2.匿名类型的属性是只读的,没有属性设置器,它一旦倍初始化就不可更改. 3.如果两个匿名类型的属性值相同,那么就任务这两个匿名类型

编写高质量代码改善C#程序的157个建议[动态数组、循环遍历、对象集合初始化]

原文:编写高质量代码改善C#程序的157个建议[动态数组.循环遍历.对象集合初始化] 前言   软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类.不管是数组还是集合类,它们都有各自的优缺点.如何使用好集合是我们在开发过程中必须掌握的技巧.不要小看这些技巧,一旦在开发中使用了错误的集合或针对集合的方法,应用程序将会背离你的预想而运行. 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议16.

编写高质量代码改善C#程序的157个建议[10-12]

原文:编写高质量代码改善C#程序的157个建议[10-12] 前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议10.创建对象时需要考虑是否实现比较器 建议11.区别对待==和Equals 建议12.重写Equals时也要重写GetHashCode 建议10.创建对象时需要考虑是否实现比较器 有对象的地方就会存在比较,就像小时候每次拿着考卷回家,妈妈都会问你隔壁的那谁谁谁考了多少分呀.下面我们也来举个简单

编写高质量代码改善C#程序的157个建议[泛型集合、选择集合、集合的安全]

原文:编写高质量代码改善C#程序的157个建议[泛型集合.选择集合.集合的安全] 前言   软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类.不管是数组还是集合类,它们都有各自的优缺点.如何使用好集合是我们在开发过程中必须掌握的技巧.不要小看这些技巧,一旦在开发中使用了错误的集合或针对集合的方法,应用程序将会背离你的预想而运行. 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议20.使用