括號插入

塊狀的積木。舉例來說,如果您看到下列區塊,假設 -(5 + 2) 不是 -5 + 2,因為 52 屬於一個區塊,且 - 屬於另一個區塊。

代表 -(5 + 2) 的區塊

但如果在每個區塊前後加上括號,程式碼會變得較不易閱讀。比較「(((5) * (2)) + (3))」和「5 * 2 + 3」。這兩個運算式都會評估相同項目 (13),但第二個運算式更容易讀取。

Blockly 的運算子優先順序規則可協助您產生最少括號數量的程式碼,以達到最大可讀性。

產生「正確」的輸出內容

如果產生的程式碼不需要清晰易讀,就不用將括號縮到最小。納入每個區塊是很好的做法,可確保產生的程式碼一律會正確評估。

為確保正確性,請一律將 Order.ATOMIC 傳遞至 valueToCode 呼叫,並一律從區塊程式碼產生器傳回 Order.NONE

產生最佳括號

只有在產生的程式碼有誤時,才需要插入括號。當外區塊中的運算子優先順序大於內部區塊中的運算子優先順序時,就會發生這種情況。

舉例來說,在下列區塊中,有一個一元否定運算子和一個加法運算子。一元否定的優先順序高於加法運算子。

否定

因此,如果您沒有加上括號,您就會得到 -5 + 2,而 - 會在 + 之前評估,但這與區塊不符。

您可以告知產生器,告知產生器何時應插入括號,方法是說明不同運算子的強度。如果系統發現外運算子比內部運算子更強,則會插入括號來保護內部運算子。

valueToCode 的優先順序高於外運算子,而傳回元組則指定內部運算子的優先順序。

以下是包含兩個運算子的區塊範例:

包含一元否定運算子、加法運算子和子項區塊的區塊。

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];

訂單列舉

每個語言產生器模組都會定義 Order 列舉,其中包含該語言的所有優先順序。

優先順序越大,備份值越低,優先順序越低則備份值越高。您可以將強力優先順序視為力量「較高」,優先順序較低,優先順序「較低」,就像是競爭者一樣。

以下是所有內建語言的 Order 列舉:

特殊優先順序

在產生器的 Order 列舉中,多數優先順序符合各自的文字語言定義的優先順序。但有 Order.ATOMICOrder.NONE 這兩個特殊優先順序。

Order.ATOMIC 的優先順序最高。用於下列情況:

Order.NONE 是最弱的優先順序。用於下列情況:

  • 建議您確保程式碼一律位於括號內,以便從區塊程式碼產生器傳回。
  • 內部區塊沒有運算子在執行操作,因此您會將其傳送至 valueToCode