Day09 -超级经典面试题:Ruby的a ||= b(or-equals)是什么意思呢?
前情提要:
写了这一系列下来,发现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)是什么意思呢?的更多相关文章
- Linux 经典面试题
[Linux 经典面试题] 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文 ...
- 【ASP.NET Core】EF Core - “影子属性” 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1
[ASP.NET Core]EF Core - “影子属性” 有朋友说老周近来博客更新较慢,确实有些慢,因为有些 bug 要研究,另外就是老周把部分内容转到直播上面,所以写博客的内容减少了一点. ...
- 李洪强iOS经典面试题156 - Runtime详解(面试必备)
李洪强iOS经典面试题156 - Runtime详解(面试必备) 一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...
- 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)
李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...
- 李洪强iOS经典面试题154- 通知与推送
李洪强iOS经典面试题154- 通知与推送 通知与推送 本地通知和远程推送通知对基本概念和用法? image 本地通知和远程推送通知都可以向不在前台运行的应用发送消息,这种消息既可能是即将发生的事 ...
- 李洪强iOS经典面试题153- 补充
李洪强iOS经典面试题153- 补充 补充 有空就来解决几个问题,已经懒癌晚期没救了... UML 统一建模语言(UML,UnifiedModelingLanguage)是面向对象软件的标准化建模 ...
- 李洪强经典面试题152-Runtime
李洪强经典面试题152-Runtime Runtime Runtime是什么 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码, ...
- 李洪强iOS经典面试题147-WebView与JS交互
李洪强iOS经典面试题147-WebView与JS交互 WebView与JS交互 iOS中调用HTML 1. 加载网页 NSURL *url = [[NSBundle mainBundle] UR ...
- 李洪强经典面试题145-Runloop
李洪强经典面试题145-Runloop Runloop 什么是 Runloop? 从字面上讲就是运行循环. 它内部就是do-while循环,在这个循环内部不断地处理各种任务. 一个线程对应一个Ru ...
随机推荐
- DNS服务器地址汇总
如果修改DNS服务器地址就可以访问google等服务,你还等什么?使用免费DNS解析服务除了去掉了运营商的各种广告,还有个最大的好处就是不会重定向或者过滤用户所访问的地址,这样就防止了很多网站被电信. ...
- 利用微软RD Client APP远程连接PC(附外网连接方法)
一.下载RD Client 这个就不用多说了... 二.设置PC允许远程桌面连接 PC系统以win10为例: 1.进入“远程设置”允许远程协助与远程桌面连接 桌面右键单击“此电脑”,属性,单击左边“远 ...
- Spark环境准备
Ubuntu: 1.下载spark-2.2.1-bin-hadoop2.7.tgz,解压即可使用. 2.下载jdk-8u151-linux-x64.tar.gz,解压. 3.执行spark-2.2.1 ...
- MySQL误操作删除后,怎么恢复数据?
MySQL误操作删除后,怎么恢复数据?登陆查数据库mysql> select * from abc.stad;+----+-----------+| id | name |+----+----- ...
- js无间隙向上滚动
一.优点:div可以load:缺点:滚动的时候有点娘,磨磨唧唧,不够干脆爽快 html <div id="my_msg" class="my-msg bg-whit ...
- Java可视化日历(Date类、DATe Format类、Calendar类综合运用),开发可视化日历小程序
Java时间日期类综合运用,开发可视化日历小程序 由键盘输入指定格式的日期,打印这个月的日历 1.代码 import java.text.DateFormat; import java.text.Pa ...
- SerialPort项目配置
app的build.gradle下: apply plugin: 'com.android.application' android { compileSdkVersion 26 defaultCon ...
- asp.net 本地服务字段调用(WebSerice)的小问题
当有全局变量时,如:protected static Dictionary<string, string> SalesMail = new Dictionary<string, st ...
- asp微信支付代码v4.1无需证书版,带回调入库的asp支付源码
昨天帮一个客户写的,他的程序是老的asp,想实现微信在手机上下单付款,让帮忙给写一份asp微信支付的接口代码,昨天晚上闲着没事,搞了一个晚上才搞好,其实asp支付并不需要安装证书,其实asp支付也很好 ...
- hive动态分区问题--分区为中文
报错如下: Loading data to table data_da.tmp_wlw_test partition (stat_date=2017-05-11, business_type_name ...