2016-09-27 6 views
3

を使用することが可能です。私はそのような記録のそれぞれの型を宣言する必要はありませんが、コンパイラは私にエラーをGEVは、私は例外と例外の理由でした任意のレコードを、ログ機能を持っている匿名の記録に

logExceptionWithObject exn { A = 10; B = 20; C = "some" } 

The record label 'A' is not defined. 
しかし、時々私は私がのための型宣言を持たないレコードにこの関数を呼び出す必要があります

匿名レコードを使用することはできますか?

+3

申し訳ありませんが、F#は匿名レコードを持っていません。しかし、もしあなたが辞書としてそれらを使うつもりなら、どうして彼らはなぜ必要なのですか?実際の辞書を使用してください! –

+0

私は、可能であるときに "ネイティブ" F#タイプを使用しようとしています。ヒントありがとう、私は辞書を使用します。 – demas

+1

F#には['Map'](https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/collections.map-module-%5Bfsharp%5D)があります。これはネイティブです。 –

答えて

8

F#には匿名レコードがありません。しかし、あなたの例では、あなたは辞書としてしか使用していないので、とにかくそれらを必要としないので、本当の辞書を使わないのはなぜですか?

でも、辞書は必要ありません。必要なのは、キーと値のペアのリストだけです。それだけです。

let logExceptionWithObject(exn: exn) map = 
    try 
     delimiter() 
     map |> Seq.iter (fun (k, v) -> sprintf "%s %s" k v |> logger.Error) 
     logger.Error(exn.Message) 
     logger.Verbose("{@Exn}", exn) 
    with 
     | exn -> Console.WriteLine(exn.Message) 

使用法:

logExceptionWithObject exn [ "A","10" ; "B","20" ; "C","some" ] 
+0

Fyodorの使用例のようなタプルのリストでは、実際にタプルのまわりにかっこは必要ないことに注意してください。あなたがそれらをよりよく見るのを助けるならば、あなたは '[(" A "、" 10 ")と書くことができます。 (「B」、「20」)。 ( "C"、 "some")] 'であるが、Fyodorが実証したように、実際にはかっこを書く必要はない。 – rmunn

関連する問題