创建命名空间
命名空间是特殊的文件夹,可以包含类文件夹、类定义文件、函数文件和其他命名空间(称为内部命名空间)。使用命名空间有助于组织代码并为其中包含的项创建更稳健的名称。函数和类名称在给定命名空间内必须唯一。函数和类的作用域限定在命名空间内,因此您可以在不同命名空间中重用这些名称。
命名空间文件夹
通过在文件夹名称的开头添加 +
字符来定义命名空间。例如,命名空间文件夹 +mynamesp
包含类、枚举类、函数、内部命名空间以及内部命名空间内的类文件夹中的第二个类。
+mynamesp +mynamesp/MyClass.m +mynamesp/WeekdaysEnum.m +mynamesp/myFunction.m +mynamesp/+innernamesp/@MySecondClass/MySecondClass.m
注意
此文件夹层次结构仅作为示例。它不是 MATLAB® 安装的一部分。要体验该功能,请在您自己的路径中定义这些文件夹和代码。
要使命名空间文件夹可被 MATLAB 访问,命名空间文件夹的父文件夹必须在路径中。尝试将命名空间文件夹本身添加到路径会导致错误。有关详细信息,请参阅命名空间和 MATLAB 路径。
在命名空间中定义代码
像定义任何其他代码一样定义命名空间的成员。不要在定义中包含命名空间名称。例如,在命名空间文件夹中显示的示例层次结构中,myFunction
的定义仅包含函数名称。
function z = myFunction(x) ... end
同样,MyClass
的定义仅包含类名称。
classdef MyClass ... end
引用命名空间成员
要引用大多数命名空间成员,请在成员名称的开头添加命名空间名称,后跟一个点。例如,以下语句创建 mynamesp
中包含的 MyClass
的一个实例。(请参阅命名空间文件夹中显示的示例层次结构。)
obj = mynamesp.MyClass(arg1,arg2);
对在命名空间中定义的代码的调用(即使该调用位于命名空间内)必须包含命名空间名称。例如,如果 myFunction
被 MyClass
用作属性验证函数,则函数名称必须包含命名空间。
classdef MyClass properties myProp {mynamesp.myFunction} end end
为了简化外部对命名空间代码的访问,您可以从命名空间导入代码。调用导入的代码不需要命名空间名称。有关详细信息,请参阅将命名空间成员导入函数。
类文件夹
当类在类文件夹(@ 文件夹)中定义时,类文件夹名称不是命名空间名称的一部分。例如,构造 MySecondClass
的对象使用以下语法。
obj = mynamesp.innernamesp.MySecondClass(arg1,arg2);
方法
调用类的非静态方法不需要命名空间名称,因为您有该类的对象,该对象的作用域已限定为命名空间。调用 MyClass
的实例 obj
的 myMethod
方法遵循通常的语法。
obj.myMethod(arg) myMethod(obj,arg)
静态方法始终需要完整的类名称和命名空间。
mynamesp.myClass.stMethod(arg)
属性
与非静态方法一样,您可以访问实例的公共属性而无需使用完整命名空间。但是,访问类的常量属性而不使用该类的特定实例需要完整命名空间。例如,如果 MyClass
定义常量属性 ConstProp
,则使用完整命名空间访问它。
x = mynamesp.MyClass.ConstProp;
如果您已有 MyClass
的实例,则可以在不使用完整命名空间的情况下访问 ConstProp
。
y = mynamesp.MyClass; c = y.ConstProp;
枚举
要引用命名空间中的枚举成员,请使用完整命名空间名称。例如,这是 mynamesp
内部 WeekdaysEnum
的一个可能的定义。
classdef WeekdaysEnum enumeration Monday, Tuesday, Wednesday, Thursday, Friday end end
使用完整命名空间将枚举成员 Monday
赋给变量。
day = mynamesp.WeekdaysEnum.Monday;
命名空间和 MATLAB 路径
您必须将顶层命名空间的父文件夹添加到 MATLAB 路径才能调用命名空间中的代码。如果父文件夹不在 MATLAB 路径上,则命名空间成员不可访问,即使命名空间文件夹是当前文件夹也是如此。
MATLAB 如何处理重复名称
同名的命名空间
命名空间文件夹不优先于路径中后面位置的同名的其他命名空间文件夹。如果两个或多个顶层命名空间同名,MATLAB 将它们视为一个命名空间。如果不同路径文件夹中同名的两个命名空间定义相同的函数名称,则 MATLAB 只能找到其中一个函数。
命名空间函数和静态方法
当命名空间函数和静态方法同名时,命名空间函数优先于静态方法。例如,路径文件夹 fldrA
包含命名空间函数 bar
,路径文件夹 fldrB
包含类 foo
的静态方法 bar
。
fldrA/+foo/bar.m % bar is a function in namespace foo fldrB/@foo/bar.m % bar is a static method of class foo
使用 which
命令可显示命名空间函数具有优先权。
which foo.bar
fldrA\+foo\bar.m
internal
命名空间
MathWorks® 保留对名为 internal
的命名空间的使用。名为 internal
的命名空间中包含的代码仅供 MathWorks 使用,不推荐使用此代码。此代码无法保证在不同版本之间以一致的方式工作。这些函数和类中的任一项都可能在后续版本中从 MATLAB 软件中删除,恕不另行通知。