知乎视频​www.zhihu.com

MATLAB的一个函数文件里面, 开头第一个函数是可以被外部调用的, 而其他函数是无法直接被外部调用的, MATLAB称之为局部函数.

如果用OOP的术语来说, 开头第一个函数可以被称为public函数, 其他函数可以被称为private函数.

举个例子:

function vals = computeEllipseVals(a, b)
e = computeEccentricity(a, b);
f = computeFocus(a, b);
ae = computeArea(a, b);
vals = e + f + ae;
% fh = localfunctions;
endfunction e = computeEccentricity(a, b)
f = computeFocus(a,b);
e = f/a;
endfunction f = computeFocus(a, b)
f = sqrt(a^2-b^2);
endfunction ae = computeArea(a, b)
ae = pi*a*b;
end

试图调用这四个函数:

结果是符合预期的, 第一个函数式public函数, 可以被外部调用, 而其他3个, 是private函数, 不能被外部调用, 只能被第一个函数调用.

有句话说得好, 计划赶不上变化.

原先定义那些private函数, 预期是不会被外部调用的. 但是, 需求发生了变化, 现在想要外面调用其中某个private函数了, 怎么办呢?

最简单的方法, 我相信每个人都能想到的: 将那个private函数复制出来, 生成一个新的函数文件, 这样的话, 那个private函数就成为了public函数了.

这样做当然是可以的, 但在我看来, 不够优雅, 至少有3个缺点:

1 复制出来的那个函数有可能调用了其他的private函数, 你很可能少复制了.

比如computeEccentricity函数调用了computeFocus函数.

2 多了一个文件.

文件越多, 维护起来成本越高.

3 同一个函数存在了两个版本了.

刚刚复制到外部的时候, 确实这两个版本是一模一样的, 但是以后可能会修改其中一个, 忘了修改另一个, 这是bug的主要来源之一.

现在向大家介绍一个优雅, 安全的做法: 利用localfunctions函数

function [vals, fh] = computeEllipseVals(a, b)
e = computeEccentricity(a, b);
f = computeFocus(a, b);
ae = computeArea(a, b);
vals = e + f + ae;
fh = localfunctions;
endfunction e = computeEccentricity(a, b)
f = computeFocus(a,b);
e = f/a;
endfunction f = computeFocus(a, b)
f = sqrt(a^2-b^2);
endfunction ae = computeArea(a, b)
ae = pi*a*b;
end

相比之前的代码, 就改动了两处:

1 增加语句: fh = localfunctions;

2 增加一个输出变量: fh

运行看一下结果:

fh就是一个cell, 内部是匿名函数, 那些匿名函数就是那些局部变量, 貌似顺序是按照定义的顺序来的, 如果不确定的, 先打印出fh变量查看.

现在可以调用局部函数了:

如果嫌索引的方法调用, 过于抽象(无法一眼看出调用的是哪个局部函数), 可以用以下方法来:

就是先将匿名函数, 起名为局部函数名, 然后就可以像调用public函数那样调用private函数了.

总结: 使用localfunctions函数, 可以优雅安全地调用局部函数, 值得大家使用.

创作不易, 请大家"素质三连": 点赞, 收藏, 分享.

查看某个方法在哪里被调用_MATLAB局部函数公有化的方法: localfunctions相关推荐

  1. 一种简单的,适合单片机的,数据加密解密方法,仅需要调用两个函数即可完成数据的加密解密

    一种简单的,适合单片机的,数据加密解密方法,仅需要调用两个函数即可完成数据的加密解密 本人原创,源码可移步:https://gitee.com/demyli/easy-encrypt.git /*** ...

  2. ASP.NET后台调用前台JS函数的三种常见方法

    为什么80%的码农都做不了架构师?>>>    第一种:使用普通的添加控件中的Attributes属性进行调用 例如,像一般的普通的按钮:Button1.Attributes.Add ...

  3. python类定义中、对象字符串的特殊方法是_python中自定义类对象json字符串化的方法_python json转字符串、...

    python中自定义类对象json字符串化的方法 1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): prin ...

  4. java如何中断父类方法_java – 如何测试调用父类的受保护(不需要)方法的方法?...

    我陷入了一个非常奇怪的情况. 我有一些我需要测试的特定代码. 这里是: public class A { /* * The real method of real class is so big th ...

  5. 继承里的方法 和成员变量调用,成员变量用 父类,方法用继承 ,Fu obj = new zi()

  6. 查看某个方法在哪里被调用_Object类有哪些方法?各有什么作用?

    上帝类 - Object类 总共13个方法: Object类存储在java.lang包中,是所有java类(Object类除外)的终极父类.当然,数组也继承了Object类.然而,接口是不继承Obje ...

  7. 转【C#调用DLL的几种方法,包括C#调用C\C++\C#DLL】

    C#中dll调用方法 一.      DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最重要 ...

  8. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法拦截 JDK 中已经定义的函数 )

    文章目录 一.重写 MetaClass#invokeMethod 方法拦截 JDK 中已经定义的函数 1.被拦截的 String#contains 方法原型 2.JDK 正常用法 3.拦截 Strin ...

  9. python 类的内置方法_【转】[python] 类常用的内置方法

    原文:http://xukaizijian.blog.163.com/blog/static/170433119201111894228877/ 内置方法 说明 __init__(self,...) ...

最新文章

  1. 2019 ACM - ICPC 西安邀请赛 B. Product (杜教筛) 简单数论(bushi)
  2. Memcache的原理的详解
  3. 网站图片优化需要注意哪些方面?
  4. 用Gridview和ObjectDataSource轻松实现自定义分页
  5. C++ 限定名称查找
  6. 什么格式的照片可以是透明的
  7. 计算机固态硬盘安装,台式计算机的固态硬盘安装方法和步骤教程
  8. R语言:蒙特卡洛模拟
  9. mysql 嵌套_MySQL的嵌套查询
  10. 图虫知识共享协议_100%避免图片版权侵权的方法(网站图片侵权赔款标准)
  11. 个人软件定制开发多少钱,怎么核算
  12. 贪吃蛇 c语言 不死模式,贪吃蛇大作战不死版-贪吃蛇大作战不死版本下载-乐游网安卓下载...
  13. unity 生成和识别二维码
  14. ubuntu16.04火狐浏览器B站提示下载flash插件
  15. 读唐巧博客2011年总结感想
  16. 求两者较大值的max函数的用法(c++基础)
  17. 生活记录:突然“醒来”
  18. linux设置mysql防火墙端口映射_Linux防火墙默认是关闭3306端口,iptables实现端口转发、端口映射及双向通路...
  19. 吉信通短信接口(HTTP协议) java
  20. android studio高德地图的显示于定位(附带逆地理编码围栏)

热门文章

  1. 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
  2. [Python Study Notes]正则表达式
  3. 【bzoj1212】[HNOI2004]L语言 AC自动机
  4. 5.【练习题】构造方法与重载
  5. 2019\Province_C_C++_B\试题E-迷宫
  6. 征战蓝桥 —— 2016年第七届 —— C/C++A组第10题——最大比例
  7. 1035:等差数列末项计算
  8. 《算法学习与应用 从入门到精通》——填写运算符
  9. python中文件读写问题及解决方法
  10. 【STM32】STM32系列教程汇总(暂时暂停更新...)