35

在单元测试中,我想将一行行硬编码为字符串。

在 C# 中我会做

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

自从我转换为 F# 后,我尝试通过使用来尽量减少 .Net 方法的使用bprintf,但不知何故,没有bprintfn支持,这对我来说似乎很奇怪。

\r\n在每一行的末尾手动添加是很乏味的。

或者有什么比这更好的方法StringBuilder吗?

4

7 回答 7

101

鲜为人知的功能:您确实可以缩进字符串内容 - 通过以反斜杠结束每一行。以下行的前导空格被删除:

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

编辑以回答@MiloDCs 问题:

要与 sprintf 一起使用:

let buildPoem character =
    sprintf "The lesser world was daubed\n\
             By a colorist of modest skill\n\
             A master limned %s in the finest inks\n\
             And with a fresh-cut quill.\n" character

buildPoem "you"            
buildPoem "her"
buildPoem "him"
于 2013-01-30T08:44:52.110 回答
56

如果您在 F# 3.0 下,三引号字符串可能是答案:

let x = """
myline1
myline2
myline3"""   
于 2013-01-29T15:36:25.673 回答
15

我很惊讶没有人提到这一点:

[ "My first line"
  "second line"
  "another line" ]
|> String.concat "\n"
于 2013-01-31T17:45:54.083 回答
10

您可以在 F# 中直接创建多行字符串文字:

let multiLineStr = 
  "myline1
myline2
myline3"

和 C#:

var multiLineStr =
  @"myline1
myline2
myline3";
于 2013-01-29T15:34:43.037 回答
8

StringBuilder我认为像你一样在 F# 中使用没有问题。

Printf 模块fprintfn中有一个函数,因此您可以将其与对象一起使用:StringWriter

let sw = new StringWriter()
fprintfn sw "myline1"
fprintfn sw "myline2"
fprintfn sw "myline3"
sw.ToString()

我喜欢fprintffprintfn因为它们很灵活。您可以通过提供来写入控制台输出stdout

于 2013-01-29T15:44:55.580 回答
2

您可以定义自己的bprintfn功能:

let bprintfn bldr fmt =
  (bldr, fmt) ||> Printf.kbprintf bldr.AppendLine

或者,要定义多行文字,您可以使用三引号作为 bytebuster 建议或以开头的“逐字文字” @(请参阅​​ MSDN 上的字符串)。

于 2013-01-29T15:34:30.587 回答
0

我与 F# 脱节,但你也许可以适应我的正常方法:

['line1', 'line2', 'line3'].join('\n'); //javascript

StringUtils.join(Arrays.asList("line1", "line2", "line3"), "\n")); // java, using Apache Commons Lang
于 2013-01-29T15:39:13.223 回答