據真實世界的OCaml的類型應該是string
。但實際上在我的utop
REPL中,它的類型是bytes
。我已經打開Core.Std
。這是爲什麼?爲什麼我的「字節」類型的字符串?
(的OCaml
版本爲4.02.2
; Core
是112.24.01
; utop
是1.18
)
據真實世界的OCaml的類型應該是string
。但實際上在我的utop
REPL中,它的類型是bytes
。我已經打開Core.Std
。這是爲什麼?爲什麼我的「字節」類型的字符串?
(的OCaml
版本爲4.02.2
; Core
是112.24.01
; utop
是1.18
)
必須明確啓用安全的字符串模式。剛開始用UTOP:OCaml中4.02
$ utop -safe-string
之前the introduction of型bytes
,字符串是可變的。現在,字符串意圖是不可變的,並且bytes
是用於「可變字符串」的類型。
爲了不打破太多現有的代碼,默認情況下這種區別尚未啓用。在默認模式下,bytes
和string
是同義詞。
有OCaml中的可變字符串不可變的緩慢腳步動作。可變字符串的新名稱是bytes
。不變的將仍然被稱爲string
。在撰寫bytes
和string
的時間都只是同義詞,所以每當你看到bytes
你可以把它讀作string
。此外,如果您將核心版本更新至112.35.00或更高版本,則bytes
將不會看到此問題。字符串將重新變成字符串。
正如@ivg說,有OCaml中緩慢的移動,使string
型不變,且bytes
類型將會取代目前的string
類型,因爲它總是有用的,除了不可改變的人可變字符串。
由於4.02.2版本,也有同類型string
和bytes
(String
和Bytes
,分別)工作獨立的模塊,但他們都只是默認使用bytes
。
可以使用Bytes.set
或使用<-
運算符修改字節字符串,但後一種方法會發出警告。例如:
# let byte_string = "dolphins";;
val byte_string : bytes = "dolphins"
# byte_string.[0] <- 'w';;
Characters 0-15:
Warning 3: deprecated: String.set
Use Bytes.set instead.
Characters 0-15:
Warning 3: deprecated: String.set
Use Bytes.set instead.
- : unit =()
# byte_string;;
- : bytes = "wolphins"
當然,更正常行爲可以通過與-safe-string
指令運行的OCaml作爲@rafix所述實現。
您發佈的聲音確實需要啓用此模式。這不是真的。其他所有建議都寫得很好。考慮刪除這個誤導性的建議。 – ivg
我認爲@ivg是正確的,因爲您的第一句話措辭笨拙,我會將它寫爲「爲了實現此行爲,必須明確啓用字符串模式」 – user1030453