2015-10-13 21 views
3

假设我们有如下红宝石代码防止转换字符串转换成八进制数中的Ruby

require 'yaml' 

h={"key"=>[{"step1"=>["0910","1223"]}]} 
puts h.to_yaml 

"0910"是一个字符串 但后to_yaml转换,串变成八进制数。

--- 
key: 
- step1: 
    - 0910 
    - '1223' 

问题是我不能改变h变量。我从外面接收它,我需要解决问题而不改变它。

+0

您是否试图解析它? –

回答

1

根据YAML spec以0信号为前缀的数字为八进制数(如Ruby中所示)。但08不是有效的八进制数,所以不会被引用。

当您从YAML文件加载这些数据时,数据将完全按照您的需要显示。

0> h={"key"=>[{"step1"=>["0910","1223"]}]} 
=> {"key"=>[{"step1"=>["0910", "1223"]}]} 

0> yaml_h = h.to_yaml 
=> "---\nkey:\n- step1:\n - 0910\n - '1223'\n" 

0> YAML.load(yaml_h) 
=> {"key"=>[{"step1"=>["0910", "1223"]}]} 

如果你不能在这个状态下使用数据,也许你可以扩大这个问题,并给出更多的细节。

+0

您引用的是超过6年的规格。 YAML 1.2规定八进制数应该以'0o'开始。它当然可以是图书馆试图向后兼容,但这不能从这种有限的输入中推断出来。 – Anthon

1

你错了,你的YAML输出中有一个八进制数。 YAML spec两次引用八进制数,并且都清楚地表明YAML文件中的八进制数字以0o开头(这与Ruby和更新版本的Python用于指定八进制数的内容类似; Python也仅仅删除了对0的支持版本3中的八进制文件,Ruby似乎没有做到这一点)。

仅表示以0开头的八进制整数的习惯已被证明在很多语言中令人困惑,并在六年前从YAML规范中删除。这可能是你的解析器仍然支持它,但它不应该。

在任何情况下,字符89都不会出现在表示为八进制数的整数中,因此在这种情况下,不会出现混淆,即未加引号的标量是数字。 字符串1223可以被解释为一个正常的整数,因此它必须总是被表示为带引号的字符串标量。

有趣的事情是看看当你转储字符串"0708"时会发生什么。如果您的YAML库与规范(版本1.2)保持同步,则可以将其作为未加引号的标量转储。由于o(或x)后面没有跟着前导零,因此可能不会有混淆,它可能是八进制数(或十六进制),但为了与旧解析器兼容(从2009年以前),解析器可能会引用它是安全的。

+0

检查倾销时会发生什么0708我已经使用了这段代码。 require'psych' h = {“key”=> [{“step1”=> ['0910','1223','0708“,”08“,”0777“]}]} puts Psych 。转储(H)' 的sesult: --- 键: - 第一步: - 0910 - '1223' - 0708 - 08 - '077' – user3419308

+0

@ user3419308因此,无论解析器为1.2并且可以安全地使用八进制字符,或者只与YAML 1.1兼容。你可以尝试的另一件事是指定'0o77'(不含引号),看看是否加载(对不起,我没有在我的系统上安装ruby,所以不能自己尝试这个)。 – Anthon

+0

您如何看待,避免此转换的最佳解决方案是什么? – user3419308

相关问题