简单的名称空间和出色的处理函数
格雷格的选择本周模块——封装MATLAB软件包名称空间模块通过丹尼尔·多兰。
名称空间的概念已经在MATLAB的年。虽然技术很成熟,名称空间的共同特征是不包括在MATLAB实现。你不能从另一个函数调用一个函数在相同的名称空间在相同的名称空间中没有包括名称空间定义的地方。在其他语言中大多数名称空间允许函数调用命名空间中的每个其他无需识别名称空间。
丹尼尔的“模块”功能提供了一个有趣的方法来解决约束使用的方法,展示了强大的概念在MATLAB函数处理。
丹尼尔的本质的解决方案还提供了一种方法来创建名称空间说明符,无需不断引用完整的名称空间。
最后丹尼尔可以有一个所谓“动态名称空间”。
我选择这个提交,因为它展示了强大的特性函数处理,广告在MATLAB中使用名称空间,并使用“DBSTACK”功能的方式使我很吃惊。
内容
在你使用这个函数之前,一定要修复bug
是的,它会发生。有什么似乎是一个bug提交这个文件交换。改变行110年从
根= sprintf (“% s”。根{:});
来
根= sprintf (“% s”。根{结束:1:1});
的顺序包名称空间正在建设落后。改变这条线反转的建设和解决这个问题。
名称空间是什么?
如果你不熟悉名称空间,不要烦恼。这是一种先进的软件工程的概念。我与很多世界各地的软件工程师,和他们中的很多人都不熟悉名称空间,因为他们在编程语言或工作环境,不让他们(比如C)。
一个名称空间提供了一个独特专门调用功能意味着共享相同的名称。我喜欢把一个名称空间作为一个函数的上下文或分类器。
假设你有两个函数,每个命名为“myDisp”,但他们有不同的行为。
> > myDisp (“你好”)
我显示1你好
与
> > myDisp (“你好”)
我的显示2 - - - - - - - - - - - - -你好
如何调用适当的呢myDisp在正确的时间吗?
或许你可以给函数不同的名称:myDisp和myDisp2。
但是如果你担心模块化,这些函数是独立使用的其他项目和代码文件,改变函数的名称将是有问题的。
如果相反,你可能包括一个标识符,让的myDisp更具体的函数?
> > myFirstNamespace.myDisp (“你好”)> > myOtherNamespace.myDisp (“你好”)
现在这两个功能可用,不引入一个名称冲突,或者需要改变的函数的名称。
在MATLAB来完成这项工作,你需要使用包文件夹
名称空间的挑战了
虽然名称空间提供了一种更具体的函数调用,可以方便的时候写出来,和阅读代码文件。尤其是在名称空间变长了。
> > myMainNamespace.myOtherSubNamespace.myOtherNamespace.myDisp (“你好”)
这似乎很难读,写和疼痛。
我们可以使用进口函数来处理:
> >进口myMainNamespace.mySubNamespace.myFirstNamespace。* > > myDisp (“你好”)
我显示1你好
现在myFirstNamespace内容可以不使用完整的名称空间引用符号。但是如果你导入两个函数具有相同名称但住在不同的命名空间,你回名称空间解决的同样的问题!你可以部分导入的命名空间,但这就乏味。
模块做什么?
模块功能可以引用名称空间的功能本质上为名称空间提供一个别名。这意味着您可以参考函数名称空间深处,而不需要写出完整的名称空间,或使用导入功能的潜在冲突问题。
> > myLocalSpace =模块(“myMainNamespace.mySubNamespace.myFirstNamespace”);> > myLocalSpace.myDisp (“你好”)
> > myOtherLocalSpace =模块(“myMainNamespace.myOtherSubNamespace.myOtherNamespace”);> > myOtherLocalSpace.myDisp (“你好”)
这是调用函数的名称空间简洁具体所需的功能。
这也允许你做有趣的事情使名称空间动态
如果(< b) myLocalSpace =模块(“myMainNamespace.mySubNamespace.myFirstNamespace”);其他的myLocalSpace =模块(“myMainNamespace.myOtherSubNamespace.myOtherNamespace”);结束myLocalSpace.myDisp (“你好”)
我不能说在这一点上是否有动态名称空间是一个好主意,但它肯定是一个有趣的概念。
MATLAB的名称空间自参照约束呢?
在MATLAB中,如果一个函数在一个名称空间中调用另一个函数在相同的名称空间,它必须参考的完整名称空间函数被调用。
函数myDisp (displayInput) displayHeader = myMainNamespace.myOtherSubNamespace.myOtherNamespace.otherFunction;disp (displayHeader);disp (displayInput);结束
这是很好,直到后来在另一位家长当你包装现有的命名空间名称空间,你必须进入所有的功能和附加新的母公司的名称空间。如果你有成百上千的功能,这将快速变老。
丹尼尔真的提供了一个整洁的机制来绕过这个限制。调用模块没有输入假定你想要的名称空间是相对于当前函数。
函数myDisp (displayInput) localNamespace =模块;displayHeader = localNamespace.otherFunction ();disp (displayHeader);disp (displayInput);结束
现在,即使名称空间的结构改变,你仍然可以本地调用的函数名称空间,因为本地名称空间时自动更新myDisp函数被调用。
这都是关于函数处理
这是我认为很优雅。
为了使这项工作,丹尼尔利用函数处理。处理函数是函数指针或别名。这意味着您可以使用一个变量来存储函数的引用。
丹尼尔这些函数处理通过创建函数创建了一个集合处理的函数在一个特定的包文件夹。然后,他将这些函数句柄存储在一个MATLAB结构。Subreferencing的结构使用点符号(struct.field)现在将像引用一个函数在一个名称空间中。有多酷!
最后,为了解决约束MATLAB函数强加在一个名称空间引用其他函数在相同的名称空间中,丹尼尔使用DBSTACK函数。
我敢肯定他是在方式中使用DBSTACK从来没有计划,但我认为这是绝对的!
丹尼尔使用DBSTACK函数来确定函数调用模块,所以他可以找出函数属于命名空间。
虽然可能会有一些从使用DBSTACK性能影响,它是一个很好的演示MATLAB环境的灵活性。你可以问一个函数“谁给你打电话?“我已经使用MATLAB超过15年了,我不知道你能做的!
评论
如果你想留下任何评论关于这篇文章,请点击在这里。
- 类别:
- 选择
评论
留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。