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

chrishyman · 2020年02月04日 · 最后由 huobazi 回复于 2020年02月12日 · 985 次阅读

如果有人问你在 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 教科书了?

还是你会玩儿

过过过儿过过的生活?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册