Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

包命名空间

包文件夹

包是一种特殊文件夹,可以包含类文件夹、函数和类定义文件及其他包。类和函数的名称的作用域限于包文件夹内。包也是一种命名空间,其中的名称必须唯一。函数和类名在包中必须唯一。您可以使用包来组织类和函数。您还可以使用包在不同包中重用类和函数的名称。

注意

在 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 包含定义静态方法 barclassdef 文件 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 

相关主题