前情提要:

写了这一系列下来,发现Ruby有许多特别的方法。前几天提到String字串,并且接续着在第八天我们了解串接(concatenate)与插入interpolation#{}方法(就连加号+也是方法之一呢!!!)今天要来研究新的字串与数值比较的条件指定表达式(conditional assignment operator)啰!

Ruby经典面试题目#09(chao-ok-huangdaoyi)

请解释Explain this ruby idiom(or-equals):a ||= b?

解答:如果a尚未被初始化,或是为falsy(空值nil或false),a等于b;
其他情况下,a值不变。

If a is not initialized(or if it is set to nil or false),set it with the value of b.

让我们来看下列的表达式:
指定a的值为1,因此非nil或false。
a经过||=(or-equals)的方法判断,值仍维持不变a=1:

例子A

a = false
b = nil
p a ||= b #a原本为false,印出a=nil
例子B

a = nil
b = true
p a ||= b #a原本为nil,印出a=true
例子C

a = 1
b = 2
puts a ||= b #a已指定值,印出a=1
看起来很简单的题目,为什么特地单独挑一天说明呢?因为其实这个or-equals缩写,背后大有玄机!

这边想特别指出是,a ||= b为a || a = b的缩写:

a || a = b
---------------
a?a:a = b #or eqauls
---------------
if a then a
else a = b
end
如果a没有被初始化,或是为空值nil或false,a等于b;
其他情况下,a值不变。

注意,a ||= b并非a = a || b的缩写,让我们来比较一下语法含义:

a = a || b
---------------
a = a?a:b
---------------
if a then
a = a
else
a = b
end
在(if a then a = a)这个语法上,a已经被比较过两次(it is evaluated twice),是不是就没这么简洁与精确了呢?

因此,虽然这两个缩写印出来都会是a = 1。但意思是很不一样的。

a = 1
b = 2

puts a ||= b #a=1
puts a || b = b #a=1
puts a = a || b #a=1

(在c++程序里a += b是a = a + b的缩写,但Ruby不是C++,详见Ruby Forum在2008年时这里的讨论串)

如果以拟人化的方式解释,我会说a是在「成为自己的过程」。
如果a的心里没有idea(梦想)尚未被初始化,或者什么想法都没有(nil)或是负面想法太多(false),
a就会被b影响,变成为b。

我相信我们最终,都不想成为别人,只想成为自己(xcsjbj)。

Be Yourself.Everyone Else is Already Taken.
就像Ruby之所以成为Ruby一样的特别,因为它语法上的创新与简洁,是其他程序无可取代的。

感想:
为了找这一篇题目的解答,查询不少数据,发现(10年前)google mail list上几位Ruby前辈们争辩关于这个问题的讨论串,还蛮感动的!

这或许就是追求知识源头、逼近真实的过程吧!:)

Day09 -超级经典面试题:Ruby的a ||= b(or-equals)是什么意思呢?的更多相关文章

  1. Linux 经典面试题

    [Linux  经典面试题] 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文 ...

  2. 【ASP.NET Core】EF Core - “影子属性” 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1

    [ASP.NET Core]EF Core - “影子属性”   有朋友说老周近来博客更新较慢,确实有些慢,因为有些 bug 要研究,另外就是老周把部分内容转到直播上面,所以写博客的内容减少了一点. ...

  3. 李洪强iOS经典面试题156 - Runtime详解(面试必备)

    李洪强iOS经典面试题156 - Runtime详解(面试必备)   一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...

  4. 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)

    李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...

  5. 李洪强iOS经典面试题154- 通知与推送

    李洪强iOS经典面试题154- 通知与推送   通知与推送 本地通知和远程推送通知对基本概念和用法? image 本地通知和远程推送通知都可以向不在前台运行的应用发送消息,这种消息既可能是即将发生的事 ...

  6. 李洪强iOS经典面试题153- 补充

    李洪强iOS经典面试题153- 补充   补充 有空就来解决几个问题,已经懒癌晚期没救了... UML 统一建模语言(UML,UnifiedModelingLanguage)是面向对象软件的标准化建模 ...

  7. 李洪强经典面试题152-Runtime

    李洪强经典面试题152-Runtime   Runtime Runtime是什么 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码, ...

  8. 李洪强iOS经典面试题147-WebView与JS交互

    李洪强iOS经典面试题147-WebView与JS交互   WebView与JS交互 iOS中调用HTML 1. 加载网页 NSURL *url = [[NSBundle mainBundle] UR ...

  9. 李洪强经典面试题145-Runloop

    李洪强经典面试题145-Runloop   Runloop 什么是 Runloop? 从字面上讲就是运行循环. 它内部就是do-while循环,在这个循环内部不断地处理各种任务. 一个线程对应一个Ru ...

随机推荐

  1. Git 环境配置

    Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量. 这些变量存储在三个不同的位置: /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用 ...

  2. docker-solr 使用host模式修改默认的8983端口号

    1.使用root账号进入docker-solr docker exec -it 127627ab6247 -u root /bin/bash 2.安装vim apt-get update apt-ge ...

  3. pandas第一课

    pandas第一课 首先是数据的准备 movies.dat user.dat ratings.dat 注意,这些数据都是通过::来隔开每一列的,每一列有各自的含义 现在通过pandas来读入数据 首先 ...

  4. 前端表单提交数据~php获取表单内容

    上图代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  5. Sql case when 示例

    SELECT       单元编号,年,月,   项目编号='11111',   sum(case  when 项目编号= 'ZB010201' then [当月额] else 0 end ) 医疗收 ...

  6. maven项目自动创建src/main/resources等四个资源文件夹

    如何使maven项目自动创建这四个文件夹:src/main/resources.src/main/java.src/test/java.src/test/resources 网传甚广的在Config ...

  7. 学习笔记《Java多线程编程实战指南》一

    1.1什么是多线程编程 多线程编程就是以线程为基本抽象单位的一种编程范式,和面向对象编程是可以相容的,事实上Java平台中的一个线程就是一个对象.多线程编程不是线程越多越好,就像“和尚挑水”的故事一样 ...

  8. three.js中的文字

    1.三维文字 三维字体文字,使用的是FontLoader,字体文件通过来facetype.js生成 addCityText: function () { var self = this; var ci ...

  9. SSM框架-初学Mybatis框架

    SSM(Spring+SpringMVC+Mybatis)是目前项目开发比较流行的一套组合框架,而Mybatis是负责数据库操作的那部分框架,具体 我也说不上来 传统的JDBC操作比较冗长而繁琐,而用 ...

  10. 傻瓜学编程之block_3

    block 捕获自动变量的瞬间值: 注释在代码中:请参考傻瓜学编程之block_3 import "People.h" @interface People() { int your ...