عند العمل مع أي لغة ، ستحتاج على الأرجح إلى تنسيق النص ، ولا يختلف الأمر F #.
نظرًا لأن F # لغة .NET ، يمكننا دائمًا استخدام Console.WriteLine (..) و String.Format (..) ، حيث يمكننا استخدام أي من التنسيقات المعتادة التي استخدمتها في التعليمات البرمجية .NET العادية.
ومع ذلك ، يدعم F # أيضًا أسلوب C يشبه بناء الجملة ، والذي يتوفر في الوحدة النمطية Core.Printf. يمكن استخدام دالة واحدة بداخلها بدلاً من استخدام فئة .NET Console.WriteLine (..).
دالة F # المكافئة التي يجب استخدامها للكتابة إلى الإخراج القياسي هي printfn ، والتي هي في الحقيقة الطريقة المفضلة عند العمل مع تنسيق النص في F #.
لماذا هو printfn الأفضل Console.WriteLine (..)؟
هناك العديد من الأسباب وراء تفضيل printfn ؛ فيما يلي بعض الأسباب الرئيسية:
- نوع ثابت فحص. هذا يعني أننا إذا تجاوزنا قيمة int حيث من المتوقع حدوث السلسلة ، سيتم تحذيرنا من ذلك
- نظرًا لأن printfn هي وظيفة F # أصلية ، فهي تعمل تمامًا مثل أي وظيفة F # أخرى.
النظر في مقتطفات التعليمات البرمجية التالية
// printfn "should be a decimal value %d" "cat" // printfn "should be a decimal value %d" 42 // , Console.WriteLine("should be a decimal value {0}" , "cat") // printfn "this only expected 1 arg of type decimal %d" 42 "dog" // , Console.WriteLine("this only expected 1 arg of type decimal {0}" , 42, "dog") // , printfn "this only expected 2 args of type decimal %d and string %s" 42 "dog"
إذا نظرنا الآن إلى لقطة شاشة لهذه الشفرة في IDE Visual Studio ، نرى حقًا أن الخطوط التي توقعنا فشلها تظهر بشكل خاطئ:

كيفية استخدام printfn؟
ربما يكون من الأفضل أن تبدأ من خلال النظر في بعض التنسيقات القياسية المتاحة للعمل مع القيم. يعرض جدول MSDN التالي عوامل التشغيل القياسية المتاحة لك:
msdn.microsoft.com/en-us/library/ee370560.aspxفماذا عن إنشاء تنسيق رائع إلى جانب المعيار؟
لذلك ، الآن رأينا كيفية كتابة الإخراج المنسق إلى الإخراج القياسي (printfn فعلت هذا) ، ولكن ماذا لو أردنا استخدام الخط المنسق في أماكن أخرى؟ ماذا لو أردنا ربط قيمة سلسلة مع سلسلة منسقة بشكل جميل أنشأناها باستخدام بعض أدوات التنسيق أعلاه ، أو حتى أردنا الكتابة إلى StringBuilder أو TextWriter ، هل تجعل F # هذا الأمر سهلاً؟
حسنًا ، نعم ، ستجد العديد من الميزات المفيدة الأخرى في وحدة Core.Printf. القائمة الكاملة في وقت كتابة هذا التقرير كانت كما يلي:
قائمةbprintf الطباعة إلى StringBuilder.
eprintf يطبع الإخراج المنسق إلى stderr.
eprintfn يطبع الإخراج المنسق إلى stderr عن طريق إضافة سطر جديد.
failwithf يطبع على المخزن المؤقت لسلسلة ويلقي استثناء مع النتيجة المعطاة. يجب أن ترجع الطابعات الثانوية السلاسل.
fprintf يطبع على نص الكاتب.
fprintfn يطبع على نص الكاتب بإضافة سطر جديد.
kbprintf يشبه bprintf ، لكنه يستدعي الوظيفة المحددة لإنشاء النتيجة. انظر kprintf.
kfprintf يشبه fprintf ، لكنه يستدعي الوظيفة المحددة لإنشاء النتيجة. انظر kprintf.
kprintf مثل printf ، لكنه يستدعي الوظيفة المحددة لإنشاء النتيجة. على سبيل المثال ، يسمحون بإعادة الطباعة بالقوة بعد إدخال جميع المخرجات في القناة ، ولكن ليس قبل ذلك.
kspintf أعجبني sprintf ، لكنه يستدعي الوظيفة المحددة لإنشاء النتيجة. انظر kprintf.
printf يطبع الإخراج المنسق إلى الإخراج القياسي.
printfn يطبع الإخراج المنسق إلى الإخراج القياسي بإضافة سطر جديد.
sprintf يطبع على سلسلة باستخدام المخزن المؤقت للسلسلة الداخلية ، وإرجاع النتيجة كسلسلة. يجب أن ترجع الطابعات الثانوية السلاسل.
لن أتطرق إلى كل هذا ، لكنني سأعتبر الأكثر شيوعًا:
bprintf
يطبع على StringBuilder.
let builder = new StringBuilder(524288) Printf.bprintf builder "This will be a string line : %s\r\n" "cat" Printf.bprintf builder "This will be a bool line : %b\r\n" true Printf.bprintf builder "This will be a int line : %u\r\n" 42 Printf.bprintf builder "This will be a hex line : %X\r\n" 255 printfn "%s" (builder.ToString())
هذا سيعطي هذا الإخراج في تطبيق وحدة F #
fprintf
يطبع في كاتب النص.
use sw = new StreamWriter(@"c:\temp\fprintfFile.txt") fprintf sw "This is a string line %s\r\n" "cat" fprintf sw "This is a int line %i" 10 sw.Close()
سيؤدي ذلك إلى إنشاء الملف مؤقتًا

sprintf
let result = Printf.sprintf "This will return a formatted string : %s\r\n" "cat" printfn "%s" result
