Ruby中module链式嵌套结构与分号分隔写法的含义解析
Ruby 链式模块嵌套与分号作用说明
链式模块嵌套的语义
你看到的同一行连续书写多个module的写法,和逐层换行缩进的模块嵌套写法语义完全一致,没有任何特殊逻辑。
比如你在源码里看到的这段:
module a module b module c module d def foobar
和你之前熟悉的标准缩进写法运行效果完全相同:
module a module b module c module d def foobar
Ruby解释器会按从左到右的顺序,依次处理每个module关键字:如果对应名称的模块不存在就新建,已经存在就直接打开该模块的作用域,最终所有后续定义的方法、常量都会落在最内层的d模块作用域下,最终的命名空间层级为a::b::c::d。
这种紧凑写法只是排版上省了换行,没有附加的特殊语法行为,只是大部分Ruby代码风格指南不推荐嵌套超过2层时这么写,可读性太差,很容易数错嵌套层级。
分号的作用
Ruby中;的作用是标记语句结束,功能和换行完全等价。
你看到的带分号的写法:
module a; module b; module c def foorbar
和前面两种无分号的写法语义没有任何区别。这里的分号只是显式告诉解释器:前面的模块定义语句到这里结束,后面是新的语句。
- 如果Ruby语法解析器能自动识别出语句边界(比如
module a后直接跟module b,关键字本身就能分隔语句),就算不写分号,代码也能正常运行。 - 如果是没有明显关键字边界的短语句写在同一行,就必须用分号分隔,否则会报语法错误,比如
a = 1 b = 2是非法写法,必须写成a = 1; b = 2。
补充:这几种写法最终的运行结果没有任何差异,区别仅在于代码排版风格。不少早年的Ruby源码会用这种紧凑写法,只是为了减少文件的空行、换行数量,不存在隐藏的特殊语法逻辑。
内容的提问来源于stack exchange,提问作者leon
相关产品推荐
相关产品推荐

