عندما تحمل إحدى صيغ النوع المخصص بيانات، فإنها تُسمّى سجلًا، وتقع كل قيمة يحتويها في حقل.
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
سجّل في Exercism لتتعلّم وتتقن Gleam عبر 33 مفهومًا122 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.