什么是硬编码多行字符串的最佳方法?

时间:2013-01-29 15:29:17

标签: f#

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

在C#中我会做

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

由于我转换为F#,我试图通过使用bprintf来最小化.Net方法的使用,但不知何故没有bprintfn支持,这对我来说很奇怪。

手动在每行末尾添加\r\n非常繁琐。

还是有比StringBuilder更好的方法吗?

7 个答案:

答案 0 :(得分:79)

鲜为人知的特征:你确实可以缩进字符串内容 - 用反斜杠结束每一行。剥离以下行的前导空格:

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(如上例所示)。

答案 1 :(得分:49)

如果你在F#3.0下,三重引用的字符串可能就是答案:

let x = """
myline1
myline2
myline3"""   

答案 2 :(得分:11)

我很惊讶没人提到这个:

[ "My first line"
  "second line"
  "another line" ]
|> String.concat "\n"

答案 3 :(得分:6)

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

let multiLineStr = 
  "myline1
myline2
myline3"

和C#:

var multiLineStr =
  @"myline1
myline2
myline3";

答案 4 :(得分:6)

我认为在F#中使用StringBuilder没有问题。

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

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

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

答案 5 :(得分:2)

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

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

或者,要定义一个多行文字,你可以使用三引号作为bytebuster建议或一个"逐字文字,"以@开头(请参阅Strings on MSDN)。

答案 6 :(得分:0)

我与F#脱节了,但你可能能够适应我的常规方法:

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

StringUtils.join(Arrays.asList("line1", "line2", "line3"), "\n")); // java, using Apache Commons Lang