وقتی گونهای از یک «نوع دادهی سفارشی» دادهای را در خود نگه میدارد، به آن «رکورد» میگویند و هر مقدارِ درون آن در یک «فیلد» جای میگیرد.
pub type Rectangle {
Rectangle(
Float, // The first field
Float, // The second field
)
}
Gleam برای کمک به خوانایی اجازه میدهد فیلدها با یک اسم برچسبگذاری شوند.
pub type Rectangle {
Rectangle(
width: Float,
height: Float,
)
}
از برچسبها میتوان استفاده کرد تا آرگومانها را با هر ترتیبی به سازندهی یک رکورد داد.
let a = Rectangle(height: 10.0, width: 20.0)
let b = Rectangle(width: 20.0, height: 10.0)
a == b
// -> True
وقتی یک نوع دادهی سفارشی تنها یک گونه دارد، میتوان برای گرفتن فیلدهای یک رکورد از نحوهی نگارش دسترسی .label استفاده کرد.
let rect = Rectangle(height: 10.0, width: 20.0)
rect.height // -> 10.0
rect.width // -> 20.0
وقتی یک نوع دادهی سفارشی تنها یک گونه دارد، میتوان از نحوهی نگارش بهروزرسانی رکورد استفاده کرد تا از روی رکوردی موجود، رکوردی تازه ساخت، با این تفاوت که بعضی از فیلدها با مقدارهای جدید جایگزین شدهاند.
let rect = Rectangle(height: 10.0, width: 20.0)
let tall_rect = Rectangle(..rect, height: 50.0)
tall_rect.height // -> 50.0
tall_rect.width // -> 20.0
از برچسبها هنگام تطبیق الگو هم میتوان استفاده کرد تا مقدارها از رکوردها استخراج شوند.
pub fn is_tall(rect: Rectangle) {
case rect {
Rectangle(height: h, width: _) if h >. 20.0 -> True
_ -> False
}
}
اگر بخواهیم فقط با بعضی از فیلدها تطبیق پیدا کنیم، میتوانیم از عملگر گسترش .. استفاده کنیم تا فیلدهای باقیمانده نادیده گرفته شوند.
pub fn is_tall(rect: Rectangle) {
case rect {
Rectangle(height: h, ..) if h >. 20.0 -> True
_ -> False
}
}
در این تمرین شما یک هوادار پرشور ورزش هستید و تازه شور و شوق بسکتبال NBA را در خود کشف کردهاید. چون تازه با بسکتبال NBA آشنا شدهاید، در تاریخ NBA کندوکاو میکنید، تیمها، مربیها و آمار برد و باختشان را پیگیری میکنید و آنها را با هم مقایسه میکنید.
چون هنوز تیم محبوبی ندارید، الگوریتمی هم میسازید تا بفهمید آیا باید از یک تیم خاص طرفداری کنید یا نه.
هفت کار پیش رو دارید که به شما کمک میکنند الگوریتم اختصاصی طرفداری از یک تیم خود را بسازید.
رکورد Coach را با دو فیلد زیر تعریف کنید:
name: اسم مربی، از نوع String.former_player: نشان میدهد که آیا مربی بازیکن پیشین بوده است یا نه، از نوع Bool.رکورد Stats را با دو فیلد زیر تعریف کنید:
wins: تعداد بردها، از نوع Int.losses: تعداد باختها، از نوع Int.رکورد Team را با سه فیلد زیر تعریف کنید:
name: اسم تیم، از نوع String.coach: مربی تیم، از نوع Coach.stats: آمار تیم، از نوع Stats.تابع create_coach را پیادهسازی کنید که اسم مربی و وضعیت او به عنوان بازیکن پیشین را به عنوان پارامتر میگیرد و رکورد Coach آن را برمیگرداند:
create_coach("Larry Bird", True)
// -> Coach(name: "Larry Bird", former_player: True)
تابع create_stats را پیادهسازی کنید که تعداد بردها و تعداد باختها را به عنوان پارامتر میگیرد و رکورد Stats آن را برمیگرداند:
create_stats(58, 24)
// -> Stats(wins: 58, losses: 24)
تابع create_team را پیادهسازی کنید که اسم تیم، مربی و رکورد را به عنوان پارامتر میگیرد و رکورد Team آن را برمیگرداند:
let coach = create_coach("Larry Bird", True)
let stats = create_stats(58, 24)
create_team("Indiana Pacers", coach, stats)
// -> Team(
// name: "Indiana Pacers",
// coach: Coach(name: "Larry Bird", FormerPlayer = True),
// stats: Stats(wins: 58, losses: 24),
// )
مالکان NBA بیحوصلهاند و شما دیدهاید که نتایج بد تیم اغلب به جایگزین شدن مربی میانجامد. تابع replace_coach را پیادهسازی کنید که تیم و مربی جدیدش را به عنوان پارامتر میگیرد و تیم را با مربی جدیدش برمیگرداند:
let coach = create_coach("Larry Bird", True)
let record = create_stats(58, 24)
let team = create_team("Indiana Pacers", coach, record)
let new_coach = create_coach("Isiah Thomas", True)
replace_coach(team, new_coach)
// -> Team(
// name: "Indiana Pacers",
// coach: Coach(name: "Isiah Thomas", FormerPlayer = True),
// stats: Stats(wins: 58, losses: 24),
// )
در حین بررسی آمار، فهرستهایی از تیمها و رکوردهایشان نگه میدارید. گاهی اشتباه میکنید و در فهرستتان ورودیهای تکراری پیدا میشود. تابع is_same_team را پیادهسازی کنید که دو تیم میگیرد و اگر تیم یکسانی باشند True و در غیر این صورت False برمیگرداند:
let pacers_coach = create_coach("Larry Bird", True)
let pacers_stats = create_stats(58, 24)
let pacers_team = create_team("Indiana Pacers", pacers_coach, pacers_stats)
let lakers_coach = create_coach("Del Harris", False)
let lakers_stats = create_stats(61, 21)
let lakers_team = create_team("LA Lakers", lakers_coach, lakers_stats)
is_same_team(pacers_team, lakers_team)
// -> False
پس از بررسی تیمها و مسابقههای زیادی، به یک الگوریتم رسیدهاید. اگر یکی از موارد زیر «درست» باشد، از آن تیم طرفداری میکنید:
تابع root_for_team را پیادهسازی کنید که یک تیم میگیرد و اگر باید از آن تیم طرفداری کنید True و در غیر این صورت False برمیگرداند:
let spurs_coach = create_coach("Gregg Popovich", False)
let spurs_stats = create_stats(56, 26)
let spurs_team = create_team("San Antonio Spurs", spurs_coach, spurs_stats)
root_for_team(spurs_team)
// -> True