Ruby 3.0.2的YAML解析为何01-07转int,08、09为string?
问题:Ruby YAML解析器为何对01-07和08-09键解析类型不同?
示例YAML文件
--- 01: 01: "01" 02: "02" 03: "03" 04: "04" 05: "05" 06: "06" 07: "07" 08: "08" 09: "09" 10: "10" 11: "11"
Ruby加载代码
require 'yaml' yml = YAML.load_file(File.join('/home/user', 'test.yml')) p yml
解析输出
{1=>{1=>"01", 2=>"02", 3=>"03", 4=>"04", 5=>"05", 6=>"06", 7=>"07", "08"=>"08", "09"=>"09", 10=>"10", 11=>"11"}}
疑问
为何Ruby的YAML解析器将键01至07解析为整数(int),却将键08和09解析为字符串(string)而非整数?
解答
这是YAML规范与Ruby默认YAML解析器Psych共同作用的结果:
- YAML 1.2规范中,以0开头且后续字符为0-7的数字会被识别为八进制整数。八进制数的有效范围是0-7,因此
08、09不属于合法的八进制格式,无法被解析为整数,只能以字符串形式保留。 - Ruby的Psych解析器严格遵循该规范,会自动将
01-07转换为对应的十进制整数(比如01转为1);而08、09因不符合八进制规则,不会触发类型转换,保持原始字符串类型。
如果需要让所有带前导零的键都被解析为字符串,只需在YAML文件中给键添加引号,例如写成"01":、"08":即可。
内容的提问来源于stack exchange,提问作者LinFelix
相关产品推荐
相关产品推荐

