Return jump
Toán tử return
được thiết kế để trả lại quyền điều khiển từ các hàm. Vì tất cả các câu lệnh thực thi đều nằm trong một hàm cụ thể, nó có thể được sử dụng gián tiếp để ngắt các vòng lặp chứa nó như for
, while
, và do
ở bất kỳ mức độ lồng nhau nào. Cần lưu ý rằng không giống như continue
và đặc biệt là break
, tất cả các câu lệnh sau các vòng lặp bị ngắt bên trong hàm cũng sẽ bị bỏ qua.
Cú pháp của toán tử return
:
return ([expression]);
Việc cần chỉ định một biểu thức được xác định bởi chữ ký của hàm (sẽ được thảo luận thêm trong phần liên quan). Để hiểu tổng quát cách hoạt động của return
trong bối cảnh các câu lệnh điều khiển, hãy xem một ví dụ với hàm chính của script là OnStart
. Vì nó thuộc kiểu void
, tức là không trả về gì, toán tử có dạng như sau:
return;
Trong phần về break
, chúng ta đã triển khai một thuật toán để tìm các ký tự trùng lặp trong một chuỗi. Để thoát hai vòng lặp lồng nhau, chúng ta không chỉ sử dụng break
mà còn sửa đổi điều kiện của vòng lặp bên ngoài.
Với toán tử return
, điều này có thể được thực hiện một cách đơn giản hơn (StmtJumpReturn.mq5
).
void OnStart()
{
string s = "Hello, " + Symbol();
const int n = StringLen(s);
for(int i = 0; i < n; ++i)
{
for(int j = i + 1; j < n; ++j)
{
if(s[i] == s[j])
{
PrintFormat("Duplicate: %c", s[i]);
return;
}
}
}
Print("No duplicates");
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Nếu sự bằng nhau được tìm thấy trong toán tử if
, chúng ta hiển thị ký tự và thoát khỏi hàm. Nếu thuật toán này nằm trong một hàm tùy chỉnh khác ngoài OnStart
, chúng ta có thể định nghĩa một kiểu trả về cho nó (ví dụ, ushort
thay vì void
) và truyền ký tự tìm thấy bằng dạng đầy đủ của return
đến mã gọi.
Vì chữ cái đôi 'l' được biết là tồn tại trong chuỗi thử nghiệm, câu lệnh sau các vòng lặp (Print
) sẽ không được thực thi.