Project1

标题: 【RGSS3】省括号 [打印本页]

作者: hyrious    时间: 2019-8-7 09:18
标题: 【RGSS3】省括号
本帖最后由 hyrious 于 2019-8-7 09:25 编辑

很多教程和编程规范(不限于 ruby 语言)会要求编写者加括号增加可读性,先不说可读性是伪命题,既然 ruby 存在省括号的特性,我这里就来列举一下如何确定可以省括号以及如何看懂别人不写括号的代码。

发在水区是因为技术区没人看.jpg

首先最常见的,方法定义/调用可以省一对括号,即
  1. def f x, *xs, &b
  2. end
  3. f 1, 2, 3 do end
复制代码
在不引起歧义的情况下,多重方法调用可以省括号,即
  1. f g a, b
复制代码
等价于
  1. f(g(a, b))
复制代码
但是下面这个就会报错了
  1. f a, g b
复制代码
小朋友们可以想想它的歧义在哪

接下来就是玩优先级了,所谓优先级就是决定谁先算的问题,例如 1 + 2 * 3 / 4,我们知道 * / 先算,就是因为 * / 优先级比 + 高。

在 F1 中有一张,展示了所有运算符的优先级:

  1. high   ::
  2.        []
  3.        **
  4.        -(unary)  +(unary)  !  ~
  5.        *  /  %
  6.        +  -
  7.        << >>
  8.        &
  9.        |  ^
  10.        > >=  < <=
  11.        <=> ==  === !=  =~  !~
  12.        &&
  13.        ||
  14.        ..  ...
  15.        ?:(conditional operator)
  16.        =(+=, -= ... )
  17.        not
  18. low    and or
复制代码

越是上面的越先算,这么粗看一下可能没什么概念,下面有一个很常用的省括号方法
  1. p 3 + 5 if (a || b) && (c || d)
复制代码
像这样的复合后置条件,如何把这个括号扔掉呢?用 and 代替 &&,因为 and 优先级比 || 低,
  1. p 3 + 5 if a || b and c || d
复制代码
and or 的优先级低是一个很好用的省括号手段

接下来讲一些特例,首先我们看到 ?: 比 = 高,那么下面这行
  1. true ? a = 3 : b = 5
复制代码
居然没报错?嗯,这个表达式放到其他语言里 99% 要报错,ruby 开发者专门针对这个语法进行了微调(这也在你的算计之中吗?jojo!)这句表达式也没什么歧义,我认为是一个很好的语法特性

块参数 { } 的结合性比 do end 高,结合代码来说,
  1. f 1, 2, 3 do end
复制代码
等价于
  1. f(1, 2, 3) { }
复制代码
,而
  1. f 1, 2, 3 { }
复制代码
等价于
  1. f(1, 2, (3 { }))
复制代码
,ruby 没有字面值接 block 的语法,这句是要报错的。

扯一个偏题的,在压行时如何省分号
  1. def f(x, *xs, &b) end
复制代码
基本方法就是定义参数时带上括号,那么开头可以省一个分号,方法内部最后一行接 end 可以在结尾省一个分号,我们知道 def end 表达式返回一个方法名的 symbol,因此还可以使用 and 运算符来连接多个子表达式:
  1. def f() 42 end and def g() 24 end
复制代码

嗯?括号还在啊,没关系,我们可以使用 define_method(sym, &blk) 代替 def end,同时利用上面的 do end 结合性特点……

  1. define_method :f do 42 end and define_method :g do 24 end
复制代码
怎么样,是不是顿时觉得 ruby 这语言可以全程无括号演出了(x

希望这个帖子可以帮到刚脚本入门时阅读别人代码吃力的你。

写教程还是挺有意思的,你们还有什么其他想不明白的地方可以回复,我说不定就更下一期了(咕咕咕
作者: 正太君    时间: 2019-8-7 09:46
把那些不写括号的家伙全都打死去...

作者: 有丘直方    时间: 2019-8-7 11:17
表示调用方法的.的优先级是不是也要讲一下?
  1. -1.abs # => 1
  2. 2 ** (-1).abs # => 2
复制代码

虽然**的优先级比-(unary)要高,但.的优先级比**高,比-(unary)低
作者: 冷俊逸    时间: 2019-8-7 22:43
本帖最后由 冷俊逸 于 2019-8-7 22:44 编辑

问题解决了:6/2(1+2)== 9




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1