好像char -> string -> string
类型的标准库中没有函数,它在char
的前面(或末尾)插入string
。有解决方法,例如使用String.make
或String.blit
。是否有一种优雅的方式来做到这一点?
答案 0 :(得分:18)
@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已经改变,因此字符串是不可变的。优异。
答案 1 :(得分:8)
String.make
和String.blit
是一种很好的方法,但它们似乎势在必行。我个人更喜欢使用Char.escaped
和字符串连接来创建中缀函数:
let (^$) c s = s ^ Char.escaped c (* append *)
let ($^) c s = Char.escaped c ^ s (* prepend *)
答案 2 :(得分:8)
我对不同方法的效率进行了比较:
我写了一个简单的测试:
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双核)。
我为每个选项运行了三次测试,使用time
计时,并计算平均实际时间。
结果如下:
s ^ String.make 1 c
:7.75s( 100%)
s ^ Char.escaped c
:8.30s( 107%)
Printf.sprintf "%s%c" s c
:68.57s( 885%)