Что лучший способ жесткого кодирования многострочной строки?
В unit test я хотел бы жестко закодировать блок строк в виде строки.
В С# я бы сделал
var sb = new StringBuilder();
sb.AppendLine("myline1");
sb.AppendLine("myline2");
sb.AppendLine("myline3");
Так как я преобразовал в F #, я попытался свести к минимуму использование метода .Net, используя bprintf
вместо этого, но почему-то нет поддержки bprintfn
, которая кажется мне странной.
Нужно добавить \r\n
в конце каждой строки вручную.
Или есть лучший способ, чем StringBuilder
?
Ответы
Ответ 1
Я думаю, что нет проблемы с использованием StringBuilder
в F #, как и вы.
Существует функция fprintfn
в Printf module, поэтому вы можете использовать ее с объектом StringWriter
:
let sw = new StringWriter()
fprintfn sw "myline1"
fprintfn sw "myline2"
fprintfn sw "myline3"
sw.ToString()
Мне нравится fprintf
и fprintfn
, поскольку они являются гибкими. Вы можете записать на консольный вывод, поставив вместо него stdout
.
Ответ 2
Малоизвестная функция: вы действительно можете отступать от строкового содержимого - заканчивая каждой строкой обратную косую черту. Ведущие пробелы в следующей строке разделяются:
let poem = "The lesser world was daubed\n\
By a colorist of modest skill\n\
A master limned you in the finest inks\n\
And with a fresh-cut quill.\n"
Вам все равно нужно включить \n
или \n\r
в конце строки (как это сделано в примере выше), если вы хотите, чтобы они были встроены в вашу окончательную строку.
Ответ 3
Если вы находитесь под F # 3.0, это могут быть три строки:
let x = """
myline1
myline2
myline3"""
Ответ 4
Я удивлен, что никто не упомянул об этом:
[ "My first line"
"second line"
"another line" ]
|> String.concat "\n"
Ответ 5
Вы можете создавать непосредственно многострочные строковые литералы в F #:
let multiLineStr =
"myline1
myline2
myline3"
и С#:
var multiLineStr =
@"myline1
myline2
myline3";
Ответ 6
Вы можете определить свою собственную функцию bprintfn
:
let bprintfn bldr fmt =
(bldr, fmt) ||> Printf.kbprintf bldr.AppendLine
Или, чтобы определить многострочный литерал, вы можете использовать три кавычки в качестве предложенного bytebuster или "дословный литерал", который начинается с @
(см. Строки в MSDN).
Ответ 7
Я не знаком с F #, но вы можете адаптировать мой обычный подход:
['line1', 'line2', 'line3'].join('\n'); //javascript
StringUtils.join(Arrays.asList("line1", "line2", "line3"), "\n")); // java, using Apache Commons Lang