为什么Ruby中$1、$s、$/三类全局变量的表现存在差异
Ruby三类全局变量表现不同的原因
Ruby的全局变量按设计规则分为三类,不同类别有完全不同的读写权限和赋值逻辑,正好对应你测试的三个场景:
- 正则捕获类数字全局变量($1、$2等)
这类属于只读的解析器自动维护变量,完全由Ruby内部在正则表达式匹配成功后自动赋值:如果本次匹配结果存在第N个捕获组,就会给$N赋值为对应捕获内容;如果没有执行过正则匹配、或者匹配结果没有对应编号的捕获组,读取这类变量就会返回nil。Ruby语法层面直接禁止用户手动修改这类变量,所以你执行$2 = 2会直接抛出语法错误。 - 自定义全局变量(如你测试的$s)
只要是以$开头、不属于Ruby预留关键字的变量都属于自定义全局变量,设计逻辑和普通变量一致,支持自由读写:未赋值时默认返回nil,赋值后读取就能拿到对应值,没有额外限制。 - 内置可修改全局变量(如你测试的$/)
这类是Ruby官方预留的、用来控制运行时行为的全局变量,每个都有默认初始值:比如$/默认值是换行符\n,用来标识IO读取时的行分隔符。这类变量设计上就是允许用户修改来调整Ruby的运行逻辑,所以支持正常读写,默认状态下读取不会返回nil(除非你主动赋值为nil)。
内容的提问来源于stack exchange,提问作者joox
相关产品推荐
相关产品推荐

