Hàm đầu tiên trong tệp m (tức là hàm chính ), được gọi khi tệp m đó được gọi. Không yêu cầu chức năng chính có cùng tên với tập tin m, nhưng để rõ ràng thì nên . Khi chức năng và tên tệp khác nhau, tên tệp phải được sử dụng để gọi chức năng chính.
Tất cả các hàm tiếp theo trong tệp m, được gọi là hàm cục bộ (hoặc "hàm con" trong thuật ngữ cũ), chỉ có thể được gọi bởi hàm chính và các hàm cục bộ khác trong tệp m đó. Các hàm trong các tệp m khác không thể gọi chúng. Bắt đầu từ R2016b, bạn cũng có thể thêm các hàm cục bộ vào tập lệnh , mặc dù hành vi phạm vi vẫn giống nhau (nghĩa là chúng chỉ có thể được gọi từ bên trong tập lệnh).
Ngoài ra, bạn cũng có thể khai báo các hàm trong các hàm khác. Chúng được gọi là các hàm lồng nhau và chúng chỉ có thể được gọi từ bên trong hàm chúng được lồng. Họ cũng có thể có quyền truy cập vào các biến trong các hàm mà chúng được lồng vào nhau, điều này làm cho chúng khá hữu ích mặc dù hơi khó để làm việc với chúng.
Thêm thức ăn cho suy nghĩ ...
Có một số cách xung quanh hành vi phạm vi chức năng bình thường được nêu ở trên, chẳng hạn như chuyển hàm xử lý như các đối số đầu ra như được đề cập trong câu trả lời từ SCFbler và Jonas (bắt đầu từ R2013b, được hỗ trợ bởi localfunctions
chức năng). Tuy nhiên, tôi không khuyên bạn nên tạo thói quen sử dụng các thủ thuật như vậy, vì có thể có nhiều lựa chọn tốt hơn để tổ chức các chức năng và tệp của bạn.
Ví dụ, giả sử bạn có một chức năng chính A
trong một m-file A.m
, cùng với chức năng địa phương D
, E
và F
. Bây giờ giả sử bạn có hai chức năng khác có liên quan B
và C
trong m-file B.m
và C.m
, tương ứng, mà bạn cũng muốn để có thể gọi D
, E
và F
. Dưới đây là một số tùy chọn bạn có:
Đặt D
, E
và F
mỗi năm riêng riêng m-file của họ, cho phép bất kỳ chức năng khác để gọi cho họ. Nhược điểm là phạm vi của các chức năng này là lớn và không bị giới hạn chỉ A
, B
và C
, nhưng xu hướng tăng là điều này khá đơn giản.
Tạo một defineMyFunctions
m-file (như trong Jonas' chẳng hạn) với D
, E
và F
như các chức năng địa phương và một chức năng chính mà chỉ đơn giản là lợi nhuận hoạt động xử lý đối với họ. Điều này cho phép bạn để giữ D
, E
và F
trong cùng một tập tin, nhưng nó không làm bất cứ điều gì liên quan đến phạm vi của các chức năng này từ bất kỳ chức năng mà có thể gọi defineMyFunctions
có thể gọi họ. Sau đó, bạn cũng phải lo lắng về việc chuyển các hàm xử lý xung quanh thành đối số để đảm bảo bạn có chúng ở nơi bạn cần chúng.
Sao chép D
, E
và F
vào B.m
và C.m
như các chức năng địa phương. Điều này giới hạn phạm vi sử dụng của chúng chỉ A
, B
và C
, nhưng làm cho việc cập nhật và bảo trì mã của bạn trở thành một cơn ác mộng vì bạn có ba bản sao của cùng một mã ở những nơi khác nhau.
Sử dụng các chức năng riêng tư ! Nếu bạn có A
, B
và C
trong cùng thư mục, bạn có thể tạo một thư mục con gọi private
và địa điểm D
, E
và F
trong đó, mỗi khi một m-file riêng biệt. Điều này giới hạn phạm vi của họ để họ chỉ có thể được gọi bằng chức năng trong thư mục ngay trên (ví dụ A
, B
và C
) và giữ chúng lại với nhau trong cùng một vị trí (nhưng vẫn khác nhau m-files):
myDirectory/
A.m
B.m
C.m
private/
D.m
E.m
F.m
Tất cả điều này nằm ngoài phạm vi câu hỏi của bạn và có thể chi tiết hơn bạn cần, nhưng tôi nghĩ có lẽ sẽ tốt khi chạm vào mối quan tâm chung hơn về việc tổ chức tất cả các tệp m của bạn. ;)
^
, @idigas