F # 7: السجلات

لذلك ، نواصل رحلتنا إلى المزيد من أنواع F #. هذه المرة سوف نلقي نظرة على أنواع السجلات.

كيف يمكنني إنشاء وظيفة


عند إنشاء إدخال F # جديد ، يمكن أن يذكرك بالكائنات مجهولة في C #. هذه هي الطريقة التي تقوم بإنشائها. أعتقد أنها تشبه إلى حد بعيد الكائنات المجهولة في C # ، لذلك إذا استخدمت C # ، فلا ينبغي أن تكون إدخالات F # معقدة.

كل شيء يبدأ بإنشاء نوع جديد للتسجيل. يسرد تعريف الكتابة اسم الخصائص ، وكذلك نوع الخصائص ، كما يمكن رؤيته أدناه.

إذا كان لديك تعريف لنوع السجل ، فيمكنك ربط مثيل جديد بقيمة باستخدام Let. مرة أخرى ، يمكن الاطلاع على مثال على ذلك أدناه ، حيث نربط سجلًا جديدًا باستخدام الرابط Let ، ونطبع أيضًا خصائص مثيل السجل في إخراج وحدة التحكم.

type Person = { Age : int; Sex: string; Name:string; } .... .... .... .... let sam = { Age = 12; Sex="Male"; Name ="Sam" } printfn "let sam = { Age = 12; Sex=\"Male\"; Name=\"Sam\" }" printfn "Person with Age is %i and Sex is %s and Name is %s" sam.Age sam.Sex sam.Name 

صورة

كيف يمكنني تغيير / استنساخ سجل


يمكنك استنساخ وتعديل الإدخال ، والذي يتم عادةً على النحو التالي:

 let sam = { Age = 12; Sex="Male"; Name ="Sam" } let tom = { sam with Name="Tom" } printfn "let tom = { sam with Name=\"Tom\" }" printfn "Person with Age is %i and Sex is %s and Name is %s" tom.Age tom.Sex tom.Name 

صورة

لاحظ كيف استخدمنا الكلمة الرئيسية عند إنشاء نسخة جديدة من Tom Person. يُسمى هذا النوع من تعبير السجل " نسخ وتحديث تعبير السجل ". هناك خيار آخر يمكنك استخدامه (مرة أخرى ، سنتحدث عن ذلك بمزيد من التفاصيل في المنشور التالي) وهو استخدام خاصية قابلة للتغيير في نوع المنشور. الإدخالات غير قابلة للتغيير بشكل افتراضي. ومع ذلك ، يمكنك أيضًا تحديد حقل قابل للتغيير بشكل صريح.

فيما يلي مثال ، لاحظ كيف أنشأت نوعًا جديدًا به خاصية قابلة للتغيير تسمى MutableName. من خلال تحديد حقل قابل للتغيير ، يُسمح لي بتحديث قيمة خاصية MutableName للسجل ، والتي يمكنك القيام بها باستخدام عامل التشغيل "<-". الذي يسمح لك فقط بتعيين قيمة جديدة.

 type MutableNamePerson = { Age : int; Sex: string; mutable MutableName:string; } .... .... .... .... //create let sam = { Age = 12; Sex="Male"; MutableName ="Sam" } printfn "let sam = { Age = 12; Sex=\"Male\"; Name=\"Sam\" }" printfn "Person with Age is %i and Sex is %s and Name is %s" sam.Age sam.Sex sam.MutableName //update sam.MutableName <- "Name changed" printfn "sam.MutableName <- \"Name changed\"" printfn "Person with Age is %i and Sex is %s and Name is %s" sam.Age sam.Sex sam.MutableName 

صورة

مقارنة السجلات


تكون أنواع السجلات متساوية فقط إذا كانت جميع الخصائص متشابهة. هنا مثال:

 type Person = { Age : int; Sex: string; Name:string; } .... .... .... .... let someFunction p1 p2 = printfn "p1=%A, and p2=%A, are they equal %b" p1 p2 (p1=p2) let sam = { Age = 12; Sex = "Male"; Name = "Sam" } let john = { Age = 12; Sex = "Male"; Name = "John" } let april = { Age = 35; Sex = "Female"; Name = "April" } let sam2 = { Age = 12; Sex = "Male"; Name = "Sam" } do someFunction sam john do someFunction sam april do someFunction sam sam2 

صورة

أنماط مقارنة السجل


بالطبع ، يمكنك استخدام مطابقة الأنماط (المناقشة في اليوم التالي) ، وهي طريقة F # الرئيسية ، لمطابقة أنواع السجلات. هنا مثال:

 type Person = { Age : int; Sex: string; Name:string; } ..... ..... ..... ..... let someFunction (somePerson :Person) = match somePerson with | { Name="Sam" } -> printfn "Sam is in the house" | _ -> printfn "you aint Sam, get outta here clown" let sam = { Age = 12; Sex="Male"; Name ="Sam" } let john = { Age = 12; Sex="Male"; Name ="John" } do someFunction sam do someFunction john 

صورة

الأساليب والخصائص


من الممكن أيضًا إضافة أعضاء إضافيين إلى الإدخالات. فيما يلي مثال حيث قمنا بإضافة خاصية "Details" للسماح لنا بالحصول على معلومات كاملة حول السجل باستخدام خاصية واحدة (بقدر ما نستطيع تحقيقه من خلال تجاوز أسلوب ToString () ، ولكن المزيد حول أساليب OOP لاحقًا)

يرجى ملاحظة أنه إذا حاولت إضافة عنصر إلى تعريف نوع التسجيل ، كما هو موضح في لقطة الشاشة ، فسوف تحصل على خطأ غريب

صورة

هذا سهل الحل بمجرد وضع تعريفات خاصية السجل على سطر جديد ، والتأكد من أن العنصر يبدأ أيضًا في سطر جديد ، ويلاحظ المسافة البادئة (المسافة) ، لأن كل هذا مهم في F #:

 type Person = { Age : int; Sex: string; Name:string; } member this.Details = this.Age.ToString() + " " + this.Sex.ToString() + " " + this.Name .... .... .... .... let sam = { Age = 12; Sex = "Male"; Name = "Sam" } printfn "sam Details=%s" sam.Details 

صورة

Source: https://habr.com/ru/post/ar470273/


All Articles