据真实世界的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