Ruby 我听到有人在说:「?????:??」

chrishyman · February 04, 2020 · Last by huobazi replied at February 12, 2020 · 4424 hits

如果有人问你在 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 方法中,另外如果你是用正则作为三元运算符的判断也会发出类似的警告。

没这么玩儿过,帮你消除零回复。

"一把把把把住了"

谭浩强出 Ruby 教科书了?

还是你会玩儿

过过过儿过过的生活?

You need to Sign in before reply, if you don't have an account, please Sign up first.