Dường như không có chức năng nào trong thư viện chuẩn loại char -> string -> string
, chèn char
trước (hoặc ở cuối) string
. Có cách giải quyết, ví dụ: bằng cách sử dụng String.make
hoặc String.blit
. Có một cách thanh lịch để làm điều này?Làm thế nào để bạn thêm một char vào một chuỗi trong OCaml?
Trả lời
String.make
và String.blit
là một cách hay để làm như vậy, nhưng chúng dường như là bắt buộc. Cá nhân tôi thích để làm cho chức năng ghi vào sử dụng Char.escaped
và nối chuỗi:
let (^$) c s = s^Char.escaped c (* append *)
let ($^) c s = Char.escaped c^s (* prepend *)
Tôi sẽ nói 'Char.escaped' là dành cho các ứng dụng chuyên biệt như tạo mã OCaml làm đầu ra hoặc viết các thông điệp có thể đọc được của con người. Đối với các trường hợp thông thường, 'String.make 1 c' có lẽ là những gì bạn muốn. Nó có vẻ hơi vụng về. Pin có 'BatString.of_char'. –
Cảm ơn bạn đã làm rõ về 'Char.escaped'. Tôi giữ câu trả lời không thay đổi để người khác biết về nó. – pad
Tại sao lại giảm xuống khi mọi thứ được làm rõ từ câu trả lời và nhận xét của @ JeffreyScofield? – pad
Mã từ @pad là những gì tôi sẽ sử dụng, vì tôi thích để điều trị chuỗi như bất biến nếu có thể. Nhưng tôi sẽ không sử dụng Char.escaped
; nó đặc biệt khi bạn muốn biểu diễn từ vựng OCaml của một nhân vật. Vì vậy, đây là những gì bạn nhận được nếu bạn thực hiện sự thay đổi:
let prefix_char s c = String.make 1 c^s
let suffix_char s c = s^String.make 1 c
tôi đã thực hiện một sự so sánh của tính hiệu quả của phương pháp tiếp cận khác nhau:
Tôi đã viết một bài kiểm tra đơn giản:
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
Tôi biên dịch nó một cách tự nhiên (Intel Core 2 Duo).
Tôi đã chạy thử nghiệm ba lần cho mỗi tùy chọn, định thời gian thử nghiệm với
time
và tính thời gian trung bình thực sự.
Dưới đây là kết quả:
s^String.make 1 c
: 7.75s (100%)s^Char.escaped c
: 8.30s (107%)Printf.sprintf "%s%c" s c
: 68.57s (885%)
Chỉ cần lưu ý, một lần nữa: 'Char.escaped' không thực hiện tương tự như' String.make'. Nó tạo ra một giá trị "thoát" cho nhân vật, theo các quy tắc từ vựng của OCaml. Để thấy điều này, hãy thử thêm một dòng mới (''\ n'') theo cách này. Đó cũng là lý do tại sao nó chậm hơn một chút. Đối với hầu hết các mục đích chung, bạn muốn sử dụng 'String.make 1 c'. Đương nhiên 'Printf.sprintf' chậm hơn rất nhiều, nhưng cực kỳ linh hoạt. –
@JeffreyScofield Tôi sẽ chỉ thêm phần này, vì vậy mọi người không cần phải tự thử: 'Char.escaped '\ n'' =' "\\ n" '. –
Cảm ơn, có lẽ tôi nên tự nói điều này! Những nhận xét này bị giới hạn rất ngắn. Dù sao đi nữa: 'Char.đã thoát '\ n'' cung cấp cho bạn chuỗi gồm hai ký tự bao gồm '' \\ '' và '' n''. 'String.make 1 '\ n'' cung cấp cho bạn chuỗi ký tự một gồm'' \ n'', có nhiều khả năng là thứ bạn muốn. –
- 1. Làm thế nào để bạn thêm một int vào một chuỗi trong C++?
- 2. Làm thế nào để bạn thêm vào một chuỗi đã tồn tại?
- 3. Trong Java, làm thế nào để biến một chuỗi thành một char hoặc char thành một String?
- 4. Trong CoffeeScript, làm thế nào để bạn thêm một giá trị vào một mảng?
- 5. Làm thế nào để bạn tạo một chuỗi XML thụt vào từ một XDocument trong C#?
- 6. Làm thế nào để thêm một chuỗi vào một giá trị cột trong MySQL?
- 7. Làm thế nào để bạn khai báo một chữ Char trong Visual Basic .NET?
- 8. PHP: Tách một chuỗi vào một mảng foreach char
- 9. Làm thế nào để bạn cast một char * thành int hoặc double trong C
- 10. Làm thế nào để bạn thêm một hình ảnh vào nhãn TabControl trong Winforms?
- 11. Làm thế nào để nối thêm một chuỗi vào mỗi phần tử của một mảng Bash?
- 12. Làm thế nào để thêm một chuỗi để NSMutableString
- 13. Trong Bash, làm thế nào để bạn thấy nếu một chuỗi không nằm trong một mảng?
- 14. làm thế nào để có được char cuối cùng của một chuỗi trong PHP?
- 15. Làm thế nào để thay thế một chuỗi bằng một chuỗi khác trong haskell
- 16. Làm thế nào để bạn thêm một ActionListener lên một JButton trong Java
- 17. Làm thế nào để bạn thêm một thư mục vào kho lưu trữ zip với ICSharpCode.SharpZipLib
- 18. Làm thế nào để bạn nhận được một unsigned dài ra khỏi một chuỗi?
- 19. Prolog - làm thế nào để bạn thêm một phần tử vào danh sách tại chỗ?
- 20. Làm thế nào để thay đổi 1 char trong chuỗi?
- 21. Làm thế nào để bạn chuyển đổi một chuỗi thành ascii thành nhị phân trong C#?
- 22. git: Làm thế nào để bạn thêm một thư mục bên ngoài vào kho lưu trữ?
- 23. Làm thế nào để bạn thêm một biến đổi vào Bộ sưu tập Meteor.users?
- 24. MySQL làm thế nào để bạn thêm vào một tập tin với INTO OUTFILE?
- 25. Làm thế nào để thêm đệm vào một nhãn UILabel?
- 26. Tôi làm cách nào để thêm một chuỗi vào đầu mỗi dòng trong một tệp?
- 27. Làm thế nào để thêm jstl vào một portlet Liferay?
- 28. Làm thế nào để gán một chuỗi char * pw trong C++
- 29. Làm thế nào để đúc một char * thành chuỗi trong D?
- 30. Thêm nhiều chuỗi vào một chuỗi
Sử dụng 'Bộ đệm' có thể phù hợp hơn để phát triển chuỗi. –