Подтвердить что ты не робот

Что лучший способ жесткого кодирования многострочной строки?

В unit test я хотел бы жестко закодировать блок строк в виде строки.

В С# я бы сделал

var sb = new StringBuilder();
sb.AppendLine("myline1");
sb.AppendLine("myline2");
sb.AppendLine("myline3");

Так как я преобразовал в F #, я попытался свести к минимуму использование метода .Net, используя bprintf вместо этого, но почему-то нет поддержки bprintfn, которая кажется мне странной.

Нужно добавить \r\n в конце каждой строки вручную.

Или есть лучший способ, чем StringBuilder?

4b9b3361

Ответ 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