设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1826|回复: 4
打印 上一主题 下一主题

[胡扯] 【RGSS3】省括号

[复制链接]

Lv4.逐梦者

梦石
0
星屑
9617
在线时间
566 小时
注册时间
2017-9-28
帖子
208
跳转到指定楼层
1
发表于 2019-8-7 09:18:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 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

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

写教程还是挺有意思的,你们还有什么其他想不明白的地方可以回复,我说不定就更下一期了(咕咕咕

评分

参与人数 2+2 收起 理由
有丘直方 + 1 我很赞同
百里_飞柳 + 1 但还是看不懂喵喵喵脚本

查看全部评分

喵喵喵

Lv4.逐梦者 (版主)

聪仔

梦石
0
星屑
6182
在线时间
3077 小时
注册时间
2013-12-26
帖子
3145
2
发表于 2019-8-7 09:46:54 | 只看该作者
把那些不写括号的家伙全都打死去...
聪聪全国第三帅...
他们都叫我【人赢聪】
我的RM能力雷达图:

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1934
在线时间
403 小时
注册时间
2015-8-30
帖子
395
3
发表于 2019-8-7 11:17:37 | 只看该作者
表示调用方法的.的优先级是不是也要讲一下?
  1. -1.abs # => 1
  2. 2 ** (-1).abs # => 2
复制代码

虽然**的优先级比-(unary)要高,但.的优先级比**高,比-(unary)低

点评

所以你第二行的括号可以去掉 2 ** -1.abs  发表于 2019-8-7 11:23
小仙女一枚~
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2650
在线时间
383 小时
注册时间
2015-8-8
帖子
436

R考场第七期纪念奖

4
发表于 2019-8-7 22:43:22 | 只看该作者
本帖最后由 冷俊逸 于 2019-8-7 22:44 编辑

问题解决了:6/2(1+2)== 9
旧作《邵彦朝的大冒险》下载

默默无闻的论坛观察者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-27 05:04

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表