חסימות מרמזות על סוגריים. לדוגמה, כשרואים את הבלוקים הבאים,
נניח שהמשמעות היא -(5 + 2)
לא -5 + 2
כי 5
ו-2
הם חלק מ-
בלוק אחד, וה--
הוא חלק מבלוק אחר.
אבל אם מוסיפים סוגריים מסביב לכל בלוק, הקוד הרבה יותר קטן
קריא. השוואה בין (((5) * (2)) + (3))
לבין 5 * 2 + 3
. גם וגם
מעריכים את אותם הדברים (13
), אבל ההבדל השני קל יותר
לקריאה.
כללי הקדימות של האופרטורים של Blockly עוזרים ליצור קוד בכמות המינימלית מספר סוגריים, כדי להקל על הקריאה.
יצירת תשובה נכונה פלט
אם אתם לא צריכים שהקוד שנוצר יהיה קריא לאנשים, אין צורך לחשוש מהקטנת הסוגריים. לעטוף כל בלוק הוא גישה מצוינת, והוא מבטיח שהקוד שנוצר תמיד ייבדק בצורה נכונה.
כדי להבטיח את הדיוק, תמיד צריך להעביר את השיחות Order.ATOMIC
אל valueToCode
, וגם
תמיד צריך להחזיר Order.NONE
ממחולל הבלוקים שלכם.
יצירת סוגריים אופטימליים
צריך להוסיף סוגריים רק אם הקוד שנוצר שגוי בלי אותם. מצב זה מתרחש כשהקדימות של אופרטור בבלוק החיצוני היא גבוהה יותר מהקדימות של אופרטור בבלוק הפנימי.
לדוגמה, בבלוקים הבאים יש אופרטור שלילה אונרית אופרטור ההוספה. לשלילה אונארית יש קדימות חזקה יותר אופרטור הוספת.
לכן, אם לא מוסיפים סוגריים, מקבלים -5 + 2
, והמערכת מעריכה את -
לפני +
, שלא תואם לבלוקים.
אפשר להורות למחולל מתי להוסיף סוגריים עגולים ולומר לו עד כמה האופרטורים השונים שלכם. אם רואים שהאופרטור החיצוני חזק אבל מוסיפה סוגריים כדי להגן על האופרטור הפנימי.
valueToCode
מקבל עדיפות על פני האופרטור החיצוני וההחזרה
tuple מציין את הקדימות של האופרטור הפנימי.
הנה דוגמה לבלוק שכולל שני אופרטורים:
import {javascriptGenerator, Order} from 'blockly/javascript';
javascriptGenerator.forBlock['negate_plus_two'] = function(block, generator) {
// valueToCode takes in the precedence of the outer operator.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;
// The return tuple specifies the precedence of the inner operator.
return [code, Order.ADDITION];
}
קדימות של valueToCode
כשקוראים לפונקציה valueToCode
כדי ליצור את הקוד של בלוק פנימי, מעבירים אותו
את הקדימות של האופרטור החזקה ביותר שפועל על הקוד של הרכיב הפנימי
חסימה. זהו האופרטור שצריך להגן מפניו על הקוד של הבלוק הפנימי.
לדוגמה, בבלוקים הבאים גם אופרטור השלילה הלא-נורית וגם
פועלים על הקוד של הבלוק הפנימי. שלילה אונרית
גבוהה יותר, ולכן זו העדיפות שצריך להעביר ל-valueToCode
.
// The - is the strongest operator acting on the inner code.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;
החזרת קדימות
כשמחזירים קדימות ממחולל הבלוקים, מוחזרים קדימות של האופרטור החלש ביותר בקוד של הבלוק. כאן שנדרשת להגנה עליו.
לדוגמה, הבלוק הבא מכיל גם אופרטור שלילה אונרית וגם אופרטור הוספת. ההוספה חלשה יותר, לכן זו העדיפות שצריך ממחולל הבלוקים.
const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];
הזמנה של enum
כל מודול של מחולל השפה מגדיר enum של Order
שכולל את כל
את הקדימות לשפה הזו.
קדימות גבוהה יותר כוללת ערכי גיבוי נמוכים יותר, וקדימות חלשות יותר ערכי גיבוי גבוהים יותר. אפשר לחשוב על קדימות חזקה בתור "דירוג גבוהה יותר" חוזק וקדימות חלשות יותר כ"דירוג נמוך יותר" - כאילו הם היו לוחמים תחרותיים.
כאן אפשר למצוא את טיפוסי ה-enum של Order
לכל השפות המובנות:
קדימות מיוחדת
רוב הקדימות של המחוללים Order
enums תואמים לקדימות
מוגדרים לפי שפות הטקסט המתאימות. אבל יש שני תרחישים מיוחדים
קדימות, Order.ATOMIC
ו-Order.NONE
.
Order.ATOMIC
הוא העדיפות החזקה ביותר. משתמשים בה כאשר:
- אתם רוצים לוודא שהקוד תמיד מופיע בסוגריים,
אז מעבירים אותה אל
valueToCode
. - החסימה לא כוללת אופרטורים, לכן אתה מחזיר אותה מה עם מחולל קוד בלוקים.
Order.NONE
הוא העדיפות החלשה ביותר. משתמשים בה כאשר:
- אתם רוצים לוודא שהקוד תמיד מופיע בסוגריים, כדי להחזיר אותו ממחולל הבלוקים של קוד.
- אין אופרטורים שפועלים על מחסום פנימי, לכן אתם מעבירים אותו
valueToCode