4

例で示す方が簡単です。以下をF#インタラクティブに送信すると

type Person = {Name : string; Age : int}
let joe = {Name = "Joe"; Age=30}

出力は次のとおりです。

type Person =
  {Name: string;
   Age: int;}
val joe : Person = {Name = "Joe";
                    Age = 30;}

Fsi は、すべてのプロパティを出力できるほどスマートです。

以下を一行ずつ送信する

let l = new List<int>()
l

結果は

val l : List<int>
val it : List<int> = seq []

Fsi は がl実装されていることを確認しIEnumerable、(当然のことながら) これが私が期待するものであると考えています。lしかし、特にCountとには他のプロパティがありCapacityます。(リストにとってはそれほど重要ではありませんが、私の場合は複合型の場合です)

F# をインタラクティブにオブジェクトのプロパティを出力し、それを無視するにはどうすればよいIEnumerableですか? Person(最初の例の型と同じように)

4

2 に答える 2

8

を使用してカスタム プリンタを提供できますfsi.AddPrinter。特定の型をフォーマットする方法を指定する関数が必要です。これを汎用的に行う簡単な方法はないと思いますがIEnumerable、この場合は非汎用を使用できます。以下は、デフォルトの印刷を使用してシーケンスを印刷し、 を追加しますCount

fsi.AddPrinter(fun (en:System.Collections.IEnumerable) -> 
  let count = Seq.cast<obj> en |> Seq.length
  sprintf "%A { Count = %d }" en count
)

例えば:

> l;;
val it : List<int> = seq [] { Count = 0 }
> seq { 1 .. 100000 };;
val it : seq<int> = seq [1; 2; 3; 4; ...] { Count = 100000 }

おかしなことに、これは文字列の出力も変更しますが、en値が文字列型でない場合にのみカスタム プロパティを追加することで、これを回避できます。

> "hello";;
val it : string = "hello" { Count = 5 }
于 2013-08-21T13:38:11.783 に答える
1

メソッドをオーバーライドする.ToStringと、fsi は代わりにそれを使用します。[<StructuredFormatDisplay>]FSI にのみ影響を与えたい場合は、属性を使用することもできます

于 2013-08-21T13:40:20.257 に答える