【问题标题】:Calling functions in a nested package调用嵌套包中的函数
【发布时间】:2015-06-15 04:10:14
【问题描述】:

我正在尝试将我的 matlab 代码组织到包中,但在嵌套包函数中必须使用完全限定名称,这让我很受不了。

假设我有一个名为 +myPack 的包,如下所示:

+myPack
    bar.m
    baz.m

bar 函数可能看起来像

function bar()
    myPack.baz()
end

这一切都很好而且合乎逻辑。但是,+myPack 是一个可以在多个其他包中重复使用的组件。假设一个看起来像这样:

+mySuperPack
    foo.m
    +myPack
        bar.m
        baz.m

这一次,fo​​o 调用了 bar,而 bar 又调用了 baz。但是,bar 的原始代码会失败,因为我没有使用完全限定名称

mySuperPack.myPack.baz()

显然 +myPack 不知道它在哪个超级包中,所以我不能这样做。

这也使您无法在包中的类中使用静态方法;该类必须知道它在哪个包中才能调用自己的静态方法,这似乎很疯狂。

有没有办法使用这样的嵌套包,还是我做的包完全错误?

【问题讨论】:

  • 老实说,我认为在多个包中包含相同的子包是错误的,而应该将子包放在同样位于 matlab 路径上的不同文件夹中。

标签: matlab oop


【解决方案1】:

而不是写

mySuperPack.myPack.baz()

你可以写

import mySuperPack.myPack.*
baz()

您只需要编写一次导入语句。不幸的是(这是 MATLAB 真正困扰我的少数事情之一)import 仅导入到当前工作区,因此您需要为每个函数/方法编写一次。

真的希望您可以在文件顶部编写一次,然后将其导入文件中的所有函数,或者在类顶部并导入所有类的方法,但你去。至少总比到处都需要完全限定的名称要好。

PS 关于静态方法的问题:虽然您通常可以将它们称为ClassName.staticMethodNamepkgName.ClassName.staticMethodName,但如果您有该类的对象obj,您也可以使用obj.staticMethodName 来调用它。显然这并不总是相关的,但如果您从普通方法中调用静态方法会很方便,因为您不需要提及(或导入)包。

【讨论】:

  • 对不起,我想你可能误解了一点。我知道我可以使用导入,但问题是我不知道要导入什么。类或包可以包含在任意数量的超级包中,因此方法的完全限定名称在运行时是未知的。这有意义吗?
  • 对不起 - 是的,我误会了。您添加了一条评论,建议更好的方法是不在多个包中包含相同的子包,而是将其放在单独的包中。我同意。嵌套包没有什么问题,但是如果你要重复使用一个包,请将它作为一个单独的包保存,不要将它多次复制到不同的子包中。
  • 我并没有完全复制包并将其粘贴到任何地方,而是使用 SVN 将其添加为外部,我现在认为这是不必要的。感谢您确认我做错了。如果您想为此添加答案,我会接受。