假設我們有如下紅寶石代碼防止轉換字符串轉換成八進制數中的Ruby
require 'yaml'
h={"key"=>[{"step1"=>["0910","1223"]}]}
puts h.to_yaml
"0910"
是一個字符串 但後to_yaml
轉換,串變成八進制數。
---
key:
- step1:
- 0910
- '1223'
問題是我不能改變h
變量。我從外面接收它,我需要解決問題而不改變它。
假設我們有如下紅寶石代碼防止轉換字符串轉換成八進制數中的Ruby
require 'yaml'
h={"key"=>[{"step1"=>["0910","1223"]}]}
puts h.to_yaml
"0910"
是一個字符串 但後to_yaml
轉換,串變成八進制數。
---
key:
- step1:
- 0910
- '1223'
問題是我不能改變h
變量。我從外面接收它,我需要解決問題而不改變它。
根據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"]}]}
如果你不能在這個狀態下使用數據,也許你可以擴大這個問題,並給出更多的細節。
您引用的是超過6年的規格。 YAML 1.2規定八進制數應該以'0o'開始。它當然可以是圖書館試圖向後兼容,但這不能從這種有限的輸入中推斷出來。 – Anthon
你錯了,你的YAML輸出中有一個八進制數。 YAML spec兩次引用八進制數,並且都清楚地表明YAML文件中的八進制數字以0o
開頭(這與Ruby和更新版本的Python用於指定八進制數的內容類似; Python也僅僅刪除了對0
的支持版本3中的八進制文件,Ruby似乎沒有做到這一點)。
僅表示以0
開頭的八進制整數的習慣已被證明在很多語言中令人困惑,並在六年前從YAML規範中刪除。這可能是你的解析器仍然支持它,但它不應該。
在任何情況下,字符8
和9
都不會出現在表示爲八進制數的整數中,因此在這種情況下,不會出現混淆,即未加引號的標量是數字。 字符串1223可以被解釋爲一個正常的整數,因此它必須總是被表示爲帶引號的字符串標量。
有趣的事情是看看當你轉儲字符串"0708"
時會發生什麼。如果您的YAML庫與規範(版本1.2)保持同步,則可以將其作爲未加引號的標量轉儲。由於o
(或x
)後面沒有跟着前導零,因此可能不會有混淆,它可能是八進制數(或十六進制),但爲了與舊解析器兼容(從2009年以前),解析器可能會引用它是安全的。
檢查傾銷時會發生什麼0708我已經使用了這段代碼。 require'psych' h = {「key」=> [{「step1」=> ['0910','1223','0708「,」08「,」0777「]}]} puts Psych 。轉儲(H)' 的sesult: --- 鍵: - 第一步: - 0910 - '1223' - 0708 - 08 - '077' – user3419308
@ user3419308因此,無論解析器爲1.2並且可以安全地使用八進制字符,或者只與YAML 1.1兼容。你可以嘗試的另一件事是指定'0o77'(不含引號),看看是否加載(對不起,我沒有在我的系統上安裝ruby,所以不能自己嘗試這個)。 – Anthon
您如何看待,避免此轉換的最佳解決方案是什麼? – user3419308
您是否試圖解析它? –