الفرق بين parse and ~type

السلام عليكم,

وجدت في الشروحات مؤثرلاستنباط الاصناف وهو ~type أي انه يتم تحويل متغير الى نوع متغير اخر حسب ما فهمت من ذلك كما في المثال المذكور:

  def x: Int[64]    ;
  def y: x~type; // y here has the same type as x, which is Int[64].

  def p: ptr;
  p = x~cast[ptr];
  p = x~cast[p~type]; // Equivalent to the upper statement.

ولكن رأيت في أحد الامثلة تم استخدام parse من أجل ان يتم التحويل من نوع متغير الى اخر, كما في هذا المثال:

   count = 0;
   def total: Float[64] = 0;
   def i: Int;
  // We will skip the header and start from the second line.
   for i = 1, i < lines.getLength(), ++i {
      if lines(i).trim() == "" continue;
      ++count;
      total += parseFloat(lines(i).split(",")(1));
    }

أود ان اعرف ما الفرق بينهما من فضلكم

2 Likes

وعليكم السلام ورحمة الله.
أولا، المؤثر ~type لا علاقة له بالتحويل وإنما فقط باستنباط صنف متغير. في المثال الأول الذي يقوم بالتحويل هو مؤثر ~cast، فكما موضح في المثال الأول، عبارتا ال~cast متطابقتان وكلاهما تقومان بالتحويل من صنف عدد صحيح إلى صنف مؤشر. عملية ال~cast للدقة نسميها عملية “تمثيل” وليس “تحويل”، أي معاملة نفس البيانات كصنف من نوع آخر. كمثال، لو كانت قيمة x في المثال 5320 فإن تحويله إلى صنف مؤشر سينتج مؤشرًا يشير إلى الموقع 5320 من الذاكرة.

في المقابل فإن الدالة parseFloat تحول من سلسلة محارف إلى عدد عائم. بمعنى آخر، تقوم بقراءة سلسلة المحارف حرفًا حرفًا وتحولها إلى رقم عائم. تحويل الرقم من سلسلة محارف إلى رقم لا يمكن أن يتم باستخدام عملية التمثيل وإذا استخدمنا عملية التمثيل فسنحصل على رقم عشوائي. على سبيل المثال لو عملنا:

'1234'~cast[Int]

فالنتيجة لن تكون 1234 وإنما ستكون رقما عشوائيا هو موقع سلسلة المحارف ‘1234’ في الذاكرة.

2 Likes

نعم فهمت ال~cast وكذلك ال parseFloat واضحتان تماما, لكن ال ~type ماذا تعني باستنباط الصنف,
فكما في اول سطرين من الكود الاول هنا:

   def x: Int[64]    ;
   def y: x~type; // y here has the same type as x, which is Int[64].

قام بتعريف x من نوع integer ثم عرف y بنفس نوع x
هذا يعني انه تم قراءة النوع integer للمتغير x و جعل نوع y مثله اي integer
أليس كذلك؟ هل أسأت فهمه ؟

فهمك صحيح. عُرف y بنفس صنف x، أي بصنف Int[64]. للتوضيح، قراءة صنف x تتم أثناء ترجمة الشفرة المصدرية وليس أثناء التنفيذ.

1 Like

جميل جدا, : )
شكرا لك

3 Likes