包命名空间
包文件夹
包是一种特殊文件夹,可以包含类文件夹、函数和类定义文件及其他包。类和函数的名称的作用域限于包文件夹内。包也是一种命名空间,其中的名称必须唯一。函数和类名在包中必须唯一。您可以使用包来组织类和函数。您还可以使用包在不同包中重用类和函数的名称。
注意
在 MATLAB® 7.6 版之前创建的类(即未使用 classdef
的类)不支持包。
包文件夹始终以 +
字符开头。例如,
+mypack +mypack/pkfcn.m % a package function +mypack/@myClass % class folder in a package
顶层包文件夹的父文件夹必须位于 MATLAB 路径上。
列出包的内容
使用 help
命令列出包的内容:
help event
Contents of event: EventData - event.EVENTDATA Base class for event data PropertyEvent - event.PROPERTYEVENT Event data for object property events listener - event.LISTENER Listener object proplistener - event.PROPLISTENER Listener object for property events
您也可以使用 what
命令:
what event
Classes in directory Y:xxx\matlab\toolbox\matlab\lang\+event EventData PropertyEvent listener proplistener
内部包
MathWorks® 将名为 internal
的包保留给 MATLAB 内部代码所用的工具函数使用。属于 internal
包的函数仅供 MathWorks 使用。不建议使用属于 internal
包的函数或类。这些函数和类不能保证在两个版本之间以一致的方式工作。这些函数和类可能会在任何后续版本中从 MATLAB 软件中删除,而不另行通知,也不在产品发行说明中予以记录。
引用包中的包成员
除非导入包,否则对包中的包、函数和类的所有引用都必须使用包名称前缀。(请参阅 导入类。)例如,要调用以下包函数:
+mypack/pkfcn.m
请使用以下语法:
z = mypack.pkfcn(x,y);
定义不使用包前缀。例如,pkfcn.m
函数的函数定义行只包括函数名称:
function z = pkfcn(x,y)
仅使用类名定义包类:
classdef myClass
但是,使用包前缀来调用它:
obj = mypack.myClass(arg1,arg2,...);
调用类方法不需要包名称,因为您有类的对象。您可以使用圆点表示法或函数表示法:
obj.myMethod(arg) myMethod(obj,arg)
静态方法需要完整的类名,其中包括包名称:
mypack.myClass.stMethod(arg)
从包外部引用包成员
包中所含函数、类和其他包的作用域限于该包内。要引用任何包成员,请在成员名称前面加上包名称,并用圆点符隔开。例如,以下语句创建 MyClass
的一个实例,该实例包含在 mypack
包中。
obj = mypack.MyClass;
访问类成员 - 多种场景
本节向您说明如何从包外部访问各种包成员。假设您有包含以下内容的 mypack
包:
+mypack +mypack/myFcn.m +mypack/@MyFirstClass +mypack/@MyFirstClass/myFcn.m +mypack/@MyFirstClass/otherFcn.m +mypack/@MyFirstClass/MyFirstClass.m +mypack/@MySecondClass +mypack/@MySecondClass/MySecondClass.m +mypack/+mysubpack +mypack/+mysubpack/myFcn.m
调用 mypack
中的 myFcn
函数:
mypack.myFcn(arg)
创建 mypack
中每个类的实例:
obj1 = mypack.MyFirstClass; obj2 = mypack.MySecondClass(arg);
调用包 mysubpack
中的 myFcn
函数:
mypack.mysubpack.myFcn(arg1,arg2);
如果 mypack.MyFirstClass
有名为 myFcn
的方法,请以调用对象方法的方式调用它:
obj = mypack.MyFirstClass; myFcn(obj,arg);
如果 mypack.MyFirstClass
有名为 MyProp
的属性,请使用对象结合圆点表示法对其进行赋值:
obj = mypack.MyFirstClass; obj.MyProp = x;
包和 MATLAB 路径
您不能将包文件夹添加到 MATLAB 路径,但是,您必须将包父文件夹添加到 MATLAB 路径。如果包父文件夹不在 MATLAB 路径上,则包成员不可访问,即使包文件夹是当前文件夹也是如此。将包文件夹设为当前文件夹不会将包父文件夹添加到路径中。
包成员的作用域限于该包内。始终使用包名称引用包成员。或者,将包导入调用包成员的函数中,请参阅导入类。
包文件夹不会遮蔽路径上位于其后的包文件夹,但类会遮蔽其他类。如果两个或多个包具有相同的名称,MATLAB 会将它们视为一个包。如果不同路径文件夹中冗余命名的包定义了相同的函数名称,则 MATLAB 只能找到其中一个函数。
解析冗余名称
假设包和类同名。例如:
fldr_1/+foo fldr_2/@foo/foo.m
调用 which foo
将返回可执行类构造函数的路径:
>> which foo fldr_2/@foo/foo.m
函数和包可以有相同的名称。但是,包名称本身不是标识符。因此,如果某个冗余名称单独出现,它标识的将是函数。单独执行包名称会返回错误。
包函数与静态方法
在包和类同名的情况下,包函数优先于静态方法。例如,路径文件夹 fldrA
包含包函数,路径文件夹 fldrB
包含类静态方法:
fldrA/+foo/bar.m % bar is a function in package foo fldrB/@foo/bar.m % bar is a static method of class foo
对 which foo.bar
的调用返回包函数的路径:
which foo.bar
fldrA\+foo\bar.m % package function
如果同一路径文件夹包含同名的包和类文件夹,则包函数类优先于静态方法。
fldr/@foo/bar.m % bar is a static method of class foo fldr/+foo/bar.m % bar is a function in package foo
对 which foo.bar
的调用返回包函数的路径:
which foo.bar
fldr/+foo/bar.m
假设路径文件夹 fldr
包含定义静态方法 bar
的 classdef
文件 foo
,同时还包含包 +foo
(该包包含包函数 bar
)。
fldr/foo.m % bar is a static method of class foo fldr/+foo/bar.m % bar is a function in package foo
对 which foo.bar
的调用返回包函数的路径:
which foo.bar
fldr/+foo/bar.m