如果有人问你在 Ruby 中执行 ?????:??
会得到什么,如果不尝试执行这个命令,你会觉得结果是什么?
答案是你会得到返回值:"?",外加一个 warning。
warning: string literal in condition
=> "?"
事实上拆解来看懂你就会知道了:?? 在 Ruby 中其实等价于 "?", ?如果在一个单字面前他会把对应的符号变成字符串,官方文档描述如下:
?a #=> "a"
?abc #=> SyntaxError
https://ruby-doc.org/core-2.3.0/doc/syntax/literals_rdoc.html#top
心细的人可能已经发现了,刚刚我这个 ?????:??
其实就是一个三元表达式,也可以写作:"?" ? "?" : "?"
。那么 Ruby Parser 是怎么样知道他应该如何处理这个情况的呢?
直接打开 Ruby 的源码,找到 parse.y 文件,Ruby Parser 的语法定义来自于 parse.y 这个文件。
一般来说我们查找这个 parse 的分析顺序,第一个一定会是去看parser_yylex
方法,因为这个函数做的是分词的动作。找到'?' 这个 case 你就能找到parse_qmark
这个方法,从源码可以看出。
所以可以得知,?
操作符支持单个字符串,也支持 ascii\utf8 以及一些制表符。
另外顺道一说的是,刚刚的警告 string literal in condition
的代码发生处是在 cond0
方法中,另外如果你是用正则作为三元运算符的判断也会发出类似的警告。