تحتوي Crystal على مجموعة متنوعة من أنواع الأعداد المختلفة لأغراض متعددة. على سبيل المثال، بعض الأنواع أسرع لكن مدى قيمها الممكنة أصغر من غيرها. وبعضها الآخر له مدى أوسع من القيم الممكنة لكنه أبطأ.
في Crystal، توجد أنواع الأعداد الصحيحة الموقّعة وأنواع الأعداد الصحيحة غير الموقّعة. يمكن أن تكون الأعداد الصحيحة الموقّعة موجبة أو سالبة. أما الأعداد الصحيحة غير الموقّعة فلا يمكن أن تكون إلا موجبة.
هذه هي أنواع الأعداد الصحيحة الموقّعة في Crystal:
| النوع | الحجم (بت) | المدى |
|---|---|---|
Int8 |
8 | -128 to 127 |
Int16 |
16 | -32_768 to 32_767 |
Int32 |
32 | -2_147_483_648 to 2_147_483_647 |
Int64 |
64 | -9_223_372_036_854_775_808 to 9_223_372_036_854_775_807 |
Int128 |
128 | -170_141_183_460_469_231_731_687_303_715_884_105_728 to 170_141_183_460_469_231_731_687_303_715_884_105_727 |
تستهلك الأنواع الأصغر ذاكرة أقل وتكون أسرع من الأنواع الأكبر، لكن مداها من القيم الممكنة أصغر.
حين تعرف أن القيم ستقع ضمن مدى معيّن، فمن الأفضل استخدام أصغر نوع ممكن لتوفير الذاكرة وتحسين الأداء.
نوع الأعداد الصحيحة الافتراضي هو Int32.
لتعريف عدد صحيح بنوع محدّد، يمكنك استخدام اسم النوع كلاحقة عبر إضافة <number>_I <bit>.
1_i8.class
# => Int8
يمكنك استخدام طريقة to_i<bit> للتحويل بين أنواع الأعداد الصحيحة المختلفة.
تحوّل طريقة to_i إلى نوع الأعداد الصحيحة الافتراضي، Int32.
1_i8.to_i16.class
# => Int16
2_i16.to_i.class
# => Int32
هذه هي أنواع الأعداد الصحيحة غير الموقّعة في Crystal:
UInt8, UInt16, UInt32, UInt64, UInt128
الفرق الوحيد بين الأعداد الصحيحة الموقّعة وغير الموقّعة هو أن غير الموقّعة لا يمكن أن تكون إلا موجبة.
لتعريف عدد صحيح غير موقّع بنوع محدّد، يمكنك استخدام اسم النوع كلاحقة عبر إضافة <number>_u<bit>.
يمكنك استخدام طريقة to_u<bit> للتحويل بين أنواع الأعداد الصحيحة غير الموقّعة المختلفة.
تحوّل طريقة to_u إلى نوع الأعداد الصحيحة غير الموقّعة الافتراضي، UInt32.
1_u8.to_u16.class
# => UInt16
هذه هي أنواع الأعداد ذات الفاصلة العائمة في Crystal:
| النوع | الحجم (بت) | المدى |
|---|---|---|
Float32 |
32 | 1.2E-38 to 3.4E+38 |
Float64 |
64 | 2.3E-308 to 1.7E+308 |
يوجد نوعان مختلفان من أنواع الأعداد ذات الفاصلة العائمة، أحدهما أدقّ من الآخر.
نوع الأعداد ذات الفاصلة العائمة الافتراضي هو Float64.
يمكنك استخدام طريقة to_f<bit> للتحويل بين أنواع الأعداد ذات الفاصلة العائمة المختلفة.
تحوّل طريقة to_f إلى نوع الأعداد ذات الفاصلة العائمة الافتراضي، Float64.
تعمل وكالة الفضاء Exercism (ESA) بكامل طاقتها على التخطيط لمهمة جديدة إلى فوبوس، أحد أقمار المريخ. هدف المهمة هو إنزال مسبار على سطح فوبوس وإرسال بيانات عن هذا السطح. وقد طلبت الوكالة مساعدتك في بناء حاسوب الملاحة الخاص بالمسبار. ذاكرة حاسوب الملاحة محدودة، لذا نحتاج إلى إبقاء استهلاك الذاكرة في أدنى حد ممكن. لذلك، علينا استخدام أنواع البيانات المناسبة.
يحتاج حاسوب الملاحة إلى معرفة المسافة بين بعض الأجسام في الفضاء لإجراء الحسابات الصحيحة، وتُقاس المسافة بالكيلومتر.
عرّف الثوابت التالية:
NEPTUNE_DISTANCE بالقيمة 4_400_000_000 والتي ينبغي تخزينها على هيئة Int64
MARS_DISTANCE بالقيمة 227_940_000 والتي ينبغي تخزينها على هيئة Int32
ATMOSPHERE_DISTANCE بالقيمة 10_000 والتي ينبغي تخزينها على هيئة Int16
يحتاج حاسوب الملاحة إلى معرفة مساحة بعض الأجسام في الفضاء لإجراء الحسابات الصحيحة. لا يمكن أن تكون المساحة سالبة. خطط المهندسون لأن يُنتج البرنامج خطأ تجاوز السعة عندما تكون المساحة سالبة. غير أن المهندسين نسوا تغيير العدد الصحيح بإشارة إلى عدد صحيح بدون إشارة.
لذلك، يريد المهندسون برنامجًا يحوّل عددًا صحيحًا بإشارة إلى عدد صحيح بدون إشارة.
نفّذ الطريقة Navigation#correct_area_analysis التي تأخذ measurement كوسيط وتُرجع المساحة كعدد صحيح بدون إشارة من 32 بت.
ستتسع المساحة المعطاة دائمًا لعدد صحيح بدون إشارة من 32 بت.
measurement = 52554
measurement.class
# => Int32
Navigation.new.correct_area_analysis(measurement)
# => 52554
Navigation.new.correct_area_analysis(measurement).class
# => UInt32
يحتاج حاسوب الملاحة إلى معرفة سرعة المسبار. وتُقاس السرعة بوحدة m/s.
لحساب السرعة، نحتاج إلى معرفة المسافة المقطوعة والزمن الذي استغرقه قطع تلك المسافة. ثم نأخذ المسافة ونقسمها على الزمن.
قد لا تكون السرعة دقيقة تمامًا، ولن تكون أبدًا عددًا كبيرًا.
لذلك، يمكننا استخدام Float32.
نفّذ الطريقة Navigation#calculate_velocity التي تأخذ distance و time كوسيطين وتُرجع السرعة على هيئة Float من 32 بت.
distance = 52554
time = 2.5
Navigation.new.calculate_velocity(distance, time)
# => 21021.6
Navigation.new.calculate_velocity(distance, time).class
# => Float32
سجّل في Exercism لتتعلّم وتتقن Crystal عبر 26 مفهومًا142 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.