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"

ただし、これらを最終的な文字列に埋め込む場合は、行末に\norを含める必要があります (上記の例で行ったように)。\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

If you are under F# 3.0, triple-quoted strings may be the answer:

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 moduleには関数がある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

または、複数行のリテラルを定義するには、バイトバスターが提案するトリプルクォート、またはで始まる「逐語的なリテラル」を使用できます( 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 に答える