آموزش #F قسمت ۵

https://virgool.io/fsharp/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-f-%D9%82%D8%B3%D9%85%D8%AA-%DB%B4-uhvoliggtgau

در این قسمت به مبحث نوع داده Record می پردازیم.

اگر مطلب قبل خونده باشید با تاپل ها آشنا هستید در واقع تاپل ها زیر مجموعه رکورد ها هستند. بزارید رکوردها رو تعریف کنم تا باهاشون آشنا بشید.

در واقع رکوردها همون تاپل هستند با این تفاوت که برای هر آیتم یک نام انتخاب می کنیم. اگر با برنامه نویسی شی گرا آشنا باشید میدونید که میایم یک کلاس تعریف می کنیم و بعد از روی اون کلاس یک شی ایجاد می کنیم که متغیرهای تعریف شده توی اون کلاس رو توی شی مقدار دهی می کنیم. رکوردها هم همینجورن.

type Animal = { Name:string; Weight:int; Wings:bool }
let cat = { Name="cat"; Weight=12; Wings=false }

توضیح:

  1. خط اول میایم نوع داده شبیه همون کلاسهای برنامه شی گرا تعریف می کنیم میگه این نوع Animal سه تا متغیر میگیره( نام از نوع رشته، وزن از نوع عدد و بال از نوع bool(درست و غلط))
  2. توی این خط میایم یک رکورد به نام cat میسازیم که اون متغیرهای بالا رو نام گذاری می کنیم. نامشو برابر cat قرار میدیم وزنشو برابر ۱۲ میدیم و بال رو برابر غلط قرار میدیم که یعنی بال نداره.

نکته: برای تعریف رکوردها از آکلاد {} استفاده می کنیم و حتما قبل از record باید یک نوع type‌ تعریف کرده باشیم.

نکته: اگر چندین type تعریف کرده باشیم خودکار میاد با اونی که ورودیهاش میخونه تنظیم می کنه. و اگر بخوایم با یک تایپ خاص هماهنگ بشه از روش زیر استفاده می کنیم.نوع تایپ رو قبل از اولین آرگومان میاریم.

type Point = { X: float; Y: float; Z: float; } 
type Point3D = { X: float; Y: float; Z: float } 
let myPoint1 = { Point.X = 1.0; Y = 1.0; Z = 0.0; }

تو قسمت قبل گفتم که میتونی به مقادیر تاپل ها جداگونه دستری داشته باشیم با fst و snd و ... ، توی رکوردها میتونیم با صدا زدن نامشون به اون مقادیر دسترسی داشته باشیم دقیقا مثل شی در سی شارپ.

type Animal = { Name:string; Weight:int; Wings:bool }
let cat = { Name="cat"; Weight=12; Wings=false }
printfn "%A" cat
printfn "%A" cat.Name
printfn "%A" cat.Weight
printfn "%A" cat.Wings
let dog = { cat with Name="dog" }
printfn "%A" dog
let bird = { cat with Name="bird"; Wings=true }
printfn "%A" bird 
let hen = {bird with Name="hen"}  

توضیح:

همونطور که میبینید در خطوط ۴ تا ۶ به متغیرها با صدا زدن نامشون دسترسی داریم.

در خط هفتم یک رکورد دیگه به نام dog میسازیم که درواقع همون cat رو اپدیت می کنیم و اسمش رو تغییر میدیم به dog

در خط ۹ هم یک رکورد دیگه به نام پرنده میسازیم و متغیرها رو از روی cat‌ اپدیت می کنیم . متغیرهایی که اپدیت نمی کنیم مثل همون سابق میمونند.

خط یازده هم یک روش دیگه تعریف رکورد از روی یک رکورد دیگه هست

نکته: رکوردها غیر قابل تغییر یا همون immutable‌ هستند و شما نمیتونید اونا رو اپدیت کنید.

برای قابل اپدیت شدن از روش زیر استفاده می کنیم.

type Car = { Make : string; Model : string; mutable Odometer : int }
let myCar = { Make = "Fabrikam"; Model = "Coupe"; Odometer = 108112 } 
myCar.Odometer <- myCar.Odometer + 21 

تو تایپ اون متغیری که قابل اپدیت شدن هست رو mutable ‌قرار میدیم.

https://virgool.io/fsharp/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-f-%D9%82%D8%B3%D9%85%D8%AA-%DB%B6-pmupejneauml