括號插入

封鎖隱含括號。例如,當您看到下列區塊時 假設為 -(5 + 2),而非 -5 + 2,因為 52 屬於 而 - 是另一個區塊的一部分。

代表 -(5 + 2) 的方塊

但如果在每個區塊前後加上括號,程式碼就會大幅減少 。比較「(((5) * (2)) + (3))」與「5 * 2 + 3」。您可以 運算式會得出相同的結果 (13),但第二個運算式更容易 以便閱讀。

Blockly 運算子優先順序規則可協助您以最低值生成程式碼 為求精簡易懂。

生成「正確」輸出

如果產生的程式碼可以不清晰易讀 不必煩惱括號是否令人困擾每個區塊包裝都是不錯的方法 可確保產生的程式碼一律會正確評估。

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

產生最佳括號

只有在產生的程式碼不正確時,才需要插入括號 具體做法是指示 Kubernetes 建立並維護 一或多個代表這些 Pod 的物件如果外部區塊中的運算子優先順序為 基準值高於內部區塊中運算子的優先順序。

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

否定和新增

因此,如果您沒有加入括號,會得到 -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 列舉與優先順序相符 是由各自的文字語言定義而成不過,在 Android 系統和 Google Cloud 優先順序,Order.ATOMICOrder.NONE

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

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

  • 建議您確保程式碼一律採用括號, 讓您從區塊程式碼產生器傳回
  • 內部區塊沒有任何操作者,因此您可以向其傳送 valueToCode