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

简介:

本节书摘来自华章出版社《Effective Ruby:改善Ruby程序的48条建议》一书中的第1章,第1.1节,作者[美]彼得 J.琼斯(Peter J. Jones),更多章节内容可以访问云栖社区“华章计算机”公众号查看

第1条:理解Ruby中的True

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


0801bbf6495d686cddc05e9fb0a37c4d1efc63f3

正如你所见的,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作为左操作对象:


fad0549bd1d1b25f04a4dbb4c22f46032ececdbf

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


8922951e8809434bf9cb5457833fc523e76facd3

当然,这样的写法太愚蠢了。不过在我的经验中,这种方式发生的可能性很大。(顺便提一下,我们将在第12条中多讲一点“==”操作符。)
要点回顾
除了false和nil外所有值都表示真值。
和很多语言不同,Ruby中的0值是真值。
如果你需要区分false和nil,可以使用nil?方法或“==”操作符并将false作为左操作对象。
相关文章
|
10月前
|
缓存 监控 数据库
使用Ruby构建可扩展的Web应用程序
在当今科技驱动的世界中,Web应用程序成为了企业和个人进行业务活动、提供服务和与用户互动的重要方式。而Ruby作为一种简洁、优雅且易于学习的编程语言,已经成为许多开发者的选择。本篇博客将介绍如何使用Ruby构建可扩展的Web应用程序。
83 0
|
Ruby
【Ruby on Rails全栈课程】2.4 ruby的数据类型--符号(Symbol)、特殊值(True、False 和 Nil)
1、符号(Symbol) 符号对象表示Ruby中的一些名称(类名、方法名、变量名等)和一些字符串。表现形式有:name或者:“string”,创建的对象会储存在ruby的符号表中,相同内容的符号不会再重新创建,在一些情况下,使用符号(Symbol) 处理名字可以降低 Ruby 内存消耗,提高执行速度。
98 0
|
测试技术 C++ Ruby
C++程序中嵌入Ruby脚本系统
Ruby,一种为简单快捷面向对象编程(面向对象程序设计)而创的脚本语言,由日本人松本行弘(まつもとゆきひろ,英译:Yukihiro Matsumoto,外号matz)开发,遵守GPL协议和Ruby License。
1582 0
|
消息中间件 安全 Ruby
Nanite:Ruby程序的一个自我装配集群
本文讲的是Nanite:Ruby程序的一个自我装配集群,Nanite(由Ezra Zygmuntowicz开发)是Engine Yard云计算策略的一个新兵:它是“Ruby程序的一个自我装配集群”,用以构筑高度可伸缩的Web应用的后端。
1103 0
|
程序员 Ruby
《Effective Ruby:改善Ruby程序的48条建议》一导读
学习一门新的编程语言通常需要经过两个阶段。第一阶段是学习这门编程语言的语法和结构。如果我们具有其他编程语言的经验,这个阶段通常只需要很短的时间。以Ruby为例,接触过其他面向对象语言的程序员对Ruby的语法也会比较熟悉。有经验的程序员对于语言的结构(如何根据语法构建应用程序)是很熟悉的。
1216 0
|
C语言 C++ Ruby
编译c语言程序扩展ruby
环境: windows 10 64bit ruby 2.2.4p230 (2015-12-16 revision 53155) [i386-mingw32] gcc version 4.8.
1047 0
|
Web App开发 Ruby
第一个Ruby On Rails WEB应用程序HelloWorld
经过不懈努力终于把Ruby On Ralis 的开发环境搭建好了,在WIN7系统下,赶紧来个最最常用的例子来练练手吧,感受一下Ruby。。。 再次声明一下,我的ruby -v是ruby-2.0.0p247。
1272 0
|
NoSQL 数据库 Ruby
我的第一个Ruby On Rails + MongoDB程序
    最近想进一步学习一下MongoDB,而很久之前使用过ROR,正好也凑个机会重新拾起来。下面是建立第一个项目的过程。        主要参考文档:        1. Rails 3 - Getting started        2.
937 0
|
Apache Ruby Windows
让Apache支持ruby写的cgi程序
ruby apache cgi 配置 1,按说明安装ruby的apache mod 2,配置文件如下: 1 ######################################################### 2 # ruby cgi 配置 3 #######...
767 0
|
Ruby
Ruby On Rails学习笔记(3)——Rails程序由0到1
     正如Rails的理念一样,创建一个新的Rails应用程序的过程非常简单,下面就来看看如何从0到1建立一个全新的Rails应用程序。     1、启动InstantRails,打开其Rails应用程序管理器(Rails Application Manager):         2、创建...
753 0