2015-10-13 62 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