Khối ngụ ý dấu ngoặc đơn. Ví dụ: khi thấy các khối sau, bạn
giả sử nó có nghĩa là -(5 + 2)
chứ không phải -5 + 2
vì 5
và 2
là một phần của
một khối và -
là một phần của một khối khác.
Nhưng nếu bạn đặt dấu ngoặc đơn xung quanh mỗi khối, mã sẽ trở nên ít hơn
dễ đọc hơn. So sánh (((5) * (2)) + (3))
với 5 * 2 + 3
. Cả hai thuộc tính này
biểu thức đánh giá theo cùng một thứ (13
) nhưng biểu thức thứ hai dễ hơn nhiều
để đọc.
Các quy tắc ưu tiên toán tử của Blockly giúp bạn tạo mã với mức tối thiểu số lượng dấu ngoặc đơn để có thể đọc tối đa.
Tạo ra nội dung "chính xác" đầu ra
Nếu không cần mã đã tạo ở dạng dễ đọc, thì không cần phải lo lắng về việc giảm thiểu dấu ngoặc đơn. Việc bao bọc mọi khối là một phương pháp hay, và đảm bảo rằng mã đã tạo của bạn luôn được đánh giá chính xác.
Để đảm bảo tính chính xác, hãy luôn truyền Order.ATOMIC
đến các lệnh gọi valueToCode
và
luôn trả về Order.NONE
từ trình tạo mã khối.
Tạo dấu ngoặc đơn tối ưu
Bạn chỉ cần chèn dấu ngoặc đơn nếu mã được tạo không chính xác nếu không chúng. Điều này xảy ra khi mức độ ưu tiên của một toán tử trong khối bên ngoài là mạnh hơn mức ưu tiên của toán tử trong khối bên trong.
Ví dụ: trong các khối sau, có một toán tử phủ định một ngôi và một toán tử toán tử cộng. Hàm phủ định đơn nhất có mức độ ưu tiên mạnh hơn so với toán tử cộng.
Vì vậy, nếu không thêm dấu ngoặc đơn, bạn sẽ nhận được -5 + 2
và -
sẽ được đánh giá
trước +
, không khớp với các khối.
Bạn có thể cho trình tạo biết thời điểm chèn dấu ngoặc đơn bằng cách cho trình tạo biết độ mạnh của dấu ngoặc đơn các toán tử khác nhau. Nếu thấy toán tử bên ngoài mạnh hơn so với toán tử bên trong, nó sẽ chèn dấu ngoặc đơn để bảo vệ toán tử bên trong.
valueToCode
sẽ được ưu tiên của toán tử bên ngoài và kết quả trả về
bộ dữ liệu chỉ định mức độ ưu tiên của toán tử bên trong.
Sau đây là ví dụ về một khối bao gồm 2 toán tử:
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];
}
Mức độ ưu tiên valueToCode
Khi gọi valueToCode
để tạo mã của một khối bên trong, bạn truyền vào đó
mức độ ưu tiên của toán tử mạnh nhất tác động trên mã của toán tử bên trong
chặn. Đây là toán tử mà mã của khối bên trong cần được bảo vệ.
Ví dụ: trong các khối sau, cả toán tử phủ định một ngôi và toán tử
toán tử cộng đang thao tác trên mã của khối bên trong. Phủ định một ngôi
mạnh hơn, vì vậy, đó là mức độ ưu tiên bạn nên truyền đến valueToCode
.
// The - is the strongest operator acting on the inner code.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;
Ưu tiên trả về
Khi bạn trả về một mức độ ưu tiên từ trình tạo mã khối, hãy trả về mức độ ưu tiên của toán tử yếu nhất trong mã của khối. Đây là toán tử cần bảo vệ.
Ví dụ: khối sau chứa cả toán tử phủ định một ngôi và toán tử cộng. Phép cộng yếu hơn, vì vậy đó là ưu tiên bạn nên trả về từ trình tạo mã khối.
const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];
Enum thứ tự
Mỗi mô-đun trình tạo ngôn ngữ đều xác định một enum Order
bao gồm tất cả
các mức độ ưu tiên cho ngôn ngữ đó.
Mức độ ưu tiên mạnh hơn có giá trị sao lưu thấp hơn và mức độ ưu tiên yếu hơn có giá trị sao lưu cao hơn. Bạn có thể coi mức độ ưu tiên cao là "được xếp hạng cao hơn" về độ mạnh và được ưu tiên yếu hơn do "bị xếp hạng thấp hơn" - như thể chúng đều là những đấu sĩ cạnh tranh.
Đây là nơi bạn có thể tìm thấy enum Order
cho tất cả ngôn ngữ tích hợp sẵn:
Mức độ ưu tiên đặc biệt
Hầu hết các mức độ ưu tiên trong trình tạo Order
enum khớp với mức độ ưu tiên
theo các ngôn ngữ dựa trên văn bản tương ứng. Nhưng có hai điều đặc biệt
Order.ATOMIC
và Order.NONE
.
Order.ATOMIC
là mức độ ưu tiên mạnh nhất. Trường này được dùng khi:
- Bạn muốn đảm bảo mã luôn nằm trong ngoặc đơn,
để bạn truyền nó đến
valueToCode
. - Khối của bạn không bao gồm bất kỳ toán tử nào, vì vậy, bạn trả về toán tử từ khối trình tạo mã khối.
Order.NONE
là mức độ ưu tiên yếu nhất. Trường này được dùng khi:
- Bạn muốn đảm bảo mã luôn nằm trong ngoặc đơn, để bạn trả về mã từ trình tạo mã khối.
- Không có toán tử nào hoạt động trên khối bên trong, vì vậy bạn truyền khối này vào
valueToCode
.