You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:15:32