مقالات

9.1.1: المتغيرات والعبارات


أهداف التعلم

  • تقييم التعبيرات بمتغير واحد لقيم معينة للمتغير.
  • تقييم التعبيرات بمتغيرين لقيم معينة للمتغيرات.

يتضمن الجبر حل المشكلات باستخدام المتغيرات والعبارات والمعادلات. يركز هذا الموضوع على المتغيرات والعبارات وسوف تتعرف على أنواع التعبيرات المستخدمة في الجبر.

الشيء الوحيد الذي يفصل بين الجبر والحساب هو عامل. المتغير هو حرف أو رمز يستخدم لتمثيل كمية يمكن أن تتغير. يمكن استخدام أي حرف ، لكن x و y شائعان. ربما تكون قد رأيت متغيرات مستخدمة في الصيغ ، مثل مساحة المستطيل. لإيجاد مساحة المستطيل ، عليك الضرب الطول مرات العرض، مكتوبة باستخدام المتغيرين ( l ) و ( w ).

( l cdot ث )

هنا يمثل المتغير ( l ) طول المستطيل. يمثل المتغير ( w ) عرض المستطيل.

قد تكون على دراية بصيغة مساحة المثلث. إنه ( frac {1} {2} b cdot h ).

هنا يمثل المتغير ( ب ) قاعدة المثلث ، ويمثل المتغير ( ح ) ارتفاع المثلث. ( frac {1} {2} ) في هذه الصيغة هو ملف ثابت. الثابت ، على عكس المتغير ، هو الكمية التي تفعل ذلك ليس يتغيرون. غالبًا ما يكون الثابت عبارة عن رقم.

ان التعبير عبارة رياضية تتكون من سلسلة من الرموز الرياضية. يمكن أن تكون هذه الرموز أرقامًا أو متغيرات أو عمليات ( (+ ، - ، cdot ، div) ). من أمثلة التعبيرات ( l cdot w ) و ( frac {1} {2} b cdot h ).

مثال

حدد الثابت والمتغير في التعبير ( 24-x ).

حل

24 هو الثابت.

( x ) هو المتغير.

بما أن الرقم 24 لا يمكنه تغيير قيمته ، فهو ثابت. المتغير هو ( x ) لأنه يمكن أن يكون 0 أو 2 أو العديد من الأرقام الأخرى.

في الحساب ، غالبًا ما تقوم بتقييم أو تبسيط التعبيرات التي تتضمن أرقامًا.

( start {array} {lllll}
3 cdot 25 + 4 & 25 div 5 & 142- frac {12} {4} & frac {3} {4} - frac {1} {4} & 2.45 + 13
نهاية {مجموعة} )

في الجبر ، ستقوم بتقييم العديد من التعبيرات التي تحتوي على متغيرات.

( start {array} {llll}
أ + 10 & 48 cdot c & 100-x & l cdot w & frac {1} {2} b cdot h
نهاية {مجموعة} )

ل يقيم يعني التعبير إيجاد قيمته. إذا كانت هناك متغيرات في التعبير ، فسيُطلب منك تقييم التعبير لقيمة محددة للمتغير.

الخطوة الأولى في تقييم التعبير هي استبدل القيمة المعطاة للمتغير في التعبير. ثم يمكنك الانتهاء من تقييم التعبير باستخدام الحساب.

مثال

قيم ( 24-س ) عندما ( س = 3 ).

حل

( 24-س )

( 24-3)

استبدل 3 بـ ( x ) في التعبير.
( 24-3=21)اطرح لإكمال التقييم.

21

عندما يكون لديك متغيرين ، يمكنك استبدال كل قيمة معطاة لكل متغير.

مثال

قم بتقييم ( l cdot w ) عندما ( l = 3 ) و ( w = 8 ).

حل

( l cdot ث )

( 3 cdot 8 )

البديل 3 لـ ( l ) في التعبير و 8 لـ ( w ).
( 3 cdot 8 = 24 )تتضاعف.

24

عندما تضرب متغيرًا في رقم ثابت ، فلن تحتاج إلى كتابة علامة الضرب أو استخدام الأقواس. على سبيل المثال ، ( 3a ) هو نفسه ( 3 cdot a ).

لاحظ أن العلامة ( cdot ) تُستخدم لتمثيل الضرب. هذا لأن علامة الضرب x تشبه إلى حد كبير الحرف ( x ) ، خاصةً عندما تكون مكتوبة بخط اليد. لهذا السبب ، من الأفضل استخدام الأقواس أو علامة ( cdot ) للإشارة إلى مضاعفة الأرقام.

مثال

احسب ( 4 × 4 ) عندما ( س = 10 ).

حل

( 4 × -4 )

( 4(10)-4)

استبدل 10 بـ ( x ) في التعبير.

( 40-4)

( 36)

تذكر أنه يجب عليك الضرب قبل إجراء عملية الطرح.

36

نظرًا لأنه يُسمح للمتغيرات بالتغير ، فهناك أوقات تريد فيها تقييم نفس التعبير لقيم مختلفة للمتغير.

مثال

يخطط جون لحديقة مستطيلة بعرض قدمين. لم يقرر كم من الوقت ليصنعه ، لكنه يفكر في 4 أقدام و 5 أقدام و 6 أقدام. يريد أن يضع سياجًا قصيرًا حول الحديقة. باستخدام ( x ) لتمثيل طول الحديقة المستطيلة ، سيحتاج ( x + x + 2 + 2 ) ، أو ( 2 x + 4 ) ، قدم من السياج.

كم سيحتاج من السياج لكل طول حديقة ممكن؟ قم بتقييم التعبير عند ( x = 4 ) و ( x = 5 ) و ( x = 6 ) لمعرفة ذلك.

حل

( ابدأ {مجموعة} {ج}
2 × + 4
2(4)+4 \
8+4 \
12
نهاية {مجموعة} )

بالنسبة إلى ( x = 4 ) ، استبدل 4 عن ( x ) في التعبير.

قيم بالضرب والجمع.

( ابدأ {مجموعة} {ج}
2 × + 4
2(5)+4 \
10+4 \
14
نهاية {مجموعة} )

بالنسبة إلى ( x = 5 ) ، استبدل 5 بـ ( x ).

قيم بالضرب والجمع.

( ابدأ {مجموعة} {ج}
2 × + 4
2(6)+4 \
12+4 \
16
نهاية {مجموعة} )
بالنسبة إلى ( x = 6 ) ، استبدل 6 من أجل ( x ) وقم بتقييم.

يحتاج جون إلى 12 قدمًا من السياج عند ( x = 4 ) ، و 14 قدمًا عند ( x = 5 ) ، و 16 قدمًا عند ( x = 6 ).

تقييم التعبيرات للعديد من القيم المختلفة للمتغير هو أحد قوى الجبر. تتم كتابة برامج الكمبيوتر لتقييم نفس التعبير (عادة تعبير معقد للغاية) لملايين القيم المختلفة للمتغير (المتغيرات).

ممارسه الرياضه

احسب ( 8 س -1 ) عندما ( س = 2 ).

  1. 1
  2. 7
  3. 8
  4. 15
  5. 16
إجابه
  1. 1

    غير صحيح. ربما نسيت ضرب 8 في 2. استبدال 2 بـ ( x ) يعطي ( 8 (2) -1 ). اضرب أولاً لتحصل على ( 16-1 ) ، ثم اطرح. الإجابة الصحيحة هي 15.

  2. 7

    غير صحيح. ربما تكون قد نسيت الاستبدال. استبدال 2 لـ ( x ) يعطي ( 8 (2) -1 ). اضرب أولاً لتحصل على ( 16-1 ) ، ثم اطرح. الإجابة الصحيحة هي 15.

  3. 8

    غير صحيح. ربما نسيت ترتيب العمليات: اضرب أولاً ثم اطرح. استبدال 2 لـ ( x ) يعطي ( 8 (2) -1 ). اضرب أولاً لتحصل على ( 16-1 ). ثم اطرح. الإجابة الصحيحة هي 15.

  4. 15

    صيح. استبدال 2 لـ ( x ) يعطي ( 8 (2) -1 ). اضرب أولًا لتحصل على ( 16-1 ) ، ثم اطرح لتحصل على 15.

  5. 16

    غير صحيح. ربما نسيت طرح 1 بعد الضرب. استبدال 2 لـ ( x ) يعطي ( 8 (2) -1 ). اضرب أولاً لتحصل على ( 16-1 ) ، ثم اطرح. الإجابة الصحيحة هي 15.

المتغيرات جزء مهم من الجبر. يمكن أن تمثل التعبيرات المكونة من المتغيرات والثوابت والعمليات قيمة عددية. يمكنك تقييم تعبير عندما يتم تزويدك بقيمة واحدة أو أكثر للمتغيرات: استبدل قيمة كل متغير بالمتغير ، ثم قم بإجراء أي عملية حسابية ضرورية.


الفصل 9. واجهات

يقدم إعلان الواجهة نوعًا مرجعيًا جديدًا يتكون أعضاؤه من الفئات والواجهات والثوابت والأساليب. لا يحتوي هذا النوع على متغيرات حالة ، وعادةً ما يعلن عن طريقة تجريدية واحدة أو أكثر ، وإلا يمكن للفئات غير المرتبطة تنفيذ الواجهة من خلال توفير تطبيقات لطرقها المجردة. قد لا يتم إنشاء مثيل للواجهات بشكل مباشر.

أ واجهة متداخلة هي أي واجهة يتم إعلانها داخل نص فئة أو واجهة أخرى.

أ واجهة المستوى الأعلى هي واجهة ليست واجهة متداخلة.

نحن نميز بين نوعين من الواجهات - واجهات عادية وأنواع التعليقات التوضيحية.

يناقش هذا الفصل الدلالات الشائعة لجميع الواجهات - الواجهات العادية ، المستوى الأعلى (والقسم 7.6) والمتداخلة (القسم 8.5 ، القسم 9.5) ، وأنواع التعليقات التوضيحية (القسم 9.6). تتم مناقشة التفاصيل الخاصة بأنواع معينة من الواجهات في الأقسام المخصصة لهذه التركيبات.

يمكن للبرامج استخدام الواجهات لجعلها غير ضرورية للفئات ذات الصلة لمشاركة فئة فائقة مجردة شائعة أو لإضافة طرق إلى الكائن.

قد يتم التصريح عن الواجهة على أنها ملف التمديد المباشر لواحد أو أكثر من الواجهات الأخرى ، مما يعني أنه يرث جميع أنواع الأعضاء وطرق المثيلات وثوابت الواجهات التي يقوم بتوسيعها ، باستثناء أي أعضاء قد يتجاوزه أو يخفيه.

قد يتم التصريح عن فئة ل تنفيذ مباشرة واجهة واحدة أو أكثر ، مما يعني أن أي مثيل للفئة يقوم بتنفيذ جميع الأساليب المجردة المحددة بواسطة الواجهة أو الواجهات. تطبق الفئة بالضرورة جميع الواجهات التي تقوم بها الفئات الفائقة المباشرة والواجهات الفائقة المباشرة. يسمح توريث الواجهة (المتعدد) للكائنات بدعم السلوكيات الشائعة (المتعددة) دون مشاركة فئة فائقة.

قد يكون للمتغير الذي يكون نوعه المعلن هو نوع واجهة كقيمة مرجعية لأي مثيل لفئة تنفذ الواجهة المحددة. لا يكفي أن يحدث الصنف لتنفيذ جميع الأساليب المجردة للواجهة ، يجب بالفعل الإعلان عن الفئة أو إحدى فئاتها الفائقة لتنفيذ الواجهة ، وإلا فلن يتم اعتبار الفئة لتنفيذ الواجهة.


9.1 عبارات شرطية¶

في كثير من المواقف ، تعتمد الإجراءات والنتائج على مجموعة محددة من الشروط التي يتم استيفائها. على سبيل المثال ، يتلقى الأفراد في التجارب المعشاة ذات الشواهد العلاج إذا تم تعيينهم في مجموعة العلاج. يكسب المقامر المال إذا فازت برهانها.

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

تبدأ الجملة الشرطية دائمًا برأس if ، وهو عبارة عن سطر واحد متبوعًا بجسم ذي مسافة بادئة. لا يتم تنفيذ النص إلا إذا كان التعبير يتبع مباشرة إذا (يسمى إذا كان التعبير) إلى قيمة حقيقية. إذا كان إذا كان التعبير يقيّم إلى قيمة خاطئة ، ثم يتم تخطي جسم if.

لنبدأ في تحديد دالة تُرجع علامة الرقم.

ترجع هذه الدالة الإشارة الصحيحة إذا كان الإدخال رقمًا موجبًا. ولكن إذا لم يكن الإدخال رقمًا موجبًا ، فعندئذٍ إذا كان التعبير يقيّم إلى قيمة خاطئة ، وبالتالي يتم تخطي بيان الإرجاع ولا يكون لاستدعاء الوظيفة أي قيمة.

لذلك دعونا نحسن الدالة لإرجاع السالب إذا كان الإدخال رقمًا سالبًا. يمكننا القيام بذلك عن طريق إضافة جملة elif ، حيث تكون اختصار elif if Python للعبارة "else، if".


التعبيرات العادية (Regex)

تعبير عادي، أو regex أو التعبير العادي باختصار ، قوي للغاية ومدهش في البحث عن السلاسل النصية ومعالجتها ، لا سيما في معالجة الملفات النصية. يمكن أن يحل سطر واحد من regex بسهولة محل عشرات الأسطر من رموز البرمجة.

Regex مدعوم بجميع لغات البرمجة النصية (مثل Perl و Python و PHP و JavaScript) بالإضافة إلى لغات البرمجة للأغراض العامة مثل Java وحتى معالجات النصوص مثل Word للبحث عن النصوص. قد لا يكون البدء في استخدام regex سهلاً نظرًا لتركيبه العبقري غريب الأطوار ، ولكنه بالتأكيد يستحق استثمار وقتك.

Regex بالأمثلة

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

ملخص صيغة Regex

  • الحرف: جميع الأحرف ، باستثناء تلك التي لها معنى خاص في التعبير العادي ، تتطابق مع نفسها. على سبيل المثال ، يتطابق التعبير العادي x مع السلسلة الفرعية & quotx & quot. يطابق regex 9 & quot9 & quot regex = تطابق & quot = & quot و regex @ يتطابق مع & quot @ & quot.
  • أحرف Regex الخاصة: هذه الأحرف لها معنى خاص في regex (ستتم مناقشته أدناه):. ، + ، * ،؟ ، ^ ، $ ، (،) ، [،] ، <،> ، | ، .
  • تسلسلات الهروب ( char):
    • لمطابقة حرف له معنى خاص في التعبير العادي ، تحتاج إلى استخدام بادئة تسلسل هروب بشرطة مائلة للخلف (). على سبيل المثال ، . يتطابق مع & quot. & quot regex + يتطابق & quot + & quot و regex (يتطابق & quot (& quot.
    • تحتاج أيضًا إلى استخدام regex لمطابقة & quot & quot (شرطة مائلة للخلف).
    • يتعرف Regex على تسلسلات الهروب الشائعة مثل n للسطر الجديد ، t لعلامة التبويب ، r لعودة أول حرف ، nnn لعدد ثماني مكون من 3 أرقام كحد أقصى ، xhh لرمز سداسي عشري مكون من رقمين ، uhhhh لـ Unicode من 4 أرقام ، uhhhhhhhh لـ Unicode المكون من 8 أرقام.
    • [. ]: قبول أي حرف داخل القوس المربع ، على سبيل المثال ، [aeiou] يطابق & quota & quot ، & quote & quot ، & quoti & quot ، & quoto & quot أو & quotu & quot.
    • [.-.] (Range Expression): قبول أي حرف في نطاق، على سبيل المثال ، [0-9] يتطابق مع أي رقم [A-Za-z] يطابق أي أحرف كبيرة أو أحرف صغيرة.
    • [^. ]: لا يتطابق أحد الحرف ، على سبيل المثال ، [^ 0-9] مع أي غير رقم.
    • تتطلب هذه الأحرف الأربعة فقط تسلسل هروب داخل قائمة الأقواس: ^ ، - ،] ، .
    • +: واحد أو أكثر (1+) ، على سبيل المثال ، [0-9] + يطابق رقمًا واحدًا أو أكثر مثل "123" ، "000".
    • *: صفر أو أكثر (0+) ، على سبيل المثال ، [0-9] * يطابق صفرًا أو أكثر من الأرقام. يقبل كل تلك الموجودة في [0-9] + بالإضافة إلى السلسلة الفارغة.
    • ؟ : صفر أم واحد (اختياري) ، على سبيل المثال ، [+ -]؟ تتطابق مع & quot + & quot أو & quot- & quot اختيارية أو سلسلة فارغة.
    • : m إلى n (كلاهما شامل)
    • : بالضبط م مرات
    • : م أو أكثر (م +)
    • . (نقطة): أي حرف واحد باستثناء السطر الجديد. مثل [^ n]
    • d ، D: أي رقم واحد / حرف غير رقمي. الأرقام هي [0-9]
    • w، W: أي حرف واحد / غير مكون من كلمة. بالنسبة إلى ASCII ، تكون أحرف الكلمة [a-zA-Z0-9_]
    • s ، S: أي حرف مسافة / بدون مسافة. بالنسبة لـ ASCII ، تكون أحرف المسافات البيضاء [ n r t f]
    • ^ و $: بداية السطر ونهاية السطر على التوالي. على سبيل المثال ، ^ [0-9] $ يطابق سلسلة رقمية.
    • ب: حدود الكلمة ، أي بداية الكلمة أو نهاية الكلمة. على سبيل المثال ، bcat b تطابق الكلمة & quotcat & quot في سلسلة الإدخال.
    • B: معكوس b ، أي عدم بداية الكلمة أو نهاية الكلمة.
    • & lt، & gt: بداية الكلمة ونهاية الكلمة على التوالي ، على غرار ب. على سبيل المثال ، & ltcat & gt يطابق الكلمة & quotcat & quot في سلسلة الإدخال.
    • A، Z: بداية الإدخال ونهاية الإدخال على التوالي.
    • استخدم الأقواس () لإنشاء مرجع خلفي.
    • استخدم $ 1 ، $ 2 ،. (Java ، Perl ، JavaScript) أو 1 ، 2 ،. (Python) لاسترجاع المراجع الخلفية بترتيب تسلسلي.

    مثال: أرقام [0-9] + أو d +

    1. A regex (تعبير عادي) يتكون من تسلسل عبارات فرعية. في هذا المثال ، [0-9] و +.
    2. ال [. ] ، معروف ك فئة الشخصية (أو قائمة الأقواس) ، قائمة بالأحرف. يتطابق مع أي حرف واحد في القائمة. في هذا المثال ، تتطابق [0-9] مع أي حرف مفرد بين 0 و 9 (أي رقم) ، حيث تشير الشرطة (-) إلى نطاق.
    3. + ، المعروف باسم مؤشر حدوث (أو عامل التكرار) ، يشير إلى تكرار واحد أو أكثر (1+) للتعبير الفرعي السابق. في هذه الحالة ، تتطابق [0-9] + مع رقم واحد أو أكثر.
    4. قد يتطابق التعبير العادي مع جزء من الإدخال (أي سلسلة فرعية) أو الإدخال بالكامل. في الواقع ، يمكن أن تتطابق مع صفر أو أكثر من السلاسل الفرعية للمدخلات (مع المعدل العام).
    5. يتطابق التعبير المعتاد هذا مع أي سلسلة فرعية رقمية (من الأرقام من 0 إلى 9) للإدخال. على سبيل المثال ،
      1. إذا كان الإدخال & quotabc123xyz & quot ، فإنه يطابق السلسلة الفرعية & quot123 & quot.
      2. إذا كان الإدخال هو & quotabcxyz & quot ، فلن يتطابق مع أي شيء.
      3. إذا كان الإدخال & quotabc00123xyz456_0 & quot ، فإنه يطابق السلاسل الفرعية & quot00123 & quot و & quot456 & quot و & quot0 & quot (ثلاث مطابقات).

      أمثلة التعليمات البرمجية (Python و Java و JavaScript و Perl و PHP)

      مثال على كود في بايثون

      يدعم Python Regex عبر الوحدة النمطية re. تستخدم Python أيضًا الشرطة المائلة للخلف () لتسلسلات الهروب (على سبيل المثال ، تحتاج إلى كتابة for ، d لـ d) ، لكنها تدعم السلسلة الأولية في شكل r '. '، والذي يتجاهل تفسير تسلسل الهروب - وهو أمر رائع لكتابة regex.

      مثال رمز في جافا

      تدعم Java Regex في الحزمة java.util.regex.

      مثال التعليمات البرمجية في Perl

      تستخدم Perl التعبيرات العادية بشكل مكثف مع العديد من التركيبات والمعاملات المضمنة. في لغة Perl (و JavaScript) ، يتم تحديد regex بزوج من الشرطات المائلة للأمام (افتراضيًا) ، في شكل /regex/. يمكنك استخدام عوامل التشغيل المضمنة:

      • م /regex/المعدل أو /regex/المعدل : مباراة ضد regex . م اختياري.
      • س/regex/إستبدال/المعدل : استبدل سلسلة فرعية متطابقة بالبديل.

      في لغة Perl ، يمكنك استخدام سلسلة نصية ذات علامة اقتباس مفردة غير مقحمة '. 'لكتابة regex لتعطيل تفسير الخط المائل العكسي () بواسطة Perl.

      مثال التعليمات البرمجية في JavaScript

      في JavaScript (و Perl) ، يتم تحديد regex بزوج من الشرطات المائلة للأمام ، في شكل /. /. هناك مجموعتان من الأساليب ، الإصدار عبر كائن RegEx أو كائن String.

      مثال رمز في PHP

      مثال: سلاسل رقمية كاملة ^ [0-9] + $ أو ^ d + $

      1. تُعرف البادئة ^ و $ اللاحقة باسم وضع المراسي، والتي تتطابق مع مواضع البداية والنهاية للخط ، على التوالي. نتيجة لذلك ، يجب مطابقة سلسلة الإدخال بالكامل ، بدلاً من جزء من سلسلة الإدخال (سلسلة فرعية).
      2. يتطابق التعبير المعتاد هذا مع أي سلاسل رقمية غير فارغة (تتكون من أرقام من 0 إلى 9) ، على سبيل المثال ، & quot 0 & quot و & quot 12345 & quot. لا يتطابق مع & quot & quot (سلسلة فارغة) ، & quot abc & quot ، & quot a123 & quot ، & quot abc123xyz & quot ، وما إلى ذلك ، إلا أنه يتطابق أيضًا مع & quot 000 & quot و & quot 0123 & quot و & quot 0001 & quot مع الأصفار البادئة.

      مثال: عدد صحيح موجب [1-9] [0-9] * | 0 أو [1-9] d * | 0

      1. [1-9] يتطابق مع أي حرف بين 1 إلى 9 [0-9] * يطابق صفرًا أو أكثر من الأرقام. * هو ملف مؤشر حدوث تمثل صفرًا أو أكثر من التكرارات. معًا ، [1-9] [0-9] * تطابق أي أرقام بدون صفر بادئ.
      2. | يمثل عامل التشغيل OR الذي يتم استخدامه لتضمين الرقم 0.
      3. يتطابق هذا التعبير مع & quot 0 & quot و & quot 123 & quot ولكنه لا يطابق & quot 000 & quot و & quot 0123 & quot (لكن انظر أدناه).
      4. يمكنك استبدال [0-9] بالحرف الأولي d ، لكن ليس [1-9].
      5. لم نستخدم وضع المراسي ^ و $ في هذا التعبير العادي. وبالتالي ، يمكن أن تتطابق مع أي أجزاء من سلسلة الإدخال. على سبيل المثال ،
        1. إذا كانت سلسلة الإدخال هي & quot abc123xyz & quot ، فإنها تطابق السلسلة الفرعية & quot123 & quot.
        2. إذا كانت سلسلة الإدخال هي & quotabcxyz & quot ، فلن تتطابق مع أي شيء.
        3. إذا كانت سلسلة الإدخال هي & quotabc123xyz456_0 & quot ، فإنها تطابق السلاسل الفرعية & quot123 & quot و & quot456 & quot و & quot0 & quot (ثلاث مطابقات).
        4. إذا كانت سلسلة الإدخال & quot0012300 & quot ، فإنها تطابق السلاسل الفرعية: & quot0 & quot، & quot0 & quot و & quot12300 & quot (ثلاث مطابقات).

        مثال: عدد صحيح كامل ^ [+ -]؟ [1-9] [0-9] * | 0 $ أو ^ [+ -]؟ [1-9] d * | 0 $

        1. يتطابق التعبير العادي هذا مع عدد صحيح حرفي (للسلسلة بأكملها ذات الامتداد وضع المراسي) موجب وسالب وصفر.
        2. [+ -] يتطابق مع علامة + أو -. ؟ هو مؤشر حدوث تشير إلى حدوث 0 أو 1 ، أي اختياري.ومن ثم [+ -]؟ يتطابق مع علامة اختيارية + أو -.
        3. لقد قمنا بتغطية ثلاثة مؤشرات حدوث: + لواحد أو أكثر ، * لصفر أو أكثر ، و؟ لصفر أو واحد.

        مثال: المعرفات (أو الأسماء) [a-zA-Z _] [0-9a-zA-Z _] * أو [a-zA-Z _] w *

        1. ابدأ بحرف واحد أو شرطة سفلية ، متبوعًا بصفر أو أكثر من الأرقام والحروف والشرطة السفلية.
        2. يمكنك استخدام حرف أول w لحرف كلمة [a-zA-Z0-9_]. أذكر ذلك حرف أول يمكن استخدام d لرقم [0-9].

        مثال: أسماء ملفات الصور ^ w + . (gif | png | jpg | jpeg) $

        1. ال وضع المراسي يتطابق ^ و $ مع بداية سلسلة الإدخال ونهايتها ، على التوالي. بمعنى ، يجب أن يتطابق هذا التعبير المعتاد مع سلسلة الإدخال بأكملها ، بدلاً من جزء من سلسلة الإدخال (سلسلة فرعية).
        2. w + يتطابق مع حرف أو أكثر من أحرف الكلمات (مثل [a-zA-Z0-9 _] +).
        3. . يطابق حرف النقطة (.). نحن بحاجة إلى استخدام . لتمثيل . مثل . له معنى خاص في التعبير العادي. يُعرف باسم رمز الهروب ، والذي يستعيد المعنى الحرفي الأصلي للحرف التالي. بالمثل ، * ، + ،؟ (مؤشرات التكرار) ، ^ ، $ (ارتساء الموضع) لها معنى خاص في التعبير العادي. أنت بحاجة إلى استخدام رمز الهروب لمطابقة هذه الأحرف.
        4. (gif | png | jpg | jpeg) يطابق إما & quot gif & quot، & quot png & quot، & quot jpg & quot أو & quot jpeg & quot. يعد | تشير إلى & quotOR & quot عامل التشغيل. تستخدم الأقواس لتجميع التحديدات.
        5. ال المعدل i بعد التعبير العادي يحدد المطابقة غير الحساسة لحالة الأحرف (تنطبق على بعض اللغات مثل Perl و JavaScript فقط). أي أنه يقبل & quot test.GIF & quot و & quot TesT.Gif & quot.

        مثال: عناوين البريد الإلكتروني ^ w + ([.-]؟ w +) * @ w + ([.-]؟ w +) * (. w ) + $

        1. ال وضع المراسي يتطابق ^ و $ مع بداية سلسلة الإدخال ونهايتها ، على التوالي. بمعنى ، يجب أن يتطابق هذا التعبير المعتاد مع سلسلة الإدخال بأكملها ، بدلاً من جزء من سلسلة الإدخال (سلسلة فرعية).
        2. w + يتطابق مع حرف واحد أو أكثر من أحرف الكلمات (مثل [a-zA-Z0-9 _] +).
        3. [.-]؟ يتطابق مع حرف اختياري. أو - . على الرغم من أن النقطة (.) لها معنى خاص في التعبير العادي ، في فئة الأحرف (الأقواس المربعة) ، فإن أي أحرف باستثناء ^ ، - ،] أو هي حرفي ، ولا تتطلب تسلسل هروب.
        4. ([.-]؟ w +) * تطابق 0 أو أكثر من تكرارات [.-]؟ w +.
        5. يُستخدم التعبير الفرعي w + ([.-]؟ w +) * لمطابقة اسم المستخدم في البريد الإلكتروني ، قبل العلامة @. يبدأ بحرف كلمة واحدة على الأقل [a-zA-Z0-9_] ، متبوعًا بمزيد من أحرف الكلمات أو. أو - . ومع ذلك ، أ. أو - يجب أن يتبع بحرف كلمة [a-zA-Z0-9_]. وهذا يعني أن سلسلة الإدخال لا يمكن أن تبدأ بـ. أو - ولا يمكن أن تحتوي على & quot .. & quot، & quot - & quot، & quot .- & quot أو & quot -. & مثل. مثال على السلسلة الصالحة هي & quot a.1-2-3 & quot.
        6. @ يطابق نفسه. في التعبير العادي ، تتطابق جميع الأحرف بخلاف تلك التي لها معاني خاصة مع نفسها ، على سبيل المثال ، تطابق a مع a ، و b تطابق b ، وما إلى ذلك.
        7. مرة أخرى ، يتم استخدام التعبير الفرعي w + ([.-]؟ w +) * لمطابقة اسم مجال البريد الإلكتروني ، بنفس نمط اسم المستخدم الموضح أعلاه.
        8. يتطابق التعبير الفرعي . w <2،3> مع أ. متبوعًا بحرفين أو ثلاث كلمات ، على سبيل المثال ، & quot. .com & quot ، & quot .edu & quot ، & quot .us & quot ، & quot .uk & quot ، & quot .co & quot.
        9. يحدد (. w <2،3>) + إمكانية ظهور التعبير الفرعي أعلاه مرة واحدة أو أكثر ، على سبيل المثال ، & quot. com & quot ، & quot .co.uk & quot ، & quot .edu.sg & quot ، إلخ.

        تمرين: فسر هذا التعبير المعتاد ، والذي يقدم تمثيلاً آخر لعنوان البريد الإلكتروني: ^ [ w - . +] + @ [a-zA-Z0-9 . -] + . [a-zA-z0 -9] <2،4> دولار.

        مثال: تبديل الكلمات باستخدام المراجع الخلفية بين قوسين ^ ( S +) s + ( S +) $ و $ 2 $ 1

        1. يتطابق الرمزان ^ و $ مع بداية سلسلة الإدخال ونهايتها ، على التوالي.
        2. يتطابق s (الأحرف الصغيرة) مع مسافة بيضاء (فارغ ، علامة جدولة t ، وسطر جديد r أو n). من ناحية أخرى ، يتطابق S + (الأحرف الكبيرة S) مع أي شيء لا يطابقه s ، على سبيل المثال ، بدون مسافة بيضاء. في التعبير العادي ، يشير الحرف الأولي الكبير إلى معكوس للنظير الصغير ، على سبيل المثال ، w لحرف الكلمة و W للحرف غير المكون من كلمة d للأرقام و D أو غير الرقمية.
        3. يتطابق التعبير المعتاد أعلاه مع كلمتين (بدون مسافات بيضاء) مفصولة بمسافة واحدة أو أكثر.
        4. الأقواس () لها معنيان في التعبير العادي:
          1. لتجميع التعبيرات الفرعية ، على سبيل المثال ، (abc) *
          2. لتوفير ما يسمى ب المرجع الخلفي لالتقاط واستخراج المباريات.
          مثال على كود في بايثون

          تحتفظ Python بالمراجع الخلفية الموجودة بين قوسين في 1 ، 2 ،. أيضا ، 0 يحافظ على المباراة بأكملها.

          مثال رمز في جافا

          تحتفظ Java بالمراجع الخلفية بين قوسين في $ 1 ، $ 2 ،.

          مثال: عناوين HTTP ^ http: / / S + ( / S +) * ( /)؟ $

          1. ابدأ بـ http: //. ضع في اعتبارك أنك قد تحتاج إلى كتابة / as / باستخدام رمز هروب في بعض اللغات (JavaScript ، Perl).
          2. متبوعًا بـ S + ، مسافة غير بيضاء أو أكثر ، لاسم المجال.
          3. متبوعًا بـ ( / S +) * ، صفر أو أكثر & quot /. & quot ، للأدلة الفرعية.
          4. تليها (/)؟ ، اختياري (0 أو 1) لاحق / ، لطلب الدليل.

          مثال: أنماط Regex في AngularJS

          تستخدم AngularJS أنماط regex المعقدة نوعًا ما التالية في بناء جملة JavaScript:

          مثال: نموذج Regex في Perl

          صيغة التعبير العادي (Regex)

          التعبير العادي (أو Regex) هو ملف نمط (أو منقي) يصف مجموعة من السلاسل التي تطابق النمط. وبعبارة أخرى ، فإن regex يقبل مجموعة معينة من الأوتار و يرفض البقية.

          يتكون التعبير العادي من سلسلة من الأحرف والحروف الأولية (مثل. ، d ، D ، s ، S ، w ، W) والعوامل (مثل + ، * ،؟ ، | ، ^). يتم إنشاؤها من خلال الجمع بين العديد من التعبيرات الفرعية الأصغر.

          مطابقة حرف واحد

          اللبنات الأساسية للتعبير العادي هي الأنماط التي تتطابق مع ملف أعزب حرف. تتطابق معظم الأحرف ، بما في ذلك جميع الأحرف (a-z و A-Z) والأرقام (0-9) ، مع نفسها. على سبيل المثال ، يتطابق التعبير العادي x مع السلسلة الفرعية & quotx & quot z تطابق & quotz & quot و 9 مطابقات & quot9 & quot.

          الأحرف غير الأبجدية الرقمية التي ليس لها معنى خاص في التعبير العادي تطابق نفسها أيضًا. على سبيل المثال ، = تطابق & quot = & quot @ تطابق & quot @ & quot.

          أحرف Regex الخاصة وتسلسلات الهروب

          أحرف Regex الخاصة

          هذه الأحرف لها معنى خاص في regex (سأناقش بالتفصيل في الأقسام اللاحقة):

          • الحرف الأولي: نقطة (.)
          • قائمة الأقواس: []
          • ارتساءات الموقع: ^ ، $
          • مؤشرات التكرار: + ، * ،؟ و
          • الأقواس: ()
          • أو: |
          • الهروب والحرف الأولي: شرطة مائلة للخلف ()
          تسلسلات الهروب

          الأحرف المذكورة أعلاه لها معاني خاصة في التعبير العادي. لمطابقة هذه الأحرف ، نحتاج إلى إرفاقها بشرطة مائلة للخلف () ، والمعروفة باسم تسلسل الهروب. على سبيل المثال ، + تطابق & quot + & quot [يتطابق مع & quot [& quot و . مباريات & quot. & quot.

          يتعرف Regex أيضًا على تسلسلات الهروب الشائعة مثل n للسطر الجديد ، t لعلامة التبويب ، r لـ carriage-return ، nnn لعدد يصل إلى 3 أرقام ثماني ، xhh لرمز سداسي عشري مكون من رقمين ، uhhhh لـ Unicode مكون من 4 أرقام ، uhhhhhhhh لـ Unicode المكون من 8 أرقام.

          مثال على كود في بايثون
          مثال التعليمات البرمجية في JavaScript
          مثال رمز في جافا

          مطابقة تسلسل من الأحرف (سلسلة أو نص)

          التعبيرات الفرعية

          يتم إنشاء regex من خلال الجمع بين العديد من الأصغر عبارات فرعية أو ذرات. على سبيل المثال ، يتطابق التعبير العادي Friday Friday مع السلسلة & quot Friday & quot. المطابقة ، بشكل افتراضي ، حساسة لحالة الأحرف ، ولكن يمكن ضبطها على حالة غير حساسة لحالة الأحرف عبر المُعدِّل.

          مشغل (|)

          يمكنك تقديم البدائل باستخدام عامل التشغيل & quotOR & quot ، المشار إليه بشريط عمودي '|' . على سبيل المثال ، يقبل التعبير العادي أربعة | لـ | floor | 4 السلاسل & quot؛ four & quot، & quot for & quot، & quot floor & quot أو & quot 4 & quot.

          قائمة الأقواس (فئة الأحرف) [. ] ، [^. ] ، [.-.]

          أ تعبير قوس هو قائمة الشخصيات محاطًا بـ [] ، يسمى أيضًا فئة الشخصية. يطابق أي حرف واحد في القائمة. ومع ذلك ، إذا كان الحرف الأول من القائمة هو علامة الإقحام (^) ، فإنه يطابق أي حرف واحد ليس في القائمة. على سبيل المثال ، يتطابق التعبير العادي [02468] مع رقم واحد 0 أو 2 أو 4 أو 6 أو 8 يتطابق التعبير العادي [^ 02468] مع أي حرف واحد بخلاف 0 أو 2 أو 4 أو 6 أو 8.

          بدلاً من سرد جميع الشخصيات ، يمكنك استخدام تعبير النطاق داخل القوس. يتكون تعبير النطاق من حرفين مفصولين بواصلة (-). يتطابق مع أي حرف مفرد يفرز بين الحرفين ، شاملاً. على سبيل المثال ، [a-d] هي نفسها [abcd]. يمكنك تضمين علامة الإقحام (^) أمام النطاق لـ عكس المطابقة. على سبيل المثال ، [^ a-d] تعادل [^ abcd].

          تفقد معظم أحرف regex الخاصة معناها داخل قائمة الأقواس ، ويمكن استخدامها كما هي باستثناء ^ أو - أو] أو .

          • لتضمين] ، ضعه أولاً في القائمة ، أو استخدم escape ].
          • لتضمين ^ ، ضعه في أي مكان ولكن أولاً ، أو استخدم escape ^.
          • لتضمين - ضعها أخيرًا ، أو استخدم escape -.
          • لتضمين a ، استخدم escape .
          • لا حاجة للهروب لشخصيات أخرى مثل. ، + ، * ،؟ و (،) ، <،> ، وما إلى ذلك داخل قائمة الأقواس
          • يمكنك أيضًا تضمين أحرف أولية (سيتم شرحها في القسم التالي) ، مثل w ، W ، d ، D ، s ، S داخل قائمة الأقواس.
          اسم فئات الأحرف في قائمة الأقواس (لبيرل فقط؟)

          يتم تحديد فئات الأحرف المسماة (POSIX) مسبقًا ضمن تعبيرات الأقواس. هم انهم:

          • [: alnum:] ، [: alpha:] ، [: digit:]: أحرف + أرقام ، أحرف ، أرقام.
          • [: xdigit:]: أرقام سداسية عشرية.
          • [: Lower:]، [: upper:]: أحرف صغيرة / أحرف كبيرة.
          • [: cntrl:]: التحكم في الأحرف
          • [: الرسم البياني:]: أحرف قابلة للطباعة ، باستثناء المسافة.
          • [: طباعة:]: أحرف قابلة للطباعة ، مع تضمين مسافة.
          • [: punct:]: أحرف قابلة للطباعة ، باستثناء الأحرف والأرقام.
          • [: مسافة:]: مسافة بيضاء

          على سبيل المثال ، [[: alnum:]] تعني [0-9A-Za-z]. (لاحظ أن الأقواس المربعة في أسماء الفئات هذه هي جزء من الأسماء الرمزية ، ويجب تضمينها بالإضافة إلى الأقواس المربعة التي تحدد قائمة الأقواس.)

          الحروف الأولية. ، w ، W ، d ، D ، s ، S

          أ حرف أول هو رمز له معنى خاص داخل regex.

          • تطابق النقطة الأولية (.) أي حرف مفرد باستثناء السطر الجديد n (مثل [^ n]). على سبيل المثال، . يتطابق مع أي 3 أحرف (بما في ذلك الحروف الأبجدية والأرقام والمسافات البيضاء ، باستثناء السطر الجديد) .. يطابق & quot هناك & quot ، & quot هذه & quot ، & quot the & quot ، وما إلى ذلك.
          • w (حرف كلمة) يتطابق مع أي حرف مفرد أو رقم أو شرطة سفلية (مثل [a-zA-Z0-9_]). تطابق الأحرف الكبيرة W (بدون حرف-كلمة) أي حرف مفرد لا يتطابق مع w (مثل [^ a-zA-Z0-9_]).
          • في التعبير العادي ، يكون الحرف الأولي الكبير دائمًا هو معكوس من نظيره الصغير.
          • d (رقم) يتطابق مع أي رقم فردي (مثل [0-9]). تطابق الأحرف الكبيرة D (غير رقم) أي حرف مفرد ليس رقمًا (مثل [^ 0-9]).
          • s (مسافة) تطابق أي مسافة بيضاء مفردة (مثل [ t n r f] ، فارغ ، علامة تبويب ، سطر جديد ، إرجاع حرف ، تغذية نموذج). تطابق الأحرف الكبيرة S (بدون مسافة) أي حرف مفرد لا يتطابق مع s (مثل [^ t n r f]).

          الشرطة المائلة للخلف () وتسلسل Regex Escape

          يستخدم Regex الشرطة المائلة للخلف () لغرضين:

          1. ل الحروف الأولية مثل d (رقم) ، D (بدون رقم) ، s (مسافة) ، S (بدون مسافة) ، w (كلمة) ، W (بدون كلمة).
          2. للهروب من أحرف regex الخاصة ، على سبيل المثال ، . ل . ، + لـ + ، * لـ * ، ؟ ل ؟ . تحتاج أيضًا إلى كتابة for in regex لتجنب الغموض.
          3. يتعرف Regex أيضًا على n للسطر الجديد ، t لعلامة التبويب ، إلخ.

          لاحظ أنه في العديد من لغات البرمجة (C ، Java ، Python) ، تُستخدم الشرطة المائلة العكسية () أيضًا لتسلسلات الهروب في السلسلة ، على سبيل المثال ، & quot n & quot للخط الجديد ، & quot t & quot للعلامة التبويب ، وتحتاج أيضًا إلى كتابة & quot & مثل . وبالتالي ، لكتابة نمط regex (الذي يتطابق مع واحد ) بهذه اللغات ، عليك كتابة & quot & quot (مستويان من escape.). وبالمثل ، تحتاج إلى كتابة & quot d & quot لحرف التعبير العادي d. هذا أمر مرهق وعرضة للخطأ.

          مؤشرات التكرار (عوامل التكرار): + ، * ،؟ و , , يمكن أن يتبع التعبير الفرعي regex بامتداد مؤشر حدوث (الملقب ب عامل التكرار): ؟ : العنصر السابق اختياري ويتم مطابقته مرة واحدة على الأكثر (على سبيل المثال ، لا يحدث مرة أو مرة واحدة أو اختياري). *: العنصر السابق سيُطابق صفرًا أو أكثر من المرات ، أي 0+ +: ستتم مطابقة العنصر السابق مرة واحدة أو أكثر ، أي 1+ : العنصر السابق يطابق بالضبط m مرات. : العنصر السابق يطابق m أو أكثر من المرات ، أي m + : العنصر السابق تمت مطابقته على الأقل m مرة ، ولكن ليس أكثر من n مرة. على سبيل المثال: يقبل التعبير العادي xy & quot xyy & quot، & quot xyyy & quot و & quot xyyyy & quot. الصفات التعريفية

          يمكنك تطبيق المُعدِّلات على regex لتكييف سلوكه ، مثل عالمي ، وغير حساس لحالة الأحرف ، ومتعدد الأسطر ، وما إلى ذلك. تختلف طرق تطبيق المُعدِّلات بين اللغات.

          في Perl ، يمكنك إرفاق ملفات الصفات التعريفية بعد regex ، في شكل /. /الصفات التعريفية . للحصول على أمثلة:

          في Java ، يمكنك تطبيق المُعدِّلات عند تجميع نموذج regex. على سبيل المثال،

          أوضاع المعدلات شائعة الاستخدام هي:

          • الوضع غير الحساس لحالة الأحرف (أو i): مطابقة غير حساسة لحالة الأحرف للأحرف.
          • Global (أو g): تطابق الكل بدلاً من أول مباراة.
          • الوضع متعدد الأسطر (أو m): يؤثر على ^ و $ و A و Z. في الوضع متعدد الأسطر ، يتطابق ^ مع بداية السطر أو بداية الإدخال $ مع نهاية السطر أو نهاية الإدخال ، A يتطابق مع start-of-input Z يطابق نهاية الإدخال.
          • وضع (أو أوضاع) سطر واحد: ستطابق النقطة (.) جميع الأحرف ، بما في ذلك السطر الجديد.
          • وضع التعليق (أو x): السماح بالتعليق المضمن وتجاهله بدءًا من # حتى نهاية السطر (EOL).
          • أكثر.

          الجشع والكسل والتراجع لمشغلي التكرار

          طمع عوامل التكرار * ، + ،؟ و : عوامل التكرار هي المشغلين الجشعين، وافهم بشكل افتراضي أكبر عدد ممكن من الأحرف للمباراة. على سبيل المثال ، حاول التعبير المعتاد xy <2،4> المطابقة لـ & quot xyyyy & quot ، ثم & quot xyyy & quot ، ثم & quot xyy & quot.

          محددات الكم الكسولة *؟ ، +؟ ؟؟ و ? , ؟ ،: يمكنك وضع اضافي؟ بعد عمليات التكرار للحد من جشعه (أي توقف عند أقصر مباراة). على سبيل المثال،

          التراجع: إذا وصل regex إلى حالة لا يمكن فيها إكمال المطابقة ، فإنه يتراجع عن طريق إلغاء إلغاء حرف واحد من المطابقة الجشعة. على سبيل المثال ، إذا تمت مطابقة regex z * zzz مع السلسلة & quot zzzz & quot ، فإن z * أولًا يطابق & quot zzzz & quot يمكن أن تجد بقية الأنماط تطابقًا.

          محددات الكميات الملكية * +، ++،؟ +، + , +: يمكنك إضافة علامة + إضافية إلى عوامل التكرار لتعطيل التراجع ، حتى لو كان ذلك يؤدي إلى فشل المباراة. على سبيل المثال ، لن يتطابق z ++ z مع & quotzzzz & quot. قد لا تكون هذه الميزة مدعومة في بعض اللغات.

          نقاط ارتساء المركز ^ ، $ ، b ، B ، & lt ، & gt ، A ، Z

          المراسي الموضعية لا تطابق الطابع الفعلي ، ولكن تطابق وضع في سلسلة ، مثل بداية السطر ونهاية السطر وبداية الكلمة ونهاية الكلمة.

          • ^ و $: يتطابق ^ مع بداية السطر. يتطابق $ مع نهاية السطر باستثناء السطر الجديد ، أو نهاية الإدخال (للإدخال لا ينتهي بسطر جديد). هذه هي مثبتات الموضع الأكثر استخدامًا. على سبيل المثال ،
          • b و B: يتطابق b مع حدود الكلمة (على سبيل المثال ، بداية الكلمة أو نهاية الكلمة) و B يطابق معكوس b ، أو لا حدود للكلمة. على سبيل المثال ،
          • & lt و & gt: يتطابق & lt و & gt مع بداية الكلمة ونهاية الكلمة ، على التوالي (مقارنة بـ b ، والذي يمكن أن يتطابق مع بداية الكلمة ونهايتها).
          • A و Z: يتطابق A مع بداية الإدخال. Z يطابق نهاية الإدخال.
            إنها تختلف عن ^ و $ عندما يتعلق الأمر بمطابقة المدخلات مع أسطر متعددة. يتطابق ^ في بداية السلسلة وبعد كل فاصل سطر ، بينما يتطابق A فقط في بداية السلسلة. يتطابق $ في نهاية السلسلة وقبل كل فاصل سطر ، بينما يتطابق Z فقط في نهاية السلسلة. على سبيل المثال ،

          التقاط التطابقات عن طريق المراجع الخلفية المقوسة والمتغيرات المتطابقة 1 دولار ، 2 دولار ،.

          تخدم الأقواس () غرضين في regex:

          1. أولاً ، يمكن استخدام الأقواس () لتجميع التعبيرات الفرعية لتجاوز الأولوية أو تطبيق عامل التكرار. على سبيل المثال ، يختلف (abc) + (يقبل abc ، abcabc ، abcabcabc ،.) عن abc + (يقبل abc ، abcc ، abccc ،.).
          2. ثانيًا ، يتم استخدام الأقواس لتوفير ما يسمى المراجع الخلفية (أو مجموعات الاستيلاء). يحتوي المرجع الخلفي على سلسلة فرعية متطابقة. على سبيل المثال ، يُنشئ regex ( S +) مرجعًا خلفيًا واحدًا ( S +) ، والذي يحتوي على الكلمة الأولى (بدون مسافات متتالية) من سلسلة الإدخال ، ينشئ regex ( S +) s + ( S +) اثنين للخلف- المراجع: ( S +) وأخرى ( S +) ، تحتوي على أول كلمتين ، مفصولة بمسافة واحدة أو أكثر s +.

          يتم تخزين المراجع الخلفية (أو مجموعات الالتقاط) في متغيرات خاصة $ 1 ، $ 2 ، ... (أو 1 ، 2 ،. في بايثون) ، حيث يحتوي $ 1 على السلسلة الفرعية المطابقة للزوج الأول من الأقواس ، وهكذا. على سبيل المثال ، ينشئ ( S +) s + ( S +) مرجعين خلفيين يتطابقان مع أول كلمتين. يتم تخزين الكلمات المتطابقة في $ 1 و $ 2 (أو 1 و 2) ، على التوالي.

          المراجع الخلفية مهمة لمعالجة السلسلة. يمكن استخدام المراجع الخلفية في سلسلة الاستبدال وكذلك النمط. على سبيل المثال ،

          (متقدم) Lookahead / Lookbehind ، التجميعات والمشروط

          قد لا تكون هذه الميزة مدعومة في بعض اللغات.

          Lookahead إيجابي (؟ =نمط)

          يُعرف (؟ = النمط) باسم نظرة إيجابية. ينفذ المباراة ، لكنه لا يلتقط المباراة ، ويعيد النتيجة فقط: تطابق أو عدم تطابق. ويسمى أيضا تأكيد لأنه لا يستهلك أي أحرف في المطابقة. على سبيل المثال ، يتم استخدام regex المعقد التالي لمطابقة عناوين البريد الإلكتروني بواسطة AngularJS:

          تعيّن أول أنماط نظر موجبة ^ (؟ =. <1،254> $) الحد الأقصى للطول إلى 254 حرفًا. يعيّن الشكل الإيجابي الثاني ^ (؟ =. <1،64> @) 64 حرفًا كحد أقصى قبل علامة "@" لاسم المستخدم.

          البحث السلبي (؟!نمط)

          معكوس (؟ = النمط). تطابق إذا كان النمط مفقودًا. على سبيل المثال ، a (؟ = b) تطابق "a" في "abc" (لا تستهلك "b") ولكن لا تطابق "acc". في حين أن a (؟! b) يطابق 'a' في 'acc' ، لكن ليس abc.

          بحث خلفي إيجابي (؟ & lt =نمط)
          بحث خلفي سلبي (؟ & lt!نمط)
          مجموعة غير ملتقطة (؟:نمط)

          تذكر أنه يمكنك استخدام المراجع الخلفية المقوسة لالتقاط التطابقات. لتعطيل الالتقاط ، استخدم؟: داخل الأقواس في شكل (؟: نمط). بمعنى آخر ،؟: يعطل إنشاء مجموعة الالتقاط ، حتى لا يتم إنشاء مجموعة التقاط غير ضرورية.

          مجموعة الالتقاط المسماة (؟ & ltاسم& GTنمط)

          يمكن الرجوع إلى مجموعة الالتقاط لاحقًا بواسطة اسم .

          التجميع الذري (& GTنمط)

          تعطيل التراجع ، حتى لو كان هذا قد يؤدي إلى فشل المباراة.

          الشرط (؟(كوند)ومن بعد|آخر)

          يونيكود

          الأحرف الأولية w ، W ، (حرف كلمة وغير كلمة) ، b ، B (حدود الكلمات وغير الكلمات) تعيد تشكيل أحرف Unicode.


          12. المسندات وتعبيرات المواصفات

          يصف هذا الفصل المسندات في امتدادات JML و JML لتعبيرات Java. كما يصف أيضًا مراجع المتجر ، التي تشبه تعبيرات المواصفات ، ولكنها تستخدم لوصف المواقع بدلاً من القيم. التفاصيل موجودة في الأقسام أدناه.

          12.1 المسندات

          المسند يعطي التالي بناء جملة المسندات ، والتي هي ببساطة تعبيرات خاصة يجب أن يكون لها قيمة منطقية. راجع القسم 12.2 تعبيرات المواصفات ، للحصول على صيغة تعبيرات المواصفات.

          12.2 تعبيرات المواصفات

          ما يلي يعطي صيغة تعبيرات المواصفات في JML. راجع القسم 12.3 التعبيرات ، للحصول على صيغة التعبير.

          ضمن تعبير المواصفات ، لا يمكن للمرء استخدام أي من العوامل (مثل ++ ، - ، وعوامل التخصيص) التي قد تسبب بالضرورة آثارًا جانبية. بالإضافة إلى ذلك ، يمكن للمرء استخدام الامتدادات الخاصة بـ JML ، ولا سيما التعبيرات الأولية لـ JML.

          12.3 التعبيرات

          يوسع بناء جملة JML للتعبيرات بناء جملة Java مع العديد من العوامل والأساسيات.

          أسبقية العوامل في تعبيرات JML مماثلة لتلك الموجودة في Java. مستويات الأسبقية معطاة في الجدول التالي ، حيث الأقواس ، التعبيرات الكمية ، [] ،. ، واستدعاءات الطريقة في الأسطر الثلاثة الأولى جميعها لها الأسبقية الأعلى ، وبالنسبة للباقي ، فقط العوامل الموجودة في نفس السطر لها نفس الأسبقية.

          فيما يلي بناء جملة تعبيرات Java ، مع إضافات JML. الإضافات هي عوامل التشغيل == & # 62 ، & # 60 == ، & # 60 == & # 62 ، & # 60 =! = & # 62 ، و & # 60: ، والصيغة الموجودة ضمن الصيغة غير النهائية jml - الأساسي (انظر القسم 12.4 تعبيرات JML الأولية) وفهم المجموعة (انظر القسم 12.5 مجموعة الفهم). يمكن استخدام إضافات JML إلى بناء جملة Java فقط في التأكيدات والتعليقات التوضيحية الأخرى. علاوة على ذلك ، ضمن التأكيدات ، لا يمكن استخدام أي من المشغلين (مثل ++ ، - ، ومشغلي التخصيص) التي قد تسبب بالضرورة آثارًا جانبية.

          [[[بحاجة إلى شرح دلالات الأشياء الجديدة هنا.]]]

          12.4 تعبيرات أولية لـ JML

          فيما يلي بناء جملة Jml-Primary.

          تبدأ جميع كلمات JML الأساسية التي يمكن استخدامها في التعبيرات التي قد تبدأ بحرف أبجدي بشرطة مائلة للخلف () ، بحيث لا يمكن أن تتعارض مع أسماء متغيرات البرنامج.

          يتم وصف التعبيرات الجديدة التي يقدمها JML أدناه. تقتبس العديد من الأوصاف أدناه ، دون إسناد ، أوصاف من [Leavens-Baker-Ruby06].

          12.4.1 نتيجة

          بناء جملة نتيجة-التعبير كما يلي.

          لا يمكن استخدام النتيجة الأساسية إلا في عبارات الضمان والمدة ومساحة العمل لطريقة غير باطلة. قيمته هي القيمة التي تم إرجاعها بواسطة الطريقة. نوعه هو نوع الإرجاع للطريقة ، ومن ثم فهو خطأ في النوع لاستخدامه نتيجة في طريقة باطلة أو في مُنشئ.

          12.4.2 قديم و قبل

          التعبير القديم له الصيغة التالية. راجع القسم 12.2 تعبيرات المواصفات ، للحصول على صيغة تعبير المواصفات.

          يشير تعبير النموذج old (Expr) إلى القيمة التي يمتلكها التعبير Expr في حالة ما قبل الأسلوب.

          يستخدم JML دلالات Java المرجعية ، وبالتالي فإن قيمة ما قبل الحالة للتعبير الذي يكون نوعه هو نوع مرجعي هو ببساطة المرجع الذي لا يعد نسخة من الكائن الذي يشير إليه المرجع. على سبيل المثال ، لنفترض في الحالة المسبقة أن v هو الحقل الذي يحتوي على مرجع إلى HashMap بشكل ملموس ، افترض أن الموقع المخزن في v هو 0x952ab340. ثم يشير التعبير old (v) إلى قيمة ما قبل الحالة لـ v ، وهو نفس المرجع ، أي أنه العنوان 0x952ab340. لاحظ أن old (v) ليست مرجعًا لنسخة من HashMap مخزنة في ذلك الموقع ، ولكنها مجرد نسخة من عنوان الموقع (المرجع) ، وهي قيمة v. إذا تغيرت حقول الكائن في هذا الموقع في حالة ما بعد الحالة ، فستظهر التغييرات على هذه الحقول من خلال old (v) على سبيل المثال ، old (v) .size () سيكون هو نفسه v. بحجم() . لكتابة شرط لاحق يشير إلى حجم v في الحالة السابقة ، يجب على المرء بدلاً من ذلك كتابة old (v.size ()). في الواقع ، كقاعدة عامة ، من الأفضل دائمًا استخدام old () فقط حول التعبيرات التي يكون نوعها نوع قيمة أو نوعًا له قيم ثابتة ، مثل String.

          يمكن استخدام التعبيرات من هذا النموذج في كل من الشروط اللاحقة العادية والاستثنائية (انظر القسم 9. مواصفات الطريقة ، لمزيد من المعلومات حول بنود الضمانات والإشارات) ، في قيود السجل ، في بنود المدة ومساحة العمل ، وأيضًا في التأكيدات التي تظهر في مجموعات من الأساليب (انظر القسم 13. العبارات وبيانات التعليقات التوضيحية ، لمزيد من المعلومات حول تأكيد العبارات وافترضها ، وثوابت الحلقة ، والوظائف المتغيرة).

          ومع ذلك ، نوصي باستخدام أحد الشكلين الآخرين للتعبير القديم (انظر أدناه) داخل مجموعات الأساليب بدلاً من ذلك. والسبب في ذلك هو أن القارئ قد يتساءل عما إذا كان old (Expr) في جسم طريقة ما يعني قيمة ما قبل الحالة لـ Expr (وهو ما يفعله) أو قيمة Expr قبل بعض الجمل السابقة (وهو ليس كذلك) .

          يشير تعبير النموذج pre (Expr) أيضًا إلى القيمة التي يمتلكها التعبير Expr في حالة ما قبل الأسلوب. لا يجوز استخدام التعبيرات من هذا النموذج إلا في التأكيدات التي تظهر في مجموعات الأساليب (أي في عبارات التأكيد والتفترض ، وفي ثوابت الحلقة والوظائف المتغيرة). أي أنه لا يجوز استخدام مثل هذه التعبيرات في حالات المواصفات ، وبالتالي قد لا تظهر في الظروف اللاحقة العادية أو الاستثنائية ، أو في قيود التاريخ ، أو في بنود المدة ومساحة العمل.

          يشير تعبير النموذج old (Expr ، Label) إلى القيمة التي كان التعبير بها Expr عندما وصل عنصر التحكم آخر مرة إلى تسمية العبارة Label. أي أنه يشير إلى قيمة التعبير قبل أن يصل عنصر التحكم آخر مرة إلى العبارة التي تم إرفاق التسمية بها. يمكن استخدام تعبيرات هذا النموذج فقط عندما يتم التصريح عن التسمية في سياق محيط. وبالتالي يمكن استخدام مثل هذه التعبيرات في عبارات التأكيد والتفترض ، وفي ثوابت الحلقة والوظائف المتغيرة ، حيث تم الإعلان عن مثل هذه التسمية. يمكن استخدامها أيضًا في حالات المواصفات التي تحدث في بيان مواصفات البرنامج النموذجي (انظر القسم 15.6 بيانات المواصفات) وفي بيانات التنقية (انظر القسم 13.4.3 بيانات التنقية).

          في تعبير بالنموذج old (Expr ، Label) ، يجب أن تكون التسمية تسمية محددة في الطريقة الحالية. نوع old (Expr) أو old (Expr أو Label) أو pre (Expr) هو ببساطة نوع Expr.

          12.4.3 not_assigned

          تكون صيغة التعبير غير المعين كما يلي. انظر القسم 12.7 Store Refs ، للحصول على بنية قائمة store-ref-list.

          يمكن استخدام عامل تشغيل JML not_assigned في كل من الشروط المسبقة العادية والاستثنائية (أي في بنود الضمانات والإشارات) وفي قيود السجل. تؤكد أن المواقع في مجموعة البيانات (انظر القسم 10. مجموعات البيانات) المسماة بواسطة الوسيطة لم يتم تعيينها لها أثناء تنفيذ الطريقة التي يتم تحديدها (أو جميع الطرق التي ينطبق عليها قيد التاريخ). على سبيل المثال ، يشير not_assigned (xval، yval) إلى أنه لم يتم تعيين المواقع في مجموعات البيانات المسماة بـ xval و yval أثناء تنفيذ الطريقة.

          يشير المسند مثل not_assigned (x.f) إلى مجموعة البيانات الكاملة المسماة بـ x.f وليس فقط إلى الموقع x.f نفسه. هذا يسمح للشخص بتحديد عدم وجود حتى آثار جانبية مؤقتة في حالات مختلفة من الطريقة. انظر القسم 12.4.4 not_modified ، لمعرفة طرق تحديد أن قيمة حقل معين فقط لم تتغير ، مما يسمح بتأثيرات جانبية مؤقتة.

          يمكن تطبيق عامل التشغيل not_assigned على الحقول الملموسة والنموذجية أو الخفية. عند تطبيقه على حقل نموذج ، فإن المعنى هو أنه لم يتم تعيين جميع المواقع (الملموسة) في مجموعة بيانات حقل النموذج هذا. [[[مثال حقيقي من شأنه أن يساعد هنا.]]]

          نوع التعبير not_assigned هو منطقي.

          12.4.4 not_modified

          يكون بناء جملة تعبير غير معدل كما يلي. انظر القسم 12.7 Store Refs ، للحصول على بنية قائمة store-ref-list.

          يمكن استخدام عامل تشغيل JML not_modified في كل من الشروط المسبقة العادية والاستثنائية (على سبيل المثال ، في بنود الضمانات والإشارات) ، وفي قيود السجل. تؤكد أن قيم الحقول المسماة هي نفسها في حالة ما بعد الحالة كما في الحالة السابقة على سبيل المثال ، not_modified (xval ، yval) تقول أن الحقلين xval و yval لهما نفس القيمة في ما قبل وما بعد - الدول (بمعنى طريقة التساوي لأنواعها).

          يشير المسند مثل not_modified (x.f) إلى الموقع المسمى بـ x.f ، وليس إلى مجموعة البيانات الكاملة لـ x.f. يسمح هذا للمرء بتحديد الآثار الجانبية الخيرية ، حيث يمكن للمرء تسمية x.f (أو مجموعة البيانات التي يشارك فيها) في جملة قابلة للتخصيص ، ولكن استخدم not_modified (x.f) في الحالة اللاحقة. راجع القسم 12.4.3 not_assigned ، لمعرفة طرق تحديد عدم تعيين أي موقع في مجموعة بيانات ، مما يمنع حدوث آثار جانبية مؤقتة.

          يمكن تطبيق عامل التشغيل not_modified على كل من الحقول الخرسانية والنموذجية أو الخفية. عند تطبيقه على حقل نموذج ، فإن المعنى هو أن قيمة حقل النموذج فقط هي التي لم تتغير (بمعنى عملية تساوي نوعها) قد تكون الحقول الملموسة المشاركة في تمثيلها قد تغيرت. [[[مثال حقيقي من شأنه أن يساعد هنا.]]]

          نوع التعبير not_modified هو منطقي.

          12.4.5 تم الوصول إليه فقط

          يكون بناء جملة التعبير الذي تم الوصول إليه فقط كما يلي. انظر القسم 12.7 Store Refs ، للحصول على بنية قائمة store-ref-list.

          يمكن استخدام عامل تشغيل JML only_accessed في كل من الشروط المسبقة العادية والاستثنائية (على سبيل المثال ، في بنود الضمانات والإشارات) ، وفي قيود السجل. تُستخدم في حالة ما بعد الحالة (ربما ضمنيًا في قيد السجل) ، فهي تؤكد أن تنفيذ الطريقة يقرأ فقط من مجموعة فرعية من مجموعات البيانات المسماة بواسطة الحقول المحددة. على سبيل المثال ، only_accessed (xval، yval) تقول أنه لم تتم قراءة أي حقول خارج مجموعتي البيانات xval و yval بواسطة الطريقة. يتضمن هذا كلاً من القراءات المباشرة في جسم الطريقة ، والقراءات أثناء المكالمات التي تم إجراؤها بواسطة الطريقة (والطرق التي تسمى تلك الطرق ، وما إلى ذلك).

          يشير المسند مثل only_accessed (x.f) إلى مجموعة البيانات الكاملة المسماة بـ x.f وليس فقط إلى الموقع x.f نفسه.

          يمكن تطبيق عامل التشغيل only_accessed على كل من الحقول الخرسانية والنموذجية أو الخفية. عند تطبيقه على حقل نموذج ، فإن المعنى هو أنه يُسمح بالوصول إلى المواقع (الملموسة) في مجموعة بيانات حقل النموذج هذا أثناء تنفيذ الطريقة.

          نوع التعبير only_accessed هو منطقي.

          12.4.6 only_assigned

          يكون بناء جملة التعبير المعين فقط كما يلي. انظر القسم 12.7 Store Refs ، للحصول على بنية قائمة store-ref-list.

          يمكن استخدام عامل تشغيل JML only_assigned في كل من الشروط المسبقة العادية والاستثنائية (أي في بنود الضمانات والإشارات) وفي قيود السجل. تُستخدم في حالة ما بعد الحالة (ربما ضمنيًا في قيد السجل) ، فهي تؤكد أن تنفيذ الطريقة يتم تعيينه فقط لمجموعة فرعية من مجموعات البيانات المسماة بواسطة الحقول المحددة. على سبيل المثال ، يقول only_assigned (xval، yval) أنه لم يتم تعيين أي حقول خارج مجموعتي البيانات xval و yval بواسطة الطريقة. يتضمن هذا كلاً من التخصيصات المباشرة في جسم الطريقة ، والتخصيصات أثناء الاستدعاءات التي تم إجراؤها بواسطة الطريقة (والطرق التي تسمى تلك الطرق ، إلخ).

          يشير المسند مثل only_assigned (x.f) إلى مجموعة البيانات الكاملة المسماة بـ x.f وليس فقط إلى الموقع x.f نفسه.

          يمكن تطبيق عامل التشغيل only_assigned على الحقول الخرسانية والنموذجية أو الخفية. عند تطبيقه على حقل نموذج ، فإن المعنى هو أنه يُسمح بتعيين المواقع (الملموسة) في مجموعة بيانات حقل النموذج هذا أثناء تنفيذ الطريقة.

          نوع التعبير only_assigned هو منطقي.

          12.4.7 only_called

          يكون بناء جملة تعبير يسمى فقط على النحو التالي. انظر القسم 8.3 القيود ، للحصول على صيغة قائمة اسم الطريقة.

          يمكن استخدام عامل تشغيل JML only_called في كل من الشروط المسبقة العادية والاستثنائية (على سبيل المثال ، في بنود الضمانات والإشارات) ، وفي قيود السجل. تُستخدم في الحالة اللاحقة للطريقة (ربما ضمنيًا في قيد السجل) ، فهي تؤكد أن تنفيذ الطريقة يُستدعى فقط من مجموعة فرعية من الطرق الواردة في قائمة اسم الطريقة. على سبيل المثال ، يقول only_called (p، q) أنه تم استدعاء العمليات ، باستثناء p و q ، أثناء تنفيذ هذه الطريقة.

          نوع التعبير only_called هو منطقي.

          12.4.8 only_captured

          بناء جملة التعبير الوحيد الذي تم التقاطه هو كما يلي. انظر القسم 12.7 Store Refs ، للحصول على بنية قائمة store-ref-list.

          يمكن استخدام عامل تشغيل JML only_captured في كل من الشروط المسبقة العادية والاستثنائية (على سبيل المثال ، في بنود الضمانات والإشارات) ، وفي قيود السجل. تُستخدم في الحالة اللاحقة للطريقة (ربما ضمنيًا في قيد السجل) ، فهي تؤكد أن تنفيذ الطريقة لا يلتقط سوى المراجع من مجموعة فرعية من مجموعات البيانات المسماة بواسطة الحقول المحددة. على سبيل المثال ، only_captured (xv، yv) تقول أنه لا توجد مراجع ، خارج مجموعات البيانات الخاصة بـ xv و yv ، تم التقاطها بواسطة الطريقة.

          يتم تسجيل المرجع عند تخزينه في حقل (على عكس المتغير المحلي). عادةً ما تلتقط الطريقة معلمة رسمية (أو مرجعًا مخزنًا في حقل ثابت) عن طريق تعيينها إلى حقل في مستقبل الأسلوب (هذا الكائن) ، أو حقل في كائن ما (أو لعنصر مصفوفة) ، أو إلى حقل ثابت مجال.

          يشير المسند مثل only_captured (x.f) إلى المراجع المخزنة في مجموعة البيانات بأكملها المسماة بـ x.f في الحالة المسبقة ، وليس فقط لتلك المخزنة في الموقع x.f نفسه. ومع ذلك ، نظرًا لأن المراجع التي يتم التقاطها توجد عادةً في المعلمات الرسمية ، يمكن عادةً تجاهل تعقيدات مجموعات البيانات.

          يمكن تطبيق عامل التشغيل only_captured على كل من الحقول الخرسانية والنموذجية أو الخفية. عند تطبيقه على حقل نموذج ، فإن المعنى هو أنه يُسمح بالتقاط المواقع (الملموسة) في مجموعة بيانات حقل النموذج هذا أثناء تنفيذ الطريقة.

          نوع التعبير only_captured هو منطقي.

          12.4.9 جديد

          تكون صيغة التعبير الجديد على النحو التالي. راجع القسم 12.2 تعبيرات المواصفات ، للحصول على صيغة قائمة تعبيرات المواصفات.

          يؤكد عامل التشغيل fresh أنه تم تخصيص الكائنات حديثًا على سبيل المثال ، يؤكد fresh (x، y) أن x و y ليسا فارغين وأن الكائنات المرتبطة بهذه المعرفات لم يتم تخصيصها في الحالة السابقة. يمكن أن تحتوي الوسيطات إلى fresh أي نوع مرجع ، ويكون نوع التعبير العام منطقيًا.

          لاحظ أنه من الخطأ استخدام fresh (this) في مواصفات المُنشئ ، نظرًا لأن مشغل Java الجديد يخصص مساحة تخزين للكائن ، فإن مهمة المُنشئ هي فقط تهيئة هذا التخزين.

          12.4.10 الوصول

          صيغة تعبير الوصول كما يلي. راجع القسم 12.2 تعبيرات المواصفات ، للحصول على صيغة تعبير المواصفات.

          يسمح تعبير الوصول للفرد بالإشارة إلى مجموعة الكائنات التي يمكن الوصول إليها من كائن معين. يشير بناء الجملة الوصول (x) إلى أصغر مجموعة JMLObjectSet تحتوي على الكائن المشار إليه بواسطة x ، إن وجد ، وجميع الكائنات التي يمكن الوصول إليها من خلال جميع حقول الكائنات في هذه المجموعة. أي ، إذا كانت x خالية ، فإن هذه المجموعة فارغة وإلا فإنها تحتوي على x ، وجميع الكائنات يمكن الوصول إليها من خلال جميع حقول x ، ويمكن الوصول إلى جميع الكائنات من خلال جميع حقول هذه الكائنات ، وما إلى ذلك ، بشكل متكرر. إذا كانت x تشير إلى حقل نموذج (أو مجموعة بيانات) ، فإن "الوصول (x) يشير إلى أصغر مجموعة JMLObjectSet تحتوي على كائنات يمكن الوصول إليها من x أو يمكن الوصول إليها من الكائنات المشار إليها بواسطة الحقول في مجموعة البيانات هذه.

          12.4.11 المدة

          صيغة تعبير المدة هي كما يلي. راجع القسم 12.3 التعبيرات ، للحصول على صيغة التعبير.

          المدة ، التي تصف الحد الأقصى المحدد لعدد مرات دورة الجهاز الظاهري اللازمة لتنفيذ استدعاء الطريقة أو تعبير استدعاء المُنشئ الصريح الذي يمثل وسيطته ، على سبيل المثال ، يمثل المدة (myStack.push (o)) الحد الأقصى لعدد دورات الجهاز الظاهري المطلوبة لتنفيذ استدعاء myStack.push (o) ، وفقًا لعقد النوع الثابت لطريقة الدفع من نوع myStack ، عند تمرير الوسيطة o. لاحظ أن التعبير المستخدم كوسيطة لـ المدة يجب اعتباره مقتبسًا ، بمعنى أنه لا يتم تنفيذه وبالتالي لا يلزم أن يكون الأسلوب أو المنشئ المسمى خاليًا من الآثار الجانبية. لاحظ أن الوسيطة to duration هي تعبير بدلاً من مجرد اسم طريقة ، لأن استدعاءات الطريقة المختلفة ، أي تلك التي لها معاملات مختلفة ، يمكن أن تستغرق فترات زمنية مختلفة [Krone-Ogden-Sitaraman03].

          يجب أن يكون تعبير الوسيطة الذي تم تمريره إلى المدة استدعاء أسلوب أو تعبير استدعاء منشئ صريح نوع تعبير المدة طويل.

          بالنسبة لجهاز Java Virtual Machine ، يتم تعريف دورة الآلة الافتراضية على أنها الحد الأدنى من الحد الأقصى عبر جميع تعليمات Java Virtual Machine ، i ، من طول الوقت اللازم لتنفيذ التعليمات i.

          12.4.12 مساحة

          صيغة تعبير الفضاء هي كما يلي. راجع القسم 12.2 تعبيرات المواصفات ، للحصول على صيغة تعبير المواصفات. [[[ألا يجب أن يأخذ هذا تعبيرًا بدلاً من تعبير محدد؟ - جمهورية الكونغو الديمقراطية]]]

          space ، الذي يصف مقدار مساحة الكومة ، بالبايت ، المخصصة للكائن المشار إليه بواسطة وسيطته [Krone-Ogden-Sitaraman03] على سبيل المثال ، space (myStack) هو عدد البايتات في الكومة المستخدمة بواسطة myStack ، وليس بما في ذلك الأشياء التي يحتوي عليها. يجب أن يكون نوع تعبير المواصفات الذي يمثل الوسيطة نوعًا مرجعيًا ، والنوع الناتج لتعبير space طويل.

          12.4.13 مساحة العمل

          work_space ، الذي يصف الحد الأقصى المحدد لمساحة الكومة ، بالبايت ، المستخدم بواسطة استدعاء الأسلوب أو تعبير استدعاء المُنشئ الصريح الذي يمثل وسيطته ، على سبيل المثال ، working_space (myStack.push (o)) هو الحد الأقصى لعدد البايت المطلوب في الكومة لتنفيذ استدعاء myStack.push (o) ، وفقًا لعقد النوع الثابت لطريقة الدفع من نوع myStack ، عند تمرير الوسيطة o. لاحظ أنه يجب التفكير في التعبير المستخدم كوسيطة لـ مساحة_العمل على أنه مقتبس ، بمعنى أنه لا يتم تنفيذه وبالتالي لا يجب أن يكون الأسلوب أو المُنشئ الذي يطلق عليه اسمًا خاليًا من الآثار الجانبية. هناك حاجة إلى الوسائط التفصيلية في مواصفات الاستدعاء لأن استدعاءات الطريقة المختلفة ، أي تلك التي لها معاملات مختلفة ، يمكن أن تأخذ كميات مختلفة من المساحة [Krone-Ogden-Sitaraman03]. يجب أن يكون تعبير الوسيطة استدعاء أسلوب أو تعبير استدعاء مُنشئ صريح ، نوع النتيجة لتعبير working_space طويل.

          12.4.14 nonnullelements

          يكون بناء جملة تعبير nonnullelements كما يلي. راجع القسم 12.2 تعبيرات المواصفات ، للحصول على صيغة تعبير المواصفات.

          يمكن استخدام عامل التشغيل nonnullelements لتأكيد أن المصفوفة وعناصرها كلها غير خالية. على سبيل المثال ، nonnullelements (myArray) تعادل [Leino-Nelson-Saxe00]

          12.4.15 المسندات غير الرسمية

          الوصف غير الرسمي هو بعض النصوص المضمنة في (* و *). راجع القسم 4.6 الرموز ، للحصول على تفاصيل حول تركيبها. يتم استخدامه كإجراء شكلي للهروب.

          الوصف غير الرسمي المستخدم كمسند له نوع منطقي. ومن ثم يجب أن يصف النص في الوصف غير الرسمي شرطًا ، على سبيل المثال (* يتم عرض قيمة x *).

          إن قيمة الوصف غير الرسمي معروفة للمستخدم فقط ، وليس لأية أدوات JML ، لذلك فهي غير قابلة للتنفيذ مطلقًا. لذلك ينبغي تجنب الأوصاف غير الرسمية قدر الإمكان ، ولكن يمكن استخدامها لتجنب إضفاء الطابع الرسمي على كل شيء عندما يكون القيام بذلك مكلفًا للغاية.

          12.4.16 typeof

          بناء جملة typeof التعبير كما يلي. راجع القسم 12.2 تعبيرات المواصفات ، للحصول على صيغة تعبير المواصفات.

          يُرجع عامل التشغيل typeof النوع الديناميكي الأكثر تحديدًا لقيمة التعبير [Leino-Nelson-Saxe00]. معنى typeof (E) غير محدد إذا كانت E خالية. إذا كان E يحتوي على نوع ثابت وهو نوع مرجعي ، فإن typeof (E) يعني نفس الشيء مثل E .getClass (). على سبيل المثال ، إذا كان c متغيرًا من النوع الثابت Collection الذي يحتوي على كائن من الفئة HashSet ، فإن typeof (c) هو HashSet.class ، وهو نفس الشيء مثل type (HashSet). إذا كان E يحتوي على نوع ثابت ليس نوعًا مرجعيًا ، فإن typeof (E) يعني مثيل java.lang.Class الذي يمثل نوعه الثابت. على سبيل المثال ، typeof (صحيح) هو Boolean.TYPE ، وهو نفس type (منطقي). وبالتالي ، فإن تعبير النموذج typeof (E) له النوع TYPE ، والذي يعتبره JML هو نفسه java.lang.Class.

          12.4.17 إليمتيبي

          يكون بناء جملة تعبير elemtype كما يلي.

          يُرجع عامل التشغيل elemtype النوع الثابت الأكثر تحديدًا والذي تشاركه كافة عناصر وسيطة الصفيف الخاصة به [Leino-Nelson-Saxe00]. على سبيل المثال ، elemtype ( type (int [])) هو type (int). يجب أن تكون الوسيطة إلى elemtype تعبيرًا من النوع TYPE ، والذي يعتبره JML مطابقًا لـ java.lang.Class ، والنتيجة الخاصة به تحتوي أيضًا على النوع TYPE (راجع القسم 7.1.2.2 مواصفات النوع). إذا لم تكن الوسيطة من نوع مصفوفة ، فستكون النتيجة خالية. على سبيل المثال ، elemtype ( type (int)) و elemtype ( type (Object)) كلاهما فارغان.

          12.4.18 نوع

          بناء جملة نوع التعبير كما يلي. انظر القسم 7.1.2.2 Type-Specs ، للتعرف على بنية النوع.

          يمكن استخدام عامل التشغيل النوع لإدخال حرفية من النوع TYPE في التعبيرات. تعبير من النموذج type (T) ، حيث T هو اسم نوع ، له النوع TYPE. نظرًا لأن JML TYPE هو نفسه java.lang.Class ، فإن تعبير النموذج type (T) يعني نفس الشيء مثل T .class ، إذا كان T هو نوع مرجعي. إذا كان T نوعًا أوليًا ، فإن type (T) يكافئ قيمة حقل TYPE لنوع المرجع المقابل. وبالتالي فإن type (boolean) يساوي Boolean.TYPE.

          يستخدم استخدام النوع (PlusAccount) لإدخال نوع PlusAccount في سياق التعبير هذا.

          12.4.19 مجموعة القفل

          تكون صيغة تعبير مجموعة القفل كما يلي.

          تشير مجموعة القفل البدائية إلى مجموعة الأقفال التي يحتفظ بها مؤشر الترابط الحالي. إنه من النوع JMLObjectSet. (هذا اقتباس من ESC / Java [Leino-etal00] [Leino-Nelson-Saxe00] للتعامل مع الخيوط.)

          12.4.20 كحد أقصى

          صيغة التعبير max كما يلي. راجع القسم 12.2 تعبيرات المواصفات ، للحصول على صيغة تعبير المواصفات.

          يُرجع عامل التشغيل max "الأكبر" (كما هو محدد بواسطة & # 60) لمجموعة كائنات التأمين ، مع إعطاء مجموعة قفل كوسيطة. والنتيجة هي نوع الكائن. (هذا اقتباس من ESC / Java [Leino-etal00] [Leino-Nelson-Saxe00] للتعامل مع الخيوط.)

          إذا كنت تتطلع إلى الحصول على أقصى عدد من الأعداد الصحيحة ، فاستخدم المُحدِّد الكمي الأقصى (انظر القسم 12.4.24.2 المحددات الكمية المعممة).

          12.4.21 is_initialized

          يكون بناء جملة تعبير is-initialized كما يلي. انظر القسم 7.1.2.2 نوع المواصفات ، للحصول على صيغة نوع المرجع

          يُرجع عامل التشغيل is_initialized صحيحًا فقط عندما تكون وسيطة نوع المرجع الخاصة به عبارة عن فئة أنهت تهيئتها الثابتة. إنه من النوع المنطقي.

          12.4.22 invariant_for

          يُرجع العامل invariant_for صحيحًا فقط عندما تفي وسيطته بالثابت من نوعه الثابت على سبيل المثال ، invariant_for ((MyClass) o) يكون صحيحًا عندما يفي o بالمتغير الخاص بـ MyClass. التعبير الكامل invariant_for من النوع المنطقي.

          12.4.23 lblneg و lblpos

          بناء الجملة لنوعين من التعبيرات ذات العلامات كما يلي. راجع القسم 12.2 تعبيرات المواصفات ، للحصول على صيغة تعبير المواصفات.

          يمكن استخدام التعبيرات المقوسة التي تبدأ بـ lblneg و lblpos لإرفاق تسميات بتعبيرات [Leino-Nelson-Saxe00] قد تتم طباعة هذه التسميات في رسائل مختلفة بواسطة أدوات الدعم ، على سبيل المثال ، لتحديد تأكيد فشل. مثل هذا التعبير له تسمية وجسم على سبيل المثال ، في

          التسمية هي indexInBounds والجسم هو التعبير 0 & # 60 = index & # 38 & # 38 index & # 60 length. قيمة التعبير المسمى هي قيمة جسمه ، ومن ثم فإن نوعه هو نوع جسمه. الفكرة هي أنه إذا تم استخدام هذا التعبير في تأكيد وكانت قيمته خاطئة (على سبيل المثال ، عند إجراء فحص وقت التشغيل للتأكيدات) ، فسيتم طباعة تحذير يتضمن التسمية indexInBounds. يحتوي النموذج الذي يستخدم lblpos على بناء جملة مشابه ، ولكن يجب استخدامه للتحذيرات عندما تكون قيمة التعبير المضمن صحيحة.

          12.4.24 التعبيرات الكمية

          لاحظ أن كل تعبير كمي يتضمن مجموعة من الأقواس لا يمكن حذف هذه الأقواس. الجزء الأول من التعبير الكمي هو المحدد الكمي ، الذي يحدد العملية التي يتعين القيام بها. يبدأ كل محدد كمي بشرطة مائلة للخلف (). يتبع المحدد الكمي - var-decls الكمي ، والذي يعلن عن المتغيرات المرتبطة التي يكون نطاقها هو spec-quantified-expr. قد لا تتعارض المتغيرات المرتبطة مع المتغيرات المحلية الحالية ، ولكنها قد تخفي الحقول الثابتة والمثيلات. المسند الاختياري بين الفاصلة المنقوطة هو النطاق المسند نطاقات المحدد الكمي على جميع القيم الممكنة لمتغيراته المرتبطة التي تفي بمسند النطاق (لمناقشة نطاقات القيم لأنواع المراجع ، انظر القسم 12.4.24.6 القياس الكمي على أنواع المراجع) . إذا تم حذف المسند النطاق ، فسيتم تعيينه افتراضيًا على صحيح. يسمى التعبير النهائي للمواصفات جسم المُحدِّد الكمي.

          نناقش الأنواع المختلفة من التعبيرات الكمية أدناه.

          12.4.24.1 محددات الكم العالمية والوجودية

          إن المحددات forall و موجودة ، هي مُحددات كمية عالمية ووجودية (على التوالي). على سبيل المثال،

          يقول أن القيم [0] . أ [9] مرتبة.

          يجب أن يكون جسم المُحدد الكمي العام أو الوجودي من النوع المنطقي. نوع التعبير الكمي العام أو الوجودي ككل هو منطقي. عندما يكون مقياس النطاق غير مرضٍ ، تكون قيمة تعبير forall صحيحة وقيمة تعبير موجود خاطئة. على سبيل المثال:

          12.4.24.2 محددات الكم المعممة

          المحددات الكمية max ، min ، product ، و sum ، هي محددات كمية معممة تُرجع الحد الأقصى ، أو الحد الأدنى ، أو المنتج ، أو مجموع قيم التعبيرات المعطاة ، حيث تلبي المتغيرات النطاق المحدد. يجب أن يكون التعبير في الجسم من نوع رقمي مدمج ، مثل int أو ضعف نوع التعبير الكمي ككل نوع الجسم. على سبيل المثال ، جميع المعادلات التالية صحيحة (انظر الفصل 3 من [Cohen90]):

          لحساب قيمة المبلغ أو المنتج ، يتم استخدام حساب Java. [[[هذا يعتمد على الوضع الحسابي الساري - DRC]]] وبالتالي فإن المعنى يعتمد على نوع التعبير. على سبيل المثال ، في Java ، تستخدم أرقام الفاصلة العائمة معيار IEEE 754 ، وبالتالي عند حدوث تجاوز ، يتم إرجاع اللانهاية الموجبة أو السالبة المناسبة. ومع ذلك ، تلتف أعداد Java الصحيحة على الفائض. تأمل الأمثلة التالية.

          عندما يكون النطاق المسند غير مرضٍ ، يكون المجموع 0 والمنتج هو 1 على سبيل المثال:

          عندما يكون مقياس النطاق غير مرضٍ لـ max تكون النتيجة هي أصغر رقم مع نوع التعبير في الجسم لأرقام الفاصلة العائمة ، يتم استخدام اللانهاية السالبة. وبالمثل ، عندما يكون النطاق المسند غير مرضٍ لـ min ، تكون النتيجة أكبر رقم بنوع التعبير في الجسم. [[[Or should be undefined - DRC]]]

          12.4.24.3 محدد الكم العددي

          يُرجع المُحدد الكمي ، num_of ، عدد قيم متغيراته التي يكون النطاق والتعبير في جسمها صحيحين. يجب أن يكون للجسم نوع منطقي ، وأن يكون التعبير الكمي بأكمله من النوع طويل. يتم تحديد معنى هذا المحدد من خلال المعادلة التالية (انظر ص 57 من [Cohen90]).

          12.4.24.4 تنفيذ التعبيرات الكمية

          متى تكون المحددات الكمية العالمية أو الوجودية قابلة للتنفيذ لأغراض التحقق من تأكيد وقت التشغيل؟ إذا كان نوع المتغير الكمي منطقيًا ، فسيكون دائمًا قابلاً للتنفيذ. وبخلاف ذلك ، يكون expr المحدد في المواصفات قابلاً للتنفيذ فقط إذا كان شكل التعبير يطابق نمطًا يفهمه مدقق تأكيد وقت التشغيل. يختلف هذا حسب تطبيق الأداة ، ولكن يمكنك أن تتوقع أن يفهم مدقق تأكيد وقت التشغيل الأنماط حيث يعطي مسند النطاق نطاقًا محددًا لنوع القيمة الأولية الترتيبية (مثل int) أو حيث يتطلب النطاق المسند المتغير الكمي ليتم استخلاصه من بعض جلس. الأمثلة تشمل ما يلي. [[[اجعل هذه الأمثلة تكون أمثلة حقيقية في دليل العينات]]]

          يجب أن تحصل على تحذيرات من أداة jmlc عندما تكون التأكيدات غير قابلة للتنفيذ ، ولكن يجب عليك استخدام العلامة -w2 لرؤيتها.

          إذا كان expr المحدد كميًا ، QE ، قابلاً للتنفيذ ، فيجب أن تقوم الأداة التي تنفذها فقط بتقييم أي تعبير عن النطاق في QE مرة واحدة لكل تنفيذ QE. نظرًا لأن قيمة تعبير النطاق هذا لا يمكن تغييرها ، فإن استراتيجية التقييم هذه لن تغير قيمة التيسير الكمي ، ولكنها ستوفر الوقت فقط لتقييم تعبير النطاق مرة واحدة لكل تقييم للتسهيل الكمي.

          12.4.24.5 معدِّلات المتغيرات المنضمة

          يمكن ربط المتغيرات المنطقية

          • التعبيرات الكمية (انظر القسم 12.4.24 التعبيرات الكمية) ،
          • تعيين تعبيرات الفهم (انظر القسم 12.5 مجموعة الفهم) ،
          • لجميع بنود عقود الطريقة (انظر القسم 9.9.1.1 لجميع التصريحات المتغيرة) ، أو
          • البنود القديمة لعقود الطريقة (انظر القسم 9.9.1.2 التصريحات القديمة المتغيرة).

          لاحظ أنه في JML ، لا تعتبر non_null و nullable كلمات محجوزة ، ومن ثم يمكن استخدام هذه المعرفات كأسماء أنواع. من أجل التحديد الكمي لعناصر نوع يسمى non_null أو nullable ، من الضروري توفير معدل صريح للبطل. على سبيل المثال ، حيث يكون non_null الأول أحد معدّلات var المرتبطة والثاني هو النوع non_null.

          12.4.24.6 التحديد الكمي على أنواع المراجع

            لا تتضمن القيمة خالية ما لم يتم إعلان أن المتغير المرتبط لاغياً (انظر القسم G.2.1 غير فارغ افتراضيًا).

          12.5 مجموعة الفهم

          صيغة تعبير مجموعة الفهم هي كما يلي.

          يمكن استخدام تدوين مجموعة الفهم لتعريف المجموعات بإيجاز. معنى new-expr (انظر القسم 12.3 التعبيرات) مع لاحقة مجموعة الفهم ، مثل ST هو تكوين مجموعة فرعية ، من النوع ST ، من المجموعة s ، والتي تحتوي فقط على تلك العناصر x الموجودة في كل من s والتي تكون P (x) لها حقيقية.

          على سبيل المثال ، ما يلي هو JMLObjectSet وهو مجموعة فرعية من كائنات عدد صحيح غير فارغ تم العثور عليها في مجموعة myIntSet التي تتراوح قيمها بين 0 و 10 ، ضمناً.

          تحدد صيغة JML الفهم بحيث يكون postfix-expr الذي يلي الشريط العمودي (|) دائمًا استدعاء طريقة مع المتغير المرتبط المُعلن عنه في المُعلن الكمي كمعلمة ، قد تكون الطريقة إما طريقة has لـ org.jmlspecs.models.JMLObjectSet أو org.jmlspecs.models.JMLValueSet ، أو طريقة احتواء java.util.Collection. يستخدم هذا القيد لتجنب مفارقة راسل [Whitehead-Russell25]. قد لا يتعارض المتغير المرتبط ، الذي يكون نطاقه هو فهم المجموعة ، مع المتغيرات المحلية الحالية ، ولكنه قد يخفي الحقول الثابتة وحقول الحالة. يتم استخدام نوع المتغير المرتبط لتقييد الكائنات التي تصبح جزءًا من المجموعة الناتجة إذا كانت المجموعة التي تم استدعاؤها في postfix-expr تحتوي على كائنات غير قابلة للتخصيص إلى المتغير المرتبط ، فهي غير مضمنة في مجموعة الفهم الناتجة. وبالتالي ، ينتج عن تعبيرا الفهم التاليين (بالنظر إلى مجموعة موجودة) مجموعات متطابقة:

          في الممارسة العملية ، يبدأ المرء إما من بعض المجموعات ذات الصلة في متناول اليد أو من المجموعات الموجودة في JMLObjectSet و JMLValueSet التي تحتوي على كائنات من الأنواع البدائية. نوع مجموعة الفهم هو النوع المسمى التالي الجديد ، والذي يجب أن يكون JMLObjectSet أو JMLValueSet. يجب أن يكون نوع المتغير المرتبط متوافقًا مع نوع الفهم المحدد على وجه الخصوص ، ويجب أن يكون نوع المتغير المرتبط نوعًا فرعيًا من org.jmlspecs.models.JMLType إذا كان نوع الفهم المحدد هو JMLValueSet.

          12.6 مشغلي JML

          في هذا القسم ، نصف العوامل الجديدة المتنوعة التي يضيفها JML إلى تعبيرات Java. يمكن استخدام كل ما يلي في تعبيرات المواصفات.

          12.6.1 عامل تشغيل من النوع الفرعي

          عامل التشغيل العلائقي & # 60: يقارن نوعين من المراجع ويعيد صحيحًا عندما يكون النوع الموجود على اليسار نوعًا فرعيًا من النوع الموجود على اليمين [Leino-Nelson-Saxe00]. على الرغم من أن الترميز قد يوحي بخلاف ذلك ، فإن هذا العامل انعكاسي أيضًا ، حيث تتم مقارنة النوع بـ & # 60: مع نفسه. في تعبير بالنموذج E1 & # 60: E2 ، يجب أن يكون لكل من E1 و E2 النوع TYPE لأن في JML TYPE هو نفسه java.lang.Class يعني التعبير E1 & # 60: E2 نفس الشيء مثل التعبير E2 .isAssignable From (E1). نتيجة لذلك ، لا تعد الأنواع الأولية أنواعًا فرعية من كائن java.lang.Object ، ولا تنتمي إلى بعضها البعض ، على الرغم من أنها تخص نفسها ، على سبيل المثال ، Integer.TYPE & # 60: Integer.TYPE صحيحة.

          12.6.2 عوامل تشغيل التكافؤ وعدم التكافؤ

          يعمل العاملان & # 60 == & # 62 و & # 60 =! = & # 62 فقط على التعبيرات الفرعية المنطقية ولها نفس المعنى مثل == و! = ، على التوالي. ومع ذلك ، فهي تتمتع بأولوية منخفضة جدًا ، وبالتالي فهي مفيدة في المستوى الأعلى من تعبير المواصفات. على عكس == و! = ، فإن عوامل التشغيل & # 60 == & # 62 و & # 60 =! = & # 62 هي أيضًا ترابطية ومتماثلة.

          يمكن قراءة التدوين & # 60 == & # 62 "إذا وفقط إذا". لها نفس المعنى للقيم المنطقية مثل == ، ولكن لها أسبقية أقل. لذلك ، فإن التعبير " result size == 0" يعني نفس الشيء مثل " result == (size == 0)".

          يمكن قراءة التدوين & # 60 =! = & # 62 "لا يساوي". لها نفس المعنى للقيم المنطقية مثل! = ، ولكن لها أسبقية أقل. لذلك ، فإن التعبير " result size == 0" يعني نفس الشيء مثل " result! = (size == 0)".

          يجب أن تكون التعبيرات على جانبي هذه العوامل من النوع المنطقي ، ونوع النتيجة منطقية أيضًا.

          12.6.3 عوامل التضمين الأمامي والعكسي

          العاملان == & # 62 و & # 60 == يعملان فقط على التعبيرات الفرعية المنطقية. يحسبون الآثار إلى الأمام والعكس ، على التوالي.

          على سبيل المثال ، الصيغة raining == & # 62 getWet صحيحة إذا كان المطر خطأً أو أن getWet صحيحًا. الصيغة getWet & # 60 == تمطر تعني نفس الشيء. عامل التشغيل == & # 62 يقترن جهة اليمين ، لكن عامل التشغيل & # 60 == يقترن جهة اليسار. يجب أن تكون التعبيرات على جانبي هذه العوامل من النوع المنطقي ، ونوع النتيجة منطقية أيضًا.

          يتم تقييم هذين العاملين بطريقة قصر الدائرة ، من اليسار إلى اليمين. وهكذا ، في a == & # 62 b ، إذا كانت a خطأ ، فإن التعبير يكون صحيحًا ولا يتم تقييم b. وبالمثل ، في a & # 60 == b ، إذا كان a صحيحًا ، يكون التعبير صحيحًا ولا يتم تقييم b. بمعنى آخر ، a == & # 62 b تعادل! a || b و a & # 60 == b تعادل || !ب .

          بسبب تقييم الدائرة القصيرة هذا ، لا تعادل a == & # 62 b تمامًا b & # 60 == أ. على سبيل المثال ، سيكون x! = null == & # 62 xa & # 62 0 صحيحًا إذا كانت x خالية ، لكن x.a & # 620 & # 60 == x! x لاغية.

          12.6.4 ترتيب Lockset

          يستخدم JML & # 60 # و & # 60 # = لاختبار ترتيب الأقفال. (تم إهمال العوامل المستخدمة سابقًا & # 60 و & # 60 = لأن استخدامها يتعارض مع مقارنات Java المحددة لعوامل التشغيل هذه عند توفر التعبئة التلقائية.)

          باستخدام العبارات المتزامنة ، يمكن لبرامج Java إنشاء أقفال للشاشة للسماح بخيط واحد فقط في كل مرة لتنفيذ أقسام معينة من التعليمات البرمجية. يمكن استخدام أي كائن كقفل.لكي يتمكن ESC / Java [Leino-Nelson-Saxe00] من التفكير في إمكانية حدوث حالات توقف تام بين الخيوط ، يجب الإعلان عن ترتيب جزئي بشكل ثابت على كائنات القفل ، حيث تكون الكائنات "الأكبر" عبارة عن كائنات يجب الحصول على أقفالها لاحقًا. يقترح ESC / Java استخدام عبارات بديهية للإعلان عن هذا الترتيب الجزئي.

          يختبر العاملان & # 60 # و & # 60 # = هذا الترتيب الجزئي في التأكيدات. عند استخدامها بهذه الطريقة ، يجب أن تكون التعبيرات الفرعية على جانبي & # 60 # أو & # 60 # = أنواع مرجعية ، والنتيجة هي من النوع المنطقي.

          12.7 مخزن المراجع

          يتم استخدام بناء الجملة المتعلق بإنتاج مرجع المتجر في عدة أماكن ، لا سيما في البنود القابلة للتخصيص (انظر القسم 9.9.9 البنود القابلة للتخصيص).

          يشير مرجع المتجر إلى مجموعة من المواقع. يمكن تحديد هذه المجموعات باستخدام مجموعات البيانات (انظر القسم 10. مجموعات البيانات) ، وإذا تم ذلك ، فإن مجموعة المواقع التي يشير إليها مرجع المتجر هي اتحاد جميع مجموعات المواقع في المجموعة المحددة من مجموعات البيانات.

          مجموعة المواقع المشار إليها بواسطة store-ref-list of the form store-ref، [store-ref] . هو اتحاد جميع مجموعات المواقع التي يشير إليها كل مرجع مخزن في القائمة.

          يشير store-ref لا شيء إلى مجموعة المواقع الفارغة. يشير الشكل كل شيء إلى مجموعة جميع المواقع في البرنامج. يشير الشكل not_specified إلى مجموعة غير محددة من المواقع ، يتم تحديد استخدامها بواسطة أداة معينة.

          عندما يشير SR إلى مجموعة من المواقع تحتوي على كائنات ، فإن SR. يشير f ، حيث f هو معرف ، إلى اتحاد مجموعات البيانات لكل حقل يسمى f في كل كائن في دلالة SR.

          معنى تعبير مرجع المخزن للنموذج SR. * يعتمد على دلالة اسم مرجع المخزن SR. عندما يشير SR إلى مجموعة من مواقع الكائنات ، فإن SR. * يشير إلى اتحاد مجموعات البيانات لجميع حقول المثيل المرئية من نوع SR (الثابت). من ناحية أخرى ، إذا قام SR بتسمية فئة أو واجهة ، فإن SR. * يشير إلى اتحاد مجموعات البيانات لجميع الحقول الثابتة المرئية للفئة أو الواجهة المسماة.

          وبالمثل ، عندما يشير SR إلى مجموعة من المواقع التي تحتوي على مصفوفات ، فإن SR [*] يشير إلى اتحاد جميع مجموعات البيانات لجميع العناصر في جميع المصفوفات التي يشير إليها SR. أيضًا ، عندما يشير SR إلى مجموعة من المواقع التي تحتوي على مصفوفات ، فإن SR [L .. H] يشير إلى اتحاد جميع مجموعات البيانات لجميع العناصر في المصفوفات التي يُشار إليها بواسطة SR والتي تكون فهارسها بين L و H شاملة. في الحالة التي يشير فيها SR إلى مجموعة من المواقع التي تحتوي على مصفوفات ، يشير SR [J] إلى اتحاد جميع مجموعات البيانات لهذه المصفوفات في الفهرس الذي يُشار إليه بتعبير المواصفات J.


          خيارات CMakeLists.txt المتقدمة

          يغطي هذا القسم بعض الموضوعات المتقدمة لملف مستخدم CMakeLists.txt.

          تنسيق الدليل المصدر

          بالنسبة للمشاريع المعقدة ، من المستحسن تنظيم ملفات التعليمات البرمجية المصدر والرؤوس في الدلائل الفرعية. افترض بنية المشروع التالية مع مكتبة "mylib" و "mycode" قابل للتنفيذ: في هذه الحالة قد يكون ملف CMakeLists.txt ذو المستوى الأعلى: سيتضمن بيان ADD_SUBDIRECTORY ملف CMakeLists.txt في الدليل الفرعي المحدد. في حالتنا: يتعين علينا إضافة الدليل include لملفات الرأس إلى مجلد include الحالي مع بيان INCLUDE_DIRECTORIES (انظر هذا القسم للحصول على التفاصيل). يبدو ملف التكوين المطابق للملف التنفيذي كما يلي:

          يرجى ملاحظة أن ملفات CMakeLists.txt لها نطاق دليل. أي معالجة للخصائص والمتغيرات لها تأثير فقط في الدليل الحالي (والأدلة الفرعية المضمنة في ADD_SUBDIRECTORY. لن يتأثر المستوى أعلاه. لذلك ، يتعين علينا تحديد أدلة التضمين لـ "mylib" مرة أخرى في الدليل الفرعي mycode - هذه المرة بالمسار الكامل $/ mylib / تشمل.

          يحدد CMake المتغيرات التالية للوصول إلى الدلائل المهمة:

          بيانات التحكم

          تأخذ عبارات التحكم في CM الشكل التالي: أو في شكل طويل: يرجى ملاحظة الأقواس الفارغة (غير الشائعة إلى حد ما) الفارغة والفتح والإغلاق خلف ELSE () و ENDIF (). يمكن أن تأخذ & ltexpression & gt العديد من الأشكال المختلفة ، ألق نظرة على وثائق CMake للحصول على قائمة كاملة. الأمثلة الهامة هي:

          يمكن إبطال التعبير ببدء NOT:

          يتم تنفيذ الحلقات بمساعدة عبارات WHILE و FOR. السابق يأخذ نفس & ltexpression & gt مثل عبارة IF:

          بالنظر إلى قائمة متغيرات تحتوي على قائمة ، يمكن الوصول إلى عنصر العناصر الفردية باستخدام عبارة FOREACH: ملاحظة: من الممكن أيضًا تحديد القائمة مباشرة:

          ملف globs

          مهمة شائعة جدًا هي التقاط قائمة بالملفات المصدر من دليل. يمكنك إما إدارة قائمة ملفات المصدر في CMakeLists.txt يدويًا ، على سبيل المثال عن طريق تحديث جميع الملفات المصدر يدويًا لهدف معين ، أو يمكنك استخدام glob لأتمتة هذه العملية. المثال التالي سوف يلتقط كل ملف مصدر ضمن SOURCE_DIR / sources / ويضيفه إلى ملف قابل للتنفيذ:

          يرجى الانتباه إلى تحذير واحد من هذا النهج: نظرًا لحقيقة أن CMake هو ملف بناء مولد النظام تكوين البناء الناتج (لـ make) ليس لديه طريقة لاكتشاف ما إذا كان ملف مصدر جديد قد تمت إضافته (أو إزالته) وأنه يجب عليه معاودة الاتصال بـ cmake. لذلك ، بعد إضافة ملف مصدر جديد ، يجب عليك لمس ملف CMakeLists.txt أو تشغيل cmake. مرة أخرى باليد.

          تمت إعادة زيارة DEAL_II_SETUP_TARGET

          يعد الماكرو DEAL_II_SETUP_TARGET مسؤولاً عن إعداد هدف للترجمة والربط مقابل deal.II. سوف تكون ألحق الخاصية INCLUDE_DIRECTORIES مع موقع الصفقة. II تتضمن الدلائل ، و ألحق الخصائص COMPILE_FLAGS و COMPILE_DEFINITIONS و LINK_FLAGS حسب قيمها من تكوين deal.II (اعتمادًا على نوع البناء والتصحيح المتاح و / أو النكهة المحسنة للمكتبة).

          باستثناء حالة مكتبة الكائنات ، سيتم أيضًا إعداد الهدف المحدد للارتباط مقابل deal.II (وواجهة الارتباط المتعدية الخاصة به) أيضًا.

          اختياريًا ، يأخذ الماكرو DEAL_II_SETUP_TARGET وسيطة إضافية DEBUG ، أو RELEASE ، بعد اسم الهدف ليحدد صراحة نكهة المكتبة التي يجب إعداد الهدف لها. إذا تم حذف المعلمة ، فسيتم استنتاج الاختيار الصحيح من نوع البناء الحالي. (هذا مدعوم لأنواع البناء Debug و Release. في حالة DebugRelease ، تكون الوسيطة الإضافية مطلوبة دائمًا.)

          ملاحظة: العلامات التي تمت إضافتها مع DEAL_II_SETUP_TARGET إلى الهدف تأتي أخيرًا في استدعاء مترجم الارتباط النهائي ، أو استدعاء الرابط. هذا يعني أنها لها الأسبقية على جميع العلامات التي تم تحديدها بشكل عام عبر CMAKE_CXX_FLAGS ، وما إلى ذلك ، أو باعتبارها خاصية دليل. إذا كنت ترغب في تعديل العلامات أو تعريفات المعالج المسبق التي تم إعدادها باستخدام DEAL_II_SETUP_TARGET ، فقم بتعديل المتغيرات التالية (راجع القسم الخاص بـ deal.IIConfig.cmake للحصول على التفاصيل):

          تمت إعادة زيارة DEAL_II_INITIALIZE_CACHED_VARIABLES

          يعد الماكرو DEAL_II_INITIALIZE_CACHED_VARIABLES مسؤولاً عن إعداد المتغيرات المخزنة مؤقتًا ويجب أن يتم استدعاؤه قبل استدعاء المشروع: سيقوم الماكرو بتعيين متغير CMAKE_BUILD_TYPE غير مهيأ لنوع بناء الصفقة II ، أي DEAL_II_BUILD_TYPE. إذا تم تحديد CMAKE_BUILD_TYPE ، فسيتم إعادة تعيينه تلقائيًا إذا كانت القيمة المحددة غير مدعومة بتثبيت deal.II (على سبيل المثال ، إذا لم تكن مساوية لـ Debug أو Release أو DebugRelease).

          علاوة على ذلك ، يقوم هذا الماكرو بتعيين مترجم C ++ على المترجم المستخدم لتجميع مكتبة deal.II. سيتم تهيئة المتغيرات CMAKE_CXX_FLAGS و CMAKE_CXX_FLAGS_DEBUG و CMAKE_CXX_FLAGS_RELEASE بسلسلة فارغة.

          ملاحظة: إذا كنت ترغب في تجاوز العلامات والتعريفات التي تم تعيينها بواسطة الماكرو DEAL_II_SETUP_TARGET ، فيجب عليك تجاوز متغير DEAL_II_ * المقابل بدلاً من ذلك. راجع وثائق DEAL_II_SETUP_TARGET لمزيد من التفاصيل.

          التخصيص يشمل الدلائل وتجميع التعريفات

          يمكنك تحديد تضمين أدلة مخصصة وتجميع تعريفات قبل تعريف الهدف على أساس كل دليل (ألق نظرة على وثائق CMake للحصول على مزيد من التفاصيل):

          مكتبات خارجية

          بالنسبة للمكتبات الخارجية التي توفر تكوين مشروع CMake أو حيث تتوفر وحدة CMake find ، فإن تضمين هذه المكتبة الخارجية في مشروعك يكون أكثر أو أقل وضوحًا. على سبيل المثال لطلب مشروع خارجي "foo" على الأقل كتابة الإصدار 8.0: بدلاً من ذلك ، يمكن حذف رقم الإصدار والكلمة الأساسية المطلوبة. (اعتمادًا على المكتبة الخارجية) عادةً ما يحدد تكوين المشروع أو العثور على الماكرو متغيرات مثل FOO_INCLUDE_DIRS و FOO_LIBRARIES التي يمكن استخدامها مباشرة في ملف CMakeLists.txt: ستقوم العبارة الأولى بإعداد أدلة التضمين للأهداف التالية كما هو موضح أعلاه. البيان الأخير مع TARGET_LINK_LIBRARIES سوف يضيف المكتبات الموجودة في متغير FOO_LIBRARIES لواجهة الارتباط الخاصة بشفري الهدف.

          تمت إعادة النظر في هدف "التشغيل"

          ستعمل عبارة التشغيل البسيطة كما هو موضح أعلاه على تشغيل الملف القابل للتنفيذ الذي تم إنشاؤه في دليل الإنشاء. في بعض الأحيان يكون من المرغوب فيه أكثر تشغيل الملف التنفيذي في دليل تشغيل مخصص داخل دليل البناء وهو نسخة من مجلد تشغيل الهيكل العظمي من دليل المصدر: هنا ، نقوم بتعديل خاصية RUNTIME_OUTPUT_DIRECTORY لهدفنا بحيث يتم ربط الملف التنفيذي بالداخل مجلد التشغيل المعين لدينا ، بحيث يكون متاحًا بشكل ملائم كملف تنفيذي داخل مجلد التشغيل. علاوة على ذلك ، نحدد WORKING_DIRECTORY لهدف التشغيل ، بحيث يستدعي إجراء التشغيل الملف التنفيذي داخل دليل التشغيل المقصود.


          Yngre Elevers uppfattningar av det matematiska i algebraiska uttryck

          الملخص

          Det övergripande syftet med denna artikel är att analysera och beskriva yngre Elevers uppfattningar av det matematiska i ett algebraiskt uttryck och utifrån det diskutera vad som kan utgöra kritiska aspekter föer utvecklandet. Artikeln bygger på data från ett forskningsprojekt där elever i förskoleklass، årskurs 1 och årskurs 4 interjuades med syfte at analysera de aktuella elevernas kvalitativt skilda sätt at uppfatta detrybrachka ut alget uppfatta detryematiska ut algeteska. تحليلات Intervjuerna fenomenografiskt. نتائج الدراسات التي تم إجراؤها على أساس الرحلة kvalitativt Skilda kategorier av yngre Elevers uppfattningar av det matematiska i algebraiska uttryck. Det matematiska i ett algebraiskt uttryck erfars som "något som kan och bör räknas ut"، "något som beskriver en reliation a mellan komponenter" och "något som presenterar in status". معرفات Vidare هي علاقة tre kritiska aspekter حتى kategorierna. De kritiska aspekter Som ger Elerna möjlighet at kvalificera sina uppfattningar för att utveckla ett Mer komplext kunnande av algebraiska uttryck är at kunna urskilja att 1) ​​ett uttryck består avika komponenter värde och 3) värdet på en varabel i ett uttryck bestäms connectionellt. Att urskilja sådana kritiska aspekter kan hjälpa Elerna att kvalificera sitt kunnande. Således måste de kritiska aspekterna beaktas vid utformningen av undervisningen.

          الملخص باللغة الإنجليزية

          الغرض العام من هذه المقالة هو تحليل ووصف مفاهيم الطلاب الأصغر سنًا أو طرق اختبارهم للرياضيات في تعبير جبري ومناقشة الجوانب التي يمكن أن تكون حاسمة لتطوير مفاهيم أكثر تأهلاً. تستند المقالة إلى بيانات من مشروع بحثي حيث تم إجراء مقابلات مع الطلاب في صف ما قبل المدرسة والصف الأول والرابع بهدف تحليل طرق الطلاب المختلفة نوعيًا لتجربة الرياضيات في التعبيرات الجبرية. تم تحليل المقابلات مع الفينومينوغرافيا. تظهر النتائج ثلاث فئات مختلفة نوعيًا لمفاهيم الطلاب الأصغر سنًا للرياضيات في التعبيرات الجبرية. يتم اختبار الرياضيات في التعبير الجبري على أنها "شيء يمكن ويجب حسابه" ، و "شيء يصف العلاقة بين المكونات" ، و "شيء يمثل موقفًا". علاوة على ذلك ، هناك ثلاثة ما يسمى بالجوانب الحرجة التي يحتاجها الطلاب تم تحديد التمييز فيما يتعلق بالفئات 1) يتكون التعبير من مكونات مختلفة لها وظائف مختلفة ، 2) واحد ونفس المتغير في التعبير له نفس القيمة و 3) يتم تحديد قيمة المتغير في التعبير بشكل علائقي. إن تمييز مثل هذه الجوانب الحاسمة قد يساعد الطلاب على تأهيل طرقهم في المعرفة ، وبالتالي ، يجب مراعاة الجوانب الحاسمة في تصميم التدريس.


          • 10 [1-9] مباريات 101-109
          • 1 [1-9] d يتطابق مع 110-199
          • [2-9] د د ماكينات 200-999
          • 1000 تطابق 1000
          • $ يطابق نهاية السلسلة

          تعديل: تمت إضافة ^ و $ إلى regex لمنع التطابقات الخاطئة في منتصف الأرقام

          يذكرنا عدد الحالات المراد اختبارها فقط أنه توجد أحيانًا حلول أفضل من التعبيرات العادية

          يجب أن يؤدي هذا إلى الحيلة في python3.

          تفقد هذا. يحتوي هذا على شرح لما تريد القيام به وكيفية القيام به ، إلى جانب النطاقات الأخرى.


          أنواع المتغيرات

          هناك أربعة أنواع من المتغيرات المتوفرة لوحدات الماكرو:

          متغير فارغ: المتغير الذي تم تحديده على أنه # 0 هو متغير فارغ. المتغير الفارغ ليس له قيمة & ndash هو متغير فارغ ، غالبا ما يسمى متغير شاغر. يمكن قراءة هذا المتغير بواسطة برنامج الماكرو ، ولكن لا يمكن تعيين قيمة له ، مما يعني أنه لا يمكن تعيين البيانات إليه.

          المتغيرات المحلية: المتغيرات المحلية مؤقتة فقط - يتم استخدامها في هيكل الماكرو وتحمل بيانات معينة. عندما يتم استدعاء الماكرو ، يتم تعيين المتغيرات المحلية على القيم المخصصة لها. عند اكتمال الماكرو والخروج (باستخدام الوظيفة المتنوعة M99) ، أو إيقاف تشغيل طاقة التحكم ، يتم تعيين جميع المتغيرات المحلية على قيم خالية - لن تكون موجودة بعد الآن.

          المتغيرات المشتركة: المتغيرات العامة - أو العامة - لا تزال مخزنة في ذاكرة التحكم عند اكتمال الماكرو. يتم الحفاظ على هذه المتغيرات بواسطة النظام ويمكن مشاركتها بواسطة العديد من برامج الماكرو الأخرى. عادة ما يتم مسح هذه المجموعة من المتغيرات بواسطة برنامج ماكرو مصمم خصيصًا.

          متغيرات النظام: تُستخدم متغيرات النظام لإعداد و / أو تغيير الظروف الافتراضية ويمكنها قراءة وكتابة بيانات CNC المختلفة ، على سبيل المثال ، الحالة الحالية لوضع G-code ، وإزاحة العمل الحالية ، وما إلى ذلك ، يتم تعيين أرقامها بواسطة نظام التحكم الصانع.


          9.1.1: المتغيرات والعبارات

          يوفر ES6 طريقتين جديدتين للإعلان عن المتغيرات: let و const ، والتي تحل في الغالب محل طريقة ES5 للإعلان عن المتغيرات ، var.

          9.1.1 دعونا #

          دعنا يعمل بشكل مشابه لـ var ، لكن المتغير الذي تعلنه هو كتلة النطاق، فهو موجود فقط داخل الكتلة الحالية. فار هو نطاق الوظيفة.

          في الكود التالي ، يمكنك أن ترى أن المتغير let -declared tmp موجود فقط داخل الكتلة التي تبدأ في السطر A:

          9.1.2 كونست #

          يعمل const مثل let ، ولكن يجب تهيئة المتغير الذي تعلنه على الفور ، بقيمة يمكن & # x2019t تغييرها بعد ذلك.

          منذ أن يخلق واحد ربط (مساحة تخزين لمتغير) لكل تكرار حلقي ، لا بأس من تصحيح متغير الحلقة:

          9.1.3 طرق التصريح عن المتغيرات #

          يقدم الجدول التالي نظرة عامة على ست طرق يمكن من خلالها الإعلان عن المتغيرات في ES6 (مستوحاة من جدول بواسطة kangax):

          & # xA0 الرفع نطاق يخلق خصائص عالمية
          فار إعلان دور نعم
          يترك منطقة ميتة مؤقتة منع لا
          مقدار ثابت منطقة ميتة مؤقتة منع لا
          وظيفة اكتمال منع نعم
          صف دراسي لا منع لا
          يستورد اكتمال وحدة عالمية لا

          9.2 تحديد النطاق عبر let و const #

          كل من let و const ينشئ متغيرات كتلة النطاق & # x2013 هم موجودون فقط داخل الكتلة الأعمق المحيطة بهم. يوضح الكود التالي أن المتغير const -declared tmp موجود فقط داخل كتلة عبارة if:

          في المقابل ، فإن المتغيرات var -declared هي ذات نطاق وظيفي:

          يعني تحديد النطاق أنه يمكنك تظليل المتغيرات داخل دالة:

          9.3 const يخلق متغيرات ثابتة #

          المتغيرات التي تم إنشاؤها بواسطة let قابلة للتغيير:

          الثوابت ، المتغيرات التي تم إنشاؤها بواسطة const ، غير قابلة للتغيير & # x2013 يمكنك & # x2019t تعيين قيم مختلفة لهم:

          تفاصيل المواصفات: يؤدي تغيير متغير ثابت دائمًا إلى خطأ في النوع #

          عادةً ما يؤدي تغيير الارتباط غير القابل للتغيير إلى حدوث استثناء في الوضع المتشدد ، وفقًا لـ SetMutableBinding (). لكن المتغيرات const -declared تنتج دائمًا ارتباطات صارمة & # x2013 راجع FunctionDeclusionInstantiation (func، argumentsList) ، الخطوة 35.b.i.1.

          9.3.1 الوقوع في الخطأ: الثابت لا يجعل القيمة ثابتة #

          يعني const فقط أن المتغير له نفس القيمة دائمًا ، لكنه لا يعني أن القيمة نفسها غير قابلة للتغيير أو تصبح كذلك. على سبيل المثال ، obj ثابت ، لكن القيمة التي يشير إليها قابلة للتغيير & # x2013 يمكننا إضافة خاصية إليها:

          ومع ذلك ، لا يمكننا تعيين قيمة مختلفة للهدف:

          إذا كنت تريد أن تكون قيمة الهدف ثابتة ، فعليك أن تعتني بها بنفسك. على سبيل المثال ، عن طريق تجميده:

          9.3.1.1 المأزق: Object.freeze () ضحل #

          ضع في اعتبارك أن Object.freeze () هو أجوفإنه يجمد فقط خصائص حجته ، وليس الأشياء المخزنة في خصائصه. على سبيل المثال ، يتم تجميد كائن الكائن:

          لكن الكائن obj.foo ليس كذلك.

          9.3.2 ثابت في أجسام الحلقة #

          بمجرد إنشاء متغير ثابت ، يمكن تغييره & # x2019t. لكن هذا لا يعني أنه لا يمكنك & # x2019t إعادة إدخال نطاقه والبدء من جديد بقيمة جديدة. على سبيل المثال ، عبر حلقة:

          يوجد إعلانان ثابتان في هذا الرمز ، في السطر A وفي السطر B. وخلال كل تكرار حلقة ، يكون للثوابت قيم مختلفة.

          9.4 المنطقة الميتة الزمنية #

          المتغير المعلن بواسطة let أو const له ما يسمى المنطقة الميتة الزمنية (TDZ): عند الدخول إلى نطاقه ، يمكن الوصول إليه (تم الحصول عليه أو تعيينه) حتى يصل التنفيذ إلى الإعلان. لنقارن & # x2019s دورات حياة المتغيرات var -declared (التي لا تحتوي على TDZs) والمتغيرات التي تم الإعلان عنها (التي لها TDZs).

          9.4.1 دورة حياة المتغيرات var -declared #

          متغيرات var لا تحتوي على مناطق ميتة مؤقتة & # x2019t. تتكون دورة حياتها من الخطوات التالية:

          • عندما يتم إدخال النطاق (وظيفته المحيطة) لمتغير var ، فإن مساحة التخزين (أ ربط) تم إنشاؤه من أجله. يتم تهيئة المتغير على الفور ، عن طريق تعيينه على undefined.
          • عندما يصل التنفيذ داخل النطاق إلى الإعلان ، يتم تعيين المتغير على القيمة المحددة بواسطة مهيئ (مهمة) & # x2013 إذا كان هناك واحد. إذا لم يكن هناك & # x2019t ، تظل قيمة المتغير غير محددة.

          9.4.2 دورة حياة المتغيرات المعلنة #

          المتغيرات المعلنة عبر اسمحوا لها مناطق ميتة مؤقتة ودورة حياتها تبدو كما يلي:

          • عندما يتم إدخال النطاق (الكتلة المحيطة به) لمتغير let ، مساحة التخزين (a ربط) تم إنشاؤه من أجله. يظل المتغير غير مهيأ.
          • يؤدي الحصول على متغير غير مهيأ أو تعيينه إلى حدوث خطأ في ReferenceError.
          • عندما يصل التنفيذ داخل النطاق إلى الإعلان ، يتم تعيين المتغير على القيمة المحددة بواسطة مهيئ (مهمة) & # x2013 إذا كان هناك واحد. إذا لم يكن هناك & # x2019t ، فسيتم تعيين قيمة المتغير على غير محدد.

          تعمل متغيرات const بشكل مشابه للسماح للمتغيرات ، ولكن يجب أن يكون لها مُهيئ (أي يتم ضبطها على قيمة على الفور) ويمكن تغييرها & # x2019t.

          9.4.3 أمثلة #

          ضمن TDZ ، يتم طرح استثناء إذا تم الحصول على متغير أو تعيينه:

          إذا كان هناك مُهيئ ، فإن TDZ ينتهي بعد، بعدما تم تقييم المُهيئ وتعيين النتيجة إلى المتغير:

          يوضح الكود التالي أن المنطقة الميتة بالفعل زمني (بناءً على الوقت) وليس مكانيًا (بناءً على الموقع):

          9.4.4 typeof يلقي خطأ ReferenceError لمتغير في TDZ #

          إذا قمت بالوصول إلى متغير في المنطقة الميتة الزمنية عبر typeof ، فستحصل على استثناء:

          لماذا ا؟ الأساس المنطقي هو كما يلي: foo ليس غير معلن ، فهو غير مهيأ. يجب أن تكون على دراية بوجودها ، ولكن لا & # x2019t. لذلك ، يبدو أن التحذير مرغوب فيه.

          علاوة على ذلك ، هذا النوع من الفحص مفيد فقط لإنشاء متغيرات عامة مشروطة. هذا شيء لا تحتاج إلى القيام به في البرامج العادية.

          9.4.4.1 إنشاء المتغيرات بشكل مشروط #

          عندما يتعلق الأمر بإنشاء المتغيرات بشكل مشروط ، لديك خياران.

          الخيار 1 & # x2013 typeof و var:

          يعمل هذا الخيار فقط في النطاق العالمي (وبالتالي ليس داخل وحدات ES6).

          الخيار 2 & # x2013 النافذة:

          9.4.5 لماذا توجد منطقة ميتة زمنية؟ #

          هناك العديد من الأسباب التي تجعل الثابت والسماح لهما مناطق ميتة مؤقتة:

          • للقبض على أخطاء البرمجة: من الغريب أن تكون قادرًا على الوصول إلى متغير قبل إعلانه. إذا قمت بذلك ، فعادة ما يكون ذلك عن طريق الصدفة ويجب تحذيرك بشأنه.
          • بالنسبة لـ const: من الصعب جعل const تعمل بشكل صحيح. نقلاً عن Allen Wirfs-Brock: & # x201CTDZs & # x2026 توفر دلالات منطقية لـ const. كانت هناك مناقشة فنية كبيرة لهذا الموضوع وظهرت TDZs كأفضل حل. & # x201D دعونا أيضًا تحتوي على منطقة ميتة مؤقتة بحيث لا يؤدي التبديل بين let و const & # x2019t إلى تغيير السلوك بطرق غير متوقعة.
          • تدقيق المستقبل للحراس: قد يكون لدى JavaScript في النهاية حراس، آلية لفرض وقت التشغيل أن المتغير لديه القيمة الصحيحة (فكر في التحقق من نوع وقت التشغيل). إذا كانت قيمة المتغير غير محددة قبل الإعلان عنها ، فقد تتعارض هذه القيمة مع الضمان المقدم من قبل حارسه.

          9.4.6 قراءات إضافية #

          9.5 اسمحوا وثابت في رؤوس حلقة #

          تسمح لك الحلقات التالية بإعلان المتغيرات في رؤوسهم:

          لتقديم تصريح ، يمكنك استخدام var أو let أو const. كل واحد منهم له تأثير مختلف ، كما سأشرح لاحقًا.

          9.5.1 للحلقة #

          var -declaring متغيرًا في رأس حلقة for يؤدي إلى إنشاء واحد ربط (مساحة التخزين) لهذا المتغير:

          كل i في أجسام وظائف الأسهم الثلاثة يشير إلى نفس الربط ، وهذا هو السبب في أنها جميعًا ترجع نفس القيمة.

          إذا سمحت لـ -declare متغيرًا ، فسيتم إنشاء ارتباط جديد لكل تكرار حلقي:

          هذه المرة ، يشير كل i إلى ارتباط تكرار معين ويحافظ على القيمة التي كانت سارية في ذلك الوقت. لذلك ، ترجع كل دالة سهم قيمة مختلفة.

          يعمل const مثل var ، لكن يمكنك & # x2019t تغيير القيمة الأولية لمتغير const -declared:

          قد يبدو الحصول على ارتباط جديد لكل تكرار غريبًا في البداية ، ولكنه مفيد جدًا عندما تستخدم الحلقات لإنشاء وظائف تشير إلى متغيرات الحلقة ، كما هو موضح في قسم لاحق.

          للحلقة: الارتباطات لكل تكرار في المواصفات #

          يختلف تقييم مقابض الحلقة for كحالة ثانية و let / const كحالة ثالثة. يتم إضافة متغيرات السماح -declared فقط إلى قائمة perIterationLets (الخطوة 9) ، والتي يتم تمريرها إلى ForBodyEvaluation () كمعامل من الثاني إلى الأخير ، PerIterationBindings.

          9.5.2 for-of-of-loop و-in-in loop #

          في حلقة for-of ، يُنشئ var ارتباطًا واحدًا:

          ينشئ const ارتباطًا واحدًا غير قابل للتغيير لكل تكرار:

          دعونا أيضًا ينشئ ارتباطًا واحدًا لكل تكرار ، لكن الارتباطات التي ينشئها قابلة للتغيير.

          تعمل حلقة for-in بشكل مشابه لحلقة for-of.

          For-of loop: ارتباطات لكل تكرار في المواصفات #

          تتم معالجة ارتباطات التكرار في for-of بواسطة ForIn / OfBodyEvaluation. في الخطوة 5.b ، يتم إنشاء بيئة جديدة وإضافة الارتباطات إليها عبر BindingInstantiation (متغير لـ let ، غير قابل للتغيير لـ const). يتم تخزين قيمة التكرار الحالية في المتغير nextValue وتستخدم لتهيئة الارتباطات بإحدى الطريقتين التاليتين:

          • إعلان متغير واحد (الخطوة 5.h.i): يتم التعامل معه عبر InitializeReferencedBinding
          • التدمير (الخطوة 5.i.iii): يتم التعامل معه عبر حالة واحدة من BindingInitialization (ForDeclusion) ، والتي تستدعي حالة أخرى من BindingInitialization (BindingPattern).

          9.5.3 لماذا تعتبر الارتباطات التكرارية مفيدة؟ #

          فيما يلي صفحة HTML تعرض ثلاثة روابط:

          1. إذا نقرت على & # x201Cyes & # x201D ، فسيتم ترجمتها إلى & # x201Cja & # x201D.
          2. إذا نقرت على & # x201Cno & # x201D ، فسيتم ترجمتها إلى & # x201Cnein & # x201D.
          3. إذا نقرت على & # x201Cperhaps & # x201D ، فسيتم ترجمتها إلى & # x201Cvielleicht & # x201D.

          ما يتم عرضه يعتمد على الهدف المتغير (الخط ب). إذا استخدمنا var بدلاً من const في السطر A ، فسيكون هناك ارتباط واحد للحلقة بأكملها وسيكون للهدف القيمة & aposvielleicht & apos ، بعد ذلك. لذلك ، بغض النظر عن الرابط الذي تضغط عليه ، ستحصل دائمًا على الترجمة & aposvielleicht & apos.

          لحسن الحظ ، مع const ، نحصل على ارتباط واحد لكل حلقة تكرار ويتم عرض الترجمات بشكل صحيح.

          9.6 المعلمات كمتغيرات #

          9.6.1 المعاملات مقابل المتغيرات المحلية #

          إذا سمحت لـ -declare متغيرًا له نفس اسم معلمة ، فستحصل على خطأ ثابت (وقت التحميل):

          يؤدي فعل الشيء نفسه داخل كتلة إلى تظليل المعلمة:

          في المقابل ، فإن var -declaring متغيرًا له نفس اسم المعلمة لا يفعل شيئًا ، تمامًا مثل إعادة إعلان متغير var داخل نفس النطاق لا يفعل شيئًا.

          9.6.2 القيم الافتراضية للمعلمات والمنطقة الميتة الزمنية #

          إذا كانت المعلمات تحتوي على قيم افتراضية ، فسيتم التعامل معها كسلسلة من عبارات let وتخضع للمناطق الميتة الزمنية:

          9.6.3 القيم الافتراضية للمعلمات لا & # x2019t ترى نطاق الجسم #

          نطاق القيم الافتراضية للمعامل منفصل عن نطاق الجسم (الأول يحيط الأخير). هذا يعني أن الأساليب أو الوظائف المحددة & # x201Cinside & # x201D القيم الافتراضية للمعلمة لا & # x2019t ترى المتغيرات المحلية للجسم:

          9.7 الكائن العالمي #

          يعد JavaScript & # x2019s global object (نافذة في متصفحات الويب ، عالميًا في Node.js) خطأ أكثر من كونه ميزة ، خاصة فيما يتعلق بالأداء. هذا هو السبب في أنه من المنطقي أن تقدم ES6 تمييزًا:

          • جميع خصائص الكائن العام هي متغيرات عامة. في النطاق العام ، تُنشئ الإعلانات التالية مثل هذه الخصائص:
            • إقرارات فار
            • إقرارات الوظيفة
            • دعونا التصريحات
            • تصريحات كونستانت
            • الإعلانات الطبقية

            لاحظ أن نصوص الوحدات النمطية لا يتم تنفيذها في النطاق العام ، وإنما يتم تنفيذ النصوص البرمجية فقط. لذلك ، تشكل بيئات المتغيرات المختلفة السلسلة التالية.

            9.8 إعلانات الوظائف وإعلانات الفئة #

            • يتم تحديد نطاقها ، مثل Let.
            • إنشاء خصائص في الكائن العام (أثناء وجوده في النطاق العام) ، مثل var.
            • نكون مرفوع: بصرف النظر عن مكان ذكر إعلان الوظيفة في نطاقه ، يتم إنشاؤه دائمًا في بداية النطاق.

            يوضح الكود التالي رفع إعلانات الوظائف:

            قد يكون عدم رفع الفصول الدراسية أمرًا مفاجئًا ، لأنها تخلق وظائف تحت الغطاء. الأساس المنطقي لهذا السلوك هو أن قيم الجمل الموسعة يتم تعريفها من خلال التعبيرات ويجب تنفيذ هذه التعبيرات في الأوقات المناسبة.

            9.9 أسلوب الترميز: const مقابل let مقابل var #

            أوصي دائمًا باستخدام إما let أو const:

              أفضِّل const. يمكنك استخدامه عندما لا يغير المتغير قيمته أبدًا. بمعنى آخر: يجب ألا يكون المتغير هو الجانب الأيسر من الإسناد أو المعامل ++ أو -. يُسمح بتغيير كائن يشير إليه متغير const:

            يمكنك حتى استخدام const في حلقة for-of ، لأنه يتم إنشاء ارتباط واحد (ثابت) لكل تكرار حلقة:

            داخل جسم الحلقة for-of ، يمكن تغيير x & # x2019t.

            إذا اتبعت هذه القواعد ، فستظهر var فقط في الكود القديم ، كإشارة إلى أن إعادة البناء بعناية مطلوبة.

            var يفعل شيئًا واحدًا لا يسمح لـ & # x2019t: المتغيرات المعلنة من خلاله تصبح خصائص الكائن العام. ومع ذلك ، فإن هذا & # x2019s بشكل عام ليس بالأمر الجيد. يمكنك تحقيق نفس التأثير من خلال التخصيص للنافذة (في المتصفحات) أو العمومية (في Node.js).

            9.9.1 نهج بديل #

            بديل لقواعد النمط المذكورة للتو هو استخدام const فقط للأشياء غير القابلة للتغيير تمامًا (القيم الأولية والأشياء المجمدة). ثم لدينا طريقتان:


            شاهد الفيديو: الجبر: المتغيرات والعبارات الجبريه (شهر اكتوبر 2021).