Đôi khi, trình tạo mã khối cần tham chiếu mã của bên trong chặn nhiều lần.
Ví dụ: nếu bạn có một khối nhận phần tử cuối cùng của một danh sách, bạn cần để truy cập vào mã danh sách nhiều lần:
// Incorrect block-code generator.
javascriptGenerator.forBlock['last_element'] = function(block, generator) {
const listCode = generator.valueToCode(block, 'LIST', Order.MEMBER);
// listCode gets referenced twice.
const code = `${listCode}[${listCode}.length - 1]`;
return [code, Order.MEMBER];
}
Nhưng điều này có thể gây ra sự cố nếu giá trị kết quả của mã của khối bên trong là không nhất quán hoặc có tác dụng phụ. Ví dụ: nếu mã bên trong thực sự là một lệnh gọi hàm, mã cụ thể này có thể kết thúc với điều kiện nằm ngoài dải ô:
randomList()[randomList().length - 1]
Việc sử dụng các hàm hiệu dụng giúp bạn đảm bảo rằng các khối bên trong mã chỉ là đánh giá một lần.
Hàm hiệu dụng
Hàm hiệu dụng là hàm do nhà phát triển định nghĩa có trong chuỗi mã đã tạo. Bạn có thể sử dụng chúng để đảm bảo rằng mã khối bên trong chỉ được đánh giá một lần và sau đó giá trị có thể được tham chiếu nhiều lần.
import {javascriptGenerator, Order} from 'blockly/javascript';
// Correct block-code generator.
javascriptGenerator.forBlock['last_element'] = function(block, generator) {
const listCode = generator.valueToCode(block, 'LIST', Order.NONE);
const functionName = generator.provideFunction_(
'list_lastElement',
[
`function ${generator.FUNCTION_NAME_PLACEHOLDER_}(list) {`,
` return list[list.length - 1];`,
`}`
]
);
// listCode only gets evaluated once.
const code = `${functionName}(${listCode})`;
return [code, Order.FUNCTION_CALL];
}
Cung cấp hàm
Bạn có thể định nghĩa các hàm hiệu dụng bên trong trình tạo mã khối bằng cách sử dụng
provideFunction_
. Tên này sẽ lấy tên bạn muốn dùng cho hàm số hiệu dụng của mình, và
một mảng chuỗi mã xác định chức năng của hàm. Phương thức này trả về
tên kết quả của hàm hiệu dụng, sau khi (có thể) sửa đổi hàm đó thành không
xung đột với các hàm do người dùng xác định.
provideFunction_
cũng loại bỏ các định nghĩa hàm hiệu dụng, để mỗi
hàm hiệu dụng chỉ tồn tại một lần, ngay cả khi loại khối xác định hàm đó
nhiều lần.
Cập nhật các mức độ ưu tiên
Khi xác định một hàm hiệu dụng, bạn cũng nên cập nhật các mức độ ưu tiên (xác định cách chèn dấu ngoặc đơn) vào trình tạo mã khối.
Mức độ ưu tiên luôn dựa trên chuỗi mã do mã khối trả về
. Lớp này không quan tâm đến các toán tử bên trong hàm số hiệu dụng. Vì vậy, trong
trong ví dụ trước, lệnh gọi valueToCode
đã được thay đổi thành Order.NONE
và
bộ dữ liệu trả về đã được thay đổi thành Order.FUNCTION_CALL
.