Chèn dấu ngoặc đơn

Các khối ngụ ý dấu ngoặc đơn. Ví dụ: khi thấy các khối sau, bạn cho rằng đó là -(5 + 2) chứ không phải -5 + 252 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.

các khối biểu thị -(5 + 2)

Tuy nhiên, nếu bạn đặt dấu ngoặc đơn xung quanh mọi khối, điều này sẽ khiến mã khó đọc hơn nhiều. So sánh (((5) * (2)) + (3)) với 5 * 2 + 3. Cả hai biểu thức này đánh giá cho cùng một điều (13) nhưng biểu thức thứ hai dễ đọc hơn nhiều.

Các quy tắc ưu tiên cho toán tử của Blockly giúp bạn tạo mã với số lượng dấu ngoặc đơn tối thiểu để dễ đọc nhất.

Tạo kết quả "chính xác"

Nếu không cần mã đã tạo có thể đọc được, thì bạn không cần phải lo lắng về việc thu nhỏ dấu ngoặc đơn. Việc bao bọc mỗi khối là một phương pháp hiệu quả 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 độ chính xác, hãy luôn truyền các lệnh gọi Order.ATOMIC đến 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 có dấu ngoặc đơn. Đ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ớn hơn mức ưu tiên của một toán tử trong khối bên trong.

Ví dụ: trong các khối sau, có toán tử phủ định đơn và toán tử cộng. Giá trị phủ định một ngôi có mức độ ưu tiên mạnh hơn toán tử cộng.

âm và phép cộng

Vì vậy, nếu không thêm dấu ngoặc đơn, bạn sẽ nhận được -5 + 2- đượ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 các toán tử. Nếu thấy toán tử bên ngoài mạnh hơn toán tử bên trong, thì hệ thống sẽ chèn dấu ngoặc đơn để bảo vệ toán tử bên trong.

valueToCode có quyền ưu tiên của toán tử bên ngoài và bộ dữ liệu trả về chỉ định mức độ ưu tiên của toán tử bên trong.

Dưới đây là ví dụ về một khối bao gồm hai toán tử:

Một khối có toán tử phủ định đơn, toán tử cộng và khối con.

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 khối bên trong, bạn sẽ chuyển cho nó mức độ ưu tiên của toán tử mạnh nhất hoạt động trên mã của khối bên trong. Đây là toán tử cần bảo vệ mã của khối bên trong.

Ví dụ: trong các khối sau đây, cả toán tử phủ định đơn phân và toán tử cộng đều thao tác trên mã của khối bên trong. Giá trị phủ định đơn nguyên sẽ mạnh hơn, vì vậy, đó là mức độ ưu tiên bạn nên chuyển sang valueToCode.

Một khối có toán tử phủ định đơn, toán tử cộng và khối con.

// 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 được bảo vệ.

Ví dụ: khối sau đây chứa cả toán tử phủ định đơn nhân và toán tử cộng. Phép bổ sung yếu hơn, do đó, đó là mức độ ưu tiên bạn nên trả về từ trình tạo mã khối.

Một khối có toán tử phủ định đơn và một toán tử cộng và không có khối con

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, còn 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 mạnh là những ưu tiên "có thứ hạng cao hơn" và mức độ ưu tiên yếu hơn là "có thứ hạng thấp hơn" – như thể chúng là những máy bay chiến đấu cạnh tranh.

Dưới đây là nơi bạn có thể tìm thấy các enum Order cho tất cả ngôn ngữ tích hợp:

Mức độ ưu tiên đặc biệt

Hầu hết mức độ ưu tiên trong enum Order của trình tạo đều khớp với các mức độ ưu tiên được xác định theo ngôn ngữ dựa trên văn bản tương ứng. Tuy nhiên, có hai lựa chọn ưu tiên đặc biệt là Order.ATOMICOrder.NONE.

Order.ATOMIC là mức độ ưu tiên mạnh nhất. Hàm này được sử dụng khi:

  • Bạn cần đảm bảo mã luôn có giá trị trong ngoặc, vì vậy bạn sẽ truyền mã này đế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ề khối đó từ trình tạo mã khối.

Order.NONE là mức độ ưu tiên yếu nhất. Hàm này được sử dụng khi: