赞 | 76 |
VIP | 0 |
好人卡 | 0 |
积分 | 97 |
经验 | 554 |
最后登录 | 2025-1-5 |
在线时间 | 572 小时 |
Lv4.逐梦者
- 梦石
- 0
- 星屑
- 9707
- 在线时间
- 572 小时
- 注册时间
- 2017-9-28
- 帖子
- 209
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 hyrious 于 2019-8-7 09:25 编辑
很多教程和编程规范(不限于 ruby 语言)会要求编写者加括号以增加可读性,先不说可读性是伪命题,既然 ruby 存在省括号的特性,我这里就来列举一下如何确定可以省括号以及如何看懂别人不写括号的代码。
发在水区是因为技术区没人看.jpg
首先最常见的,方法定义/调用可以省一对括号,即
- def f x, *xs, &b
- end
- f 1, 2, 3 do end
复制代码 在不引起歧义的情况下,多重方法调用可以省括号,即
等价于
但是下面这个就会报错了
小朋友们可以想想它的歧义在哪
接下来就是玩优先级了,所谓优先级就是决定谁先算的问题,例如 1 + 2 * 3 / 4,我们知道 * / 先算,就是因为 * / 优先级比 + 高。
在 F1 中有一张表,展示了所有运算符的优先级:
- high ::
- []
- **
- -(unary) +(unary) ! ~
- * / %
- + -
- << >>
- &
- | ^
- > >= < <=
- <=> == === != =~ !~
- &&
- ||
- .. ...
- ?:(conditional operator)
- =(+=, -= ... )
- not
- low and or
复制代码
越是上面的越先算,这么粗看一下可能没什么概念,下面有一个很常用的省括号方法
- p 3 + 5 if (a || b) && (c || d)
复制代码 像这样的复合后置条件,如何把这个括号扔掉呢?用 and 代替 &&,因为 and 优先级比 || 低,
- p 3 + 5 if a || b and c || d
复制代码 and or 的优先级低是一个很好用的省括号手段
接下来讲一些特例,首先我们看到 ?: 比 = 高,那么下面这行
居然没报错?嗯,这个表达式放到其他语言里 99% 要报错,ruby 开发者专门针对这个语法进行了微调(这也在你的算计之中吗?jojo!)这句表达式也没什么歧义,我认为是一个很好的语法特性
块参数 { } 的结合性比 do end 高,结合代码来说,
等价于
,而
等价于
,ruby 没有字面值接 block 的语法,这句是要报错的。
扯一个偏题的,在压行时如何省分号?
基本方法就是定义参数时带上括号,那么开头可以省一个分号,方法内部最后一行接 end 可以在结尾省一个分号,我们知道 def end 表达式返回一个方法名的 symbol,因此还可以使用 and 运算符来连接多个子表达式:
- def f() 42 end and def g() 24 end
复制代码
嗯?括号还在啊,没关系,我们可以使用 define_method(sym, &blk) 代替 def end,同时利用上面的 do end 结合性特点……
- define_method :f do 42 end and define_method :g do 24 end
复制代码 怎么样,是不是顿时觉得 ruby 这语言可以全程无括号演出了(x
希望这个帖子可以帮到刚脚本入门时阅读别人代码吃力的你。
写教程还是挺有意思的,你们还有什么其他想不明白的地方可以回复,我说不定就更下一期了(咕咕咕 |
评分
-
查看全部评分
|