Düz metin biçimlendirme

F# , , printfnsprintfve ilgili işlevleri kullanarak printfdüz metnin tür denetimi yapılan biçimlendirmesini destekler. Örneğin,

dotnet fsi

> printfn "Hello %s, %d + %d is %d" "world" 2 2 (2+2);;

çıkışı verir

Hello world, 2 + 2 is 4

F# ayrıca yapılandırılmış değerlerin düz metin olarak biçimlendirilmesine de olanak tanır. Örneğin, çıkışı tanımlama demetlerinin matris benzeri bir görüntüsü olarak biçimlendiren aşağıdaki örneği göz önünde bulundurun.

dotnet fsi

> printfn "%A" [ for i in 1 .. 5 -> [ for j in 1 .. 5 -> (i, j) ] ];;

[[(1, 1); (1, 2); (1, 3); (1, 4); (1, 5)];
 [(2, 1); (2, 2); (2, 3); (2, 4); (2, 5)];
 [(3, 1); (3, 2); (3, 3); (3, 4); (3, 5)];
 [(4, 1); (4, 2); (4, 3); (4, 4); (4, 5)];
 [(5, 1); (5, 2); (5, 3); (5, 4); (5, 5)]]

Biçimlendirme dizelerinde printf biçimi kullandığınızda %A yapılandırılmış düz metin biçimlendirmesi etkinleştirilir. Ayrıca F# etkileşimlisinde değerlerin çıkışı biçimlendirilirken de etkinleştirilir; burada çıktı ek bilgiler içerir ve ek olarak özelleştirilebilir. Düz metin biçimlendirmesi, hata ayıklama, günlüğe x.ToString() kaydetme ve diğer araçlarda örtük olarak gerçekleşenler de dahil olmak üzere F# birleşim ve kayıt değerleri üzerinde yapılan tüm çağrılar aracılığıyla da gözlemlenebilir.

printf-format dizeleri denetleniyor

Biçimlendirme işlevi, biçim dizesindeki printf biçim tanımlayıcılarıyla eşleşmeyen bir bağımsız değişkenle kullanıldığında derleme zamanı hatası bildirilir printf . Örneğin,

sprintf "Hello %s" (2+2)

çıkışı verir

  sprintf "Hello %s" (2+2)
  ----------------------^

stdin(3,25): error FS0001: The type 'string' does not match the type 'int'

Teknik olarak, ve diğer ilgili işlevleri kullanırken printf , F# derleyicisindeki özel bir kural biçim dizesi olarak geçirilen dize değişmez değerini denetler ve uygulanan sonraki bağımsız değişkenlerin kullanılan biçim tanımlayıcılarıyla eşleşecek doğru türde olduğundan emin olur.

için biçim tanımlayıcıları printf

Biçimler için printf biçim belirtimleri % , biçimi gösteren işaretçileri olan dizelerdir. Biçim yer tutucuları, türün %[flags][width][.precision][type] aşağıdaki gibi yorumlandığı yerden oluşur:

Biçim belirteci Tür veya tür Açıklamalar
%b bool (System.Boolean) veya olarak true biçimlendirildi false
%s string (System.String) Sıralanmamış içeriği olarak biçimlendirildi
%c char (System.Char) Karakter değişmez değeri olarak biçimlendirildi
%d, %i temel bir tamsayı türü Ondalık tamsayı olarak biçimlendirilmiş, temel tamsayı türü imzalanmışsa imzalı
%u temel bir tamsayı türü İmzasız ondalık tamsayı olarak biçimlendirildi
%x, %X temel bir tamsayı türü İşaretsiz onaltılık sayı olarak biçimlendirilir (sırasıyla onaltılık basamaklar için a-f veya A-F)
%o temel bir tamsayı türü İşaretsiz sekizli sayı olarak biçimlendirildi
%B temel bir tamsayı türü İmzasız ikili sayı olarak biçimlendirildi
%e, %E temel kayan nokta türü Formun [-]d.dddde[sign]ddd d tek ondalık basamak olduğu, ddd'nin bir veya daha fazla ondalık basamak olduğu, ddd'nin tam olarak üç ondalık basamak olduğu ve işaretin ise veya olduğu imzalı bir değer olarak biçimlendirilir +-
%f, %F temel kayan nokta türü formuna [-]dddd.ddddsahip imzalı bir değer olarak biçimlendirilir; burada dddd bir veya daha fazla ondalık basamaktır. Ondalık ayırıcıdan önceki basamak sayısı, sayının büyüklüğüne bağlıdır ve ondalık ayırıcıdan sonraki basamak sayısı istenen duyarlık bağlıdır.
%g, %G temel kayan nokta türü Verilen değer ve duyarlık için hangisi daha küçükse, içinde veya %e biçiminde yazdırılan imzalı %f değer olarak kullanılarak biçimlendirilir.
%M a decimal (System.Decimal) değeri için biçim belirticisi "G" kullanılarak biçimlendirildi System.Decimal.ToString(format)
%O herhangi bir değer Nesneyi kutulayarak ve yöntemini çağırarak System.Object.ToString() biçimlendirildi
%A herhangi bir değer Varsayılan düzen ayarlarıyla yapılandırılmış düz metin biçimlendirmesi kullanılarak biçimlendirildi
%a herhangi bir değer İki bağımsız değişken gerektirir: bağlam parametresini ve değeri kabul eden bir biçimlendirme işlevi ve yazdırılacak belirli değer
%t herhangi bir değer Bir bağımsız değişken gerektirir: uygun metni veren veya döndüren bağlam parametresini kabul eden bir biçimlendirme işlevi
%% (yok) Bağımsız değişken gerektirmez ve düz yüzde işareti yazdırır: %

Temel tamsayı türleri şunlardır byte : (System.Byte), sbyte (System.SByte), int16 (System.Int16), uint16 (System.UInt16System.Int32), uint32int32 (System.UInt32), int64 (System.Int64), uint64 (System.UInt64), nativeint (System.IntPtr) ve unativeint (System.UIntPtr). Temel kayan nokta türleri şunlardır float : (System.Double), float32 (System.Single) ve decimal (System.Decimal).

İsteğe bağlı genişlik, sonucun en düşük genişliğini gösteren bir tamsayıdır. Örneğin, %6d en az altı karakteri dolduracak boşluklar ekleyerek bir tamsayı yazdırır. genişlik ise *, ilgili genişliği belirtmek için fazladan bir tamsayı bağımsız değişkeni alınır.

Geçerli bayraklar şunlardır:

Bayrak Etki
0 Gerekli genişliği oluşturmak için boşluklar yerine sıfırlar ekleyin
- Sonucu belirtilen genişlikte sola yasla
+ Sayı pozitifse bir + karakter ekleyin (negatiflerin işaretiyle eşleştirmek - için)
boşluk karakteri Sayı pozitifse (negatifler için '-' işaretiyle eşleştirmek için) fazladan bir alan ekleyin

Printf # bayrağı geçersiz ve kullanılırsa derleme zamanı hatası bildirilir.

Değerler sabit kültür kullanılarak biçimlendirilir. Kültür ayarları, ve %A biçimlendirme sonuçlarını %O etkilemeleri dışında biçimlendirmeyle ilgisizdirprintf. Daha fazla bilgi için bkz . yapılandırılmış düz metin biçimlendirmesi.

%A Biçimlendirme

%A Biçim belirtici, değerleri okunabilir bir şekilde biçimlendirmek için kullanılır ve tanılama bilgilerini raporlamak için de yararlı olabilir.

İlkel değerler

Tanımlayıcı kullanılarak %A düz metin biçimlendirilirken, F# sayısal değerleri sonekleri ve sabit kültürleriyle biçimlendirilir. Kayan nokta değerleri 10 konum kayan nokta duyarlılığı kullanılarak biçimlendirilir. Örneğin,

printfn "%A" (1L, 3n, 5u, 7, 4.03f, 5.000000001, 5.0000000001)

Üretir

(1L, 3n, 5u, 7, 4.03000021f, 5.000000001, 5.0)

Tanımlayıcı kullanılırken %A dizeler tırnak işaretleri kullanılarak biçimlendirilir. Kaçış kodları eklenmez ve bunun yerine ham karakterler yazdırılır. Örneğin,

printfn "%A" ("abc", "a\tb\nc\"d")

Üretir

("abc", "a      b
c"d")

.NET değerleri

Tanımlayıcıyı %A kullanarak düz metin biçimlendirirken, F# olmayan .NET nesneleri ve System.Globalization.CultureInfo.CurrentUICulturetarafından System.Globalization.CultureInfo.CurrentCulture verilen varsayılan .NET ayarları kullanılarak x.ToString() biçimlendirilir. Örneğin,

open System.Globalization

let date = System.DateTime(1999, 12, 31)

CultureInfo.CurrentCulture <- CultureInfo.GetCultureInfo("de-DE")
printfn "Culture 1: %A" date

CultureInfo.CurrentCulture <- CultureInfo.GetCultureInfo("en-US")
printfn "Culture 2: %A" date

Üretir

Culture 1: 31.12.1999 00:00:00
Culture 2: 12/31/1999 12:00:00 AM

Yapılandırılmış değerler

Tanımlayıcıyı %A kullanarak düz metin biçimlendirirken, F# listeleri ve tanımlama kümeleri için blok girintisi kullanılır. Bu, önceki örnekte gösterilmiştir. Dizilerin yapısı, çok boyutlu diziler de dahil olmak üzere kullanılır. Tek boyutlu diziler söz dizimi ile [| ... |] gösterilir. Örneğin,

printfn "%A" [| for i in 1 .. 20 -> (i, i*i) |]

Üretir

[|(1, 1); (2, 4); (3, 9); (4, 16); (5, 25); (6, 36); (7, 49); (8, 64); (9, 81);
  (10, 100); (11, 121); (12, 144); (13, 169); (14, 196); (15, 225); (16, 256);
  (17, 289); (18, 324); (19, 361); (20, 400)|]

Varsayılan yazdırma genişliği 80'dir. Bu genişlik, biçim belirticisinde bir yazdırma genişliği kullanılarak özelleştirilebilir. Örneğin,

printfn "%10A" [| for i in 1 .. 5 -> (i, i*i) |]

printfn "%20A" [| for i in 1 .. 5 -> (i, i*i) |]

printfn "%50A" [| for i in 1 .. 5 -> (i, i*i) |]

Üretir

[|(1, 1);
  (2, 4);
  (3, 9);
  (4, 16);
  (5, 25)|]
[|(1, 1); (2, 4);
  (3, 9); (4, 16);
  (5, 25)|]
[|(1, 1); (2, 4); (3, 9); (4, 16); (5, 25)|]

0 yazdırma genişliğinin belirtilmesi, yazdırma genişliğinin kullanılmamasıyla sonuçlanıyor. Çıktıdaki eklenmiş dizelerin satır sonları içermesi dışında tek bir metin satırı elde edilir. Örneğin:

printfn "%0A" [| for i in 1 .. 5 -> (i, i*i) |]

printfn "%0A" [| for i in 1 .. 5 -> "abc\ndef" |]

Üretir

[|(1, 1); (2, 4); (3, 9); (4, 16); (5, 25)|]
[|"abc
def"; "abc
def"; "abc
def"; "abc
def"; "abc
def"|]

olarak seq { ...}gösterilen sıralı (IEnumerable) değerler için 4 derinlik sınırı kullanılır. Liste ve dizi değerleri için 100 derinlik sınırı kullanılır. Örneğin,

printfn "%A" (seq { for i in 1 .. 10 -> (i, i*i) })

Üretir

seq [(1, 1); (2, 4); (3, 9); (4, 16); ...]

Blok girintisi, genel kayıt ve birleşim değerlerinin yapısı için de kullanılır. Örneğin,

type R = { X : int list; Y : string list }

printfn "%A" { X =  [ 1;2;3 ]; Y = ["one"; "two"; "three"] }

Üretir

{ X = [1; 2; 3]
  Y = ["one"; "two"; "three"] }

Kullanılırsa %+A , kayıtların ve birleşimlerin özel yapısı da yansıma kullanılarak ortaya çıkar. Örneğin:

type internal R =
    { X : int list; Y : string list }
    override _.ToString() = "R"

let internal data = { X = [ 1;2;3 ]; Y = ["one"; "two"; "three"] }

printfn "external view:\n%A" data

printfn "internal view:\n%+A" data

Üretir

external view:
R

internal view:
{ X = [1; 2; 3]
  Y = ["one"; "two"; "three"] }

Büyük, döngüsel veya derin iç içe yerleştirilmiş değerler

Büyük yapılandırılmış değerler, genel nesne düğümü sayısı üst sınırı olan 10000 olarak biçimlendirilir. İç içe değerler 100 derinliğe biçimlendirilir. Her iki durumda ... da çıkışın bir kısmını ilerletmek için kullanılır. Örneğin,

type Tree =
    | Tip
    | Node of Tree * Tree

let rec make n =
    if n = 0 then
        Tip
    else
        Node(Tip, make (n-1))

printfn "%A" (make 1000)

bazı parçaların elided olduğu büyük bir çıkış üretir:

Node(Tip, Node(Tip, ....Node (..., ...)...))

Döngüler nesne grafiklerinde algılanır ve ... döngülerin algılandığı yerlerde kullanılır. Örneğin:

type R = { mutable Links: R list }
let r = { Links = [] }
r.Links <- [r]
printfn "%A" r

Üretir

{ Links = [...] }

Lazy, null ve işlev değerleri

Değer henüz değerlendirilmediğinde gecikmeli değerler veya eşdeğer metin olarak Value is not created yazdırılır.

Null değerler, değerin statik türünün izin verilen bir gösterim olduğu null birleşim türü olarak belirlenmediği sürece olarak null yazdırılır.

F# işlev değerleri dahili olarak oluşturulan kapanış adı olarak yazdırılır, örneğin, <fun:it@43-7>.

Ile düz metin biçimlendirmesini özelleştirme StructuredFormatDisplay

Tanımlayıcı kullanılırken %A , tür bildirimlerinde özniteliğin StructuredFormatDisplay varlığı dikkate alınıyor. Bu, bir değeri görüntülemek üzere vekil metin ve özelliği belirtmek için kullanılabilir. Örneğin:

[<StructuredFormatDisplay("Counts({Clicks})")>]
type Counts = { Clicks:int list}

printfn "%20A" {Clicks=[0..20]}

Üretir

Counts([0; 1; 2; 3;
        4; 5; 6; 7;
        8; 9; 10; 11;
        12; 13; 14;
        15; 16; 17;
        18; 19; 20])

Geçersiz kılarak düz metin biçimlendirmesini özelleştirme ToString

varsayılan uygulaması ToString F# programlamasında gözlemlenebilir. Varsayılan sonuçlar genellikle programcıya yönelik bilgi görüntüsünde veya kullanıcı çıkışında kullanıma uygun değildir ve sonuç olarak varsayılan uygulamayı geçersiz kılmak yaygın bir durumdur.

Varsayılan olarak, F# kaydı ve birleşim türleri uygulamasını ToString kullanan sprintf "%+A"bir uygulamayla geçersiz kılar. Örneğin,

type Counts = { Clicks:int list }

printfn "%s" ({Clicks=[0..10]}.ToString())

Üretir

{ Clicks = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10] }

Sınıf türleri için varsayılan uygulaması ToString sağlanmadı ve türün adını bildiren .NET varsayılanı kullanılır. Örneğin,

type MyClassType(clicks: int list) =
   member _.Clicks = clicks

let data = [ MyClassType([1..5]); MyClassType([1..5]) ]
printfn "Default structured print gives this:\n%A" data
printfn "Default ToString gives:\n%s" (data.ToString())

Üretir

Default structured print gives this:
[MyClassType; MyClassType]
Default ToString gives:
[MyClassType; MyClassType]

için ToString geçersiz kılma eklemek daha iyi biçimlendirme sağlayabilir.

type MyClassType(clicks: int list) =
   member _.Clicks = clicks
   override _.ToString() = sprintf "MyClassType(%0A)" clicks

let data = [ MyClassType([1..5]); MyClassType([1..5]) ]
printfn "Now structured print gives this:\n%A" data
printfn "Now ToString gives:\n%s" (data.ToString())

Üretir

Now structured print gives this:
[MyClassType([1; 2; 3; 4; 5]); MyClassType([1; 2; 3; 4; 5])]
Now ToString gives:
[MyClassType([1; 2; 3; 4; 5]); MyClassType([1; 2; 3; 4; 5])]

ve ile StructuredFormatDisplay düz metin biçimlendirmesini özelleştirme ToString

ve biçim tanımlayıcıları için tutarlı biçimlendirme elde etmek için %A%O , öğesinin kullanımını StructuredFormatDisplay geçersiz kılma ile birleştirin ToString. Örneğin,

[<StructuredFormatDisplay("{DisplayText}")>]
type MyRecord =
    {
        a: int
    }
    member this.DisplayText = this.ToString()

    override _.ToString() = "Custom ToString"

Aşağıdaki tanımları değerlendirme

let myRec = { a = 10 }
let myTuple = (myRec, myRec)
let s1 = sprintf $"{myRec}"
let s2 = sprintf $"{myTuple}"
let s3 = sprintf $"%A{myTuple}"
let s4 = sprintf $"{[myRec; myRec]}"
let s5 = sprintf $"%A{[myRec; myRec]}"

metni verir

val myRec: MyRecord = Custom ToString
val myTuple: MyRecord * MyRecord = (Custom ToString, Custom ToString)
val s1: string = "Custom ToString"
val s2: string = "(Custom ToString, Custom ToString)"
val s3: string = "(Custom ToString, Custom ToString)"
val s4: string = "[Custom ToString; Custom ToString]"
val s5: string = "[Custom ToString; Custom ToString]"

öğesinin StructuredFormatDisplay destekleyici DisplayText özelliğiyle kullanılması, yapısal bir kayıt türü olduğu gerçeğinin myRec yapılandırılmış yazdırma sırasında yoksayıldığı ve geçersiz kılmanın ToString() her koşulda tercih olduğu anlamına gelir.

.NET biçim belirtimlerinin System.IFormattable varlığında daha fazla özelleştirme için arabirimin bir uygulaması eklenebilir.

F# Etkileşimli yapılandırılmış yazdırma

F# Etkileşimli (dotnet fsi), değerleri raporlamak için yapılandırılmış düz metin biçimlendirmesinin genişletilmiş bir sürümünü kullanır ve ek özelleştirilebilirlik sağlar. Daha fazla bilgi için bkz . F# Etkileşimli.

Hata ayıklama ekranlarını özelleştirme

.NET hata ayıklayıcıları ve DebuggerTypeProxygibi DebuggerDisplay özniteliklerin kullanımına saygı gösterir ve bunlar hata ayıklayıcı inceleme pencerelerindeki nesnelerin yapılandırılmış görünümünü etkiler. F# derleyicisi, ayrımcı birleşim ve kayıt türleri için bu öznitelikleri otomatik olarak oluşturur, ancak sınıf, arabirim veya yapı türleri için oluşturmaz.

Bu öznitelikler F# düz metin biçimlendirmesinde yoksayılır, ancak F# türlerinde hata ayıklarken ekranları geliştirmek için bu yöntemleri uygulamak yararlı olabilir.

Ayrıca bkz.