String 如何在OCaml中将字符附加到字符串中?
在String 如何在OCaml中将字符附加到字符串中?,string,char,ocaml,String,Char,Ocaml,在char->string->string类型的标准库中似乎没有函数,它将char插入到字符串的前面(或末尾)。有一些变通方法,例如使用String.make或String.blit。有一种优雅的方法可以做到这一点吗?String.make和String.blit是一种很好的方法,但它们似乎是必不可少的。就我个人而言,我更喜欢使用Char.escaped和字符串串联生成中缀函数: let (^$) c s = s ^ Char.escaped c (* append *) let ($^) c
char->string->string
类型的标准库中似乎没有函数,它将char
插入到字符串的前面(或末尾)。有一些变通方法,例如使用String.make
或String.blit
。有一种优雅的方法可以做到这一点吗?String.make
和String.blit
是一种很好的方法,但它们似乎是必不可少的。就我个人而言,我更喜欢使用Char.escaped
和字符串串联生成中缀函数:
let (^$) c s = s ^ Char.escaped c (* append *)
let ($^) c s = Char.escaped c ^ s (* prepend *)
我将使用@pad中的代码,因为如果可能的话,我喜欢将字符串视为不可变的。但是我不会使用Char.escaped
;它专门用于需要字符的OCaml词法表示时。因此,如果你做出改变,你会得到以下结果:
let prefix_char s c = String.make 1 c ^ s
let suffix_char s c = s ^ String.make 1 c
更新
在提出这个问题后的几年中,OCaml已经发生了变化,因此字符串是不可变的。非常好。我比较了不同方法的效率:
我写了一个简单的测试:
let append_escaped s c = s ^ Char.escaped c
let append_make s c = s ^ String.make 1 c
let append_sprintf s c = Printf.sprintf "%s%c" s c
let _ =
let s = "some text" in
let c = 'a' in
for i = 1 to 100000000 do
let _ = append_(*escaped|make|sprintf*) s c in ()
done
我编译它本机(英特尔核心2双)
我为每个选项运行了三次测试,用时间对其计时,并计算平均实时运行时间
结果如下:
s^String.make 1c
:7.75s(100%)
s^Char.c
:8.30s(107%)
Printf.sprintf“%s%c”s c
:68.57s(885%)
我想说Char.escaped
用于特殊用途,比如生成OCaml代码作为输出,或者编写人类可读的消息。对于普通情况,String.make 1c
可能就是您想要的。这看起来确实有点笨拙。电池有BatString.of_char
。感谢您对char.escaped
的澄清。我保持答案不变,以便其他人知道。当@JeffreyScofield的答案和评论清楚了所有内容后,为什么要投否决票?使用Buffer
可能更适合于增加字符串。请再次注意:Char.escaped
与String.make
的作用不同。它根据OCaml的词汇规则为字符创建一个“转义”值。要查看这一点,请尝试以这种方式添加换行符('\n'
)。这也是为什么它有点慢。对于大多数一般用途,您希望使用String.make 1 c
。当然,Printf.sprintf
的速度要慢得多,但灵活得令人难以置信。@JeffreyScofield我将添加这个,这样人们就不需要自己尝试了:Char.escaped'\n'
=“\\n”
。谢谢,也许我应该自己说这个!这些评论仅限于非常简短。无论如何:Char.escaped'\n'
提供一个由'\\'
和'n'
组成的两个字符串String.make 1'\n'
为您提供一个由'\n'
组成的单字符字符串,它更可能是您想要的。