在单元测试中,我想将一行代码硬编码为字符串。
在C#中我会做
var sb = new StringBuilder();
sb.AppendLine("myline1");
sb.AppendLine("myline2");
sb.AppendLine("myline3");
由于我转换为F#,我试图通过使用bprintf
来最小化.Net方法的使用,但不知何故没有bprintfn
支持,这对我来说很奇怪。
手动在每行末尾添加\r\n
非常繁琐。
还是有比StringBuilder
更好的方法吗?
答案 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()
我喜欢fprintf
和fprintfn
,因为它们很灵活。您可以通过提供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