塊狀的積木。舉例來說,如果您看到下列區塊,假設 -(5 + 2)
不是 -5 + 2
,因為 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.ATOMIC
和 Order.NONE
這兩個特殊優先順序。
Order.ATOMIC
的優先順序最高。用於下列情況:
- 建議您確保程式碼一律為父項大小,因此請傳遞至
valueToCode
。 - 您的區塊不含任何運算子,因此可從區塊程式碼產生器傳回。
Order.NONE
是最弱的優先順序。用於下列情況:
- 建議您確保程式碼一律位於括號內,以便從區塊程式碼產生器傳回。
- 內部區塊沒有運算子在執行操作,因此您會將其傳送至
valueToCode
。