• MATLAB 文件夹前面的+和@是干啥的 命名空间与函数的重载


    前言

    当你打开MATLAB的toolbox文件夹时(工具箱存储路径),会发现里面文件夹名称前会有一些奇奇怪怪的符号:

    ???这里面的+@是干啥的???

    为了探究这个问题,我们建立了一个具有如下目录的文件夹:

    当前文件夹──@cell──dispTest.m
            |
            ├──@double──dispTest.m
            |
            ├──+test1──+test2──test.m
            |       |
            |       └──test.m
            |
            └──untitled.m      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    命名空间:路径函数(目录结构体)

    如果想要代码整洁条理,很多情况会把一些同一类的工具函数放在一个单独的文件夹里,即你要调用的函数在当前文件夹内的一个文件夹中,想在当前文件夹直接调用这个函数是做不到的,要咋办?

    很多人会选择直接addpath,但这样的话那些工具函数就不止该项目可以调用,其他位置的其他项目也能调用,这样有可能导致命名冲突。

    那么一个很简单的方法就是将装工具函数的文件夹命名为+fordername的形式,就是前面有个+的形式,实际上就是文件夹路径作为命名空间。

    对于我们前面提出的目录的以下部分:

    当前文件夹──+test1──+test2──test.m
            |       |
            |       └──test.m
            |
            └──untitled.m   
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我想要在untitled.m中调用+test1文件夹中的test.m,就可以直接通过以下代码调用:

    test1.test()
    
    • 1

    当然像目录所示,+test1文件夹里还有个带加号的+test2文件夹,我们想要调用那个文件夹里的
    test.m,就可以通过如下方式:

    test1.test2.test()
    
    • 1

    这种调用格式非常像是在调用结构体里的函数,这也是我将其称为目录结构体的原因。

    函数的重载

    当然接下来就要讲目录的这部分是啥:

    当前文件夹──@cell──dispTest.m
            |
            ├──@double──dispTest.m
            |
            └──untitled.m      
    
    • 1
    • 2
    • 3
    • 4
    • 5

    很像是C++中的函数的重载哈,两个@classname的文件夹中右两个名字完全相同的函数。

    注意这里说的是@加上类名称的格式,可以是MATLAB自带的类,也可以是自己定义的类函数,我们这里就设置了元胞类和双精度类命名的文件夹。

    这么设置有啥用呢?这样设置后,比如我再调用dispTest.m函数的时候,如果输入变量是元胞数组,那么就会调用@cell文件夹里的该函数,如果输入变量是双精度类型,那么就会调用@double文件夹里的函数。

    也就是说以下的两种写法,用的是不同函数:

    dispTest(1)
    
    dispTest({1})
    
    • 1
    • 2
    • 3

    结语

    大概就是这个样子,对于+可以想做结构体,对于@可以想做重载,本人不同文件夹里的函数定义是这样的:

    +test1\test.m

    function test
    disp('欢迎关注slandarer forder1')
    end 
    
    • 1
    • 2
    • 3

    +test1+test2\test.m

    function test
    disp('欢迎关注slandarer forder2')
    end 
    
    • 1
    • 2
    • 3

    @cell\dispTest.m

    function dispTest(coe)
    disp('is cell') 
    end  
    
    • 1
    • 2
    • 3

    @double\dispTest.m

    function dispTest(coe)
    disp('is double') 
    end  
    
    • 1
    • 2
    • 3

    因此在untitled.m中运行如下代码,效果如下:

    test1.test()
    
    test1.test2.test()
    
    dispTest(1)
    
    dispTest({1})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    欢迎关注slandarer forder1
    欢迎关注slandarer forder2
    is double
    is cell

  • 相关阅读:
    钉钉机器人客服系统AI知识库对接
    【华为账号服务】【FAQ】Account Kit常见咨询合集--获取帐号个人信息相关问题
    【NDVI:注意力机制:遥感图像】
    在IDEA中的DeBug调试技巧
    基于深度学习的环路滤波和残差缩放
    【Netty】自定义解码器、编码器、编解码器(十五)
    SpringMVC-----JSR303以及拦截器
    spring-Mvc的基本使用
    python3-循环与条件语句
    Python网络爬虫实战:从入门到进阶
  • 原文地址:https://blog.csdn.net/slandarer/article/details/126017197