Düz metin biçimlendirme
F# , , printfn
sprintf
ve ilgili işlevleri kullanarak printf
dü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.dddd sahip 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.UInt16
System.Int32
), uint32
int32
(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.CurrentUICulture
tarafı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 DebuggerTypeProxy
gibi 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.