[Erlang16]为什么要用MFA代替fun()–>end?
MFA:Module Function Arguments.
首先你要知道Module:Func(Args)和Func(Args)的区别在哪里?
如果对细节感兴趣,可以通过这里了解:http://www.cnblogs.com/zhongwencool/p/erlang_hot_code.html
总之:Erlang函数有local call和external call的区别,Local call 就是在函数在被定义的模块里面被调用,可以直接被调用: Func(Args); External call 就是显式的使用Module:Func(Args)来调用或import别的模块进来的调用.
当同一个模块有2个版本被加载里,所有的local call都可以工作在当前版本状态,但是:external call只能调用到最新的版本!
1.使用Fun的情景:
1.1 先启动1个shell终端,分别名为test1:
erl -name test1
1.2 test1加载模块mfa_test.erl
-module(mfa_fun). -export([cal/2,func/0]). cal(X,Y) ->
X+Y.
func() ->
fun(X,Y) -> cal(X,Y) end.
1.3在shell中输入:
>Func = mfa_fun:func().
#Fun<mfa_fun.1.52492151>
>Func(1,2).
3
2.使用MFA的场景:
改变mfa_test.erl中cal函数并重新加载这个模块:
cal(X,Y) -> X*Y .
1.5 再运行:
>Func(1,2).
3
可以看到这个Func运行的local版本,如果把func改为以下版本:
func() ->
fun(X,Y) -> ?MODULE:cal(X,Y) end.
那么结果是永远调用的最新版本代码,有兴趣可以自己验证下,你会感到好神奇,为什么Func变量是没有变化,但得到的结果却发生了变化。。。
那么我们可以再进一步想一下:
我们经常使用spawn(Func)来创建一个新的进程,如果我们永远不升级还好,如果热升级,会发生什么情况?
这个local call的func,你怎么也改不了它,所以正常情况下最好使用:
spawn(Mod,FuncName,Args)来创建进程,这样不会影响升级。
再进一步,就是进程里面所有存local call都是无法被升级的,最佳实践就是一直用MFA就好!

[Erlang16]为什么要用MFA代替fun()–>end?的更多相关文章
- Enable MFA for a user
If you are root/admin account, in order to configure a virtual MFA device, you must have physical ac ...
- 用Azure AD 实现Web 应用身份认证的Multi-Factor Authentication(MFA)
最近客户有个需求,希望把面向public的Web应用中的终端用户数据库由Azure AD来实现,同时希望可以用MFA来实现用户身份认证.这个想法非常好,通过使用Azure的managed servic ...
- Amazon(iam)IAM用户启用MFA
1.1 下载MFA软件 我这里选择Google的Authenticator 1.2 进入IAM 搜索IAM,点击进入 1.3 选择需要设置MFA的用户 1.4 选择安全证书 1.5 管理MFA设置 这 ...
- 国内版Office365实现MFA的方案(未完)
现在二十一世纪互联版也可以实现了MFA,现在也就是2017年3月份,支持了PC,但是对移动端应用还是不支持的,请了解. 具体方法如下: 登录国内版Office365(事例为高级商业版 https:// ...
- 什么是 MFA?
Multi-Factor Authentication (MFA) 是一种简单有效的最佳安全实践方法,它能够在用户名和密码之外再额外增加一层安全保护. 启用 MFA 后,用户登录阿里云网站时,系统将要 ...
- twitch游戏直播(【国外】平台)如何绑定二次验证码_虚拟MFA?
一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 twitch游戏直播([国外]平台)如何绑定二次验证码_虚拟MFA? 二次验证码小程序于谷歌身份验证器APP的优势(更多见官网 ...
- SmartMS如何使用二次验证码/虚拟MFA/两步验证/谷歌身份验证器?
一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 SmartMS如何使用二次验证码/虚拟MFA/两步验证/谷歌身份验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1.无 ...
- Teambition如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?
一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 Teambition如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1 ...
- 数字货币交易所(火币为例)如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?
一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 数字货币交易所(火币为例)如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优 ...
随机推荐
- HTTP接口开发专题二(发送http请求的接口工具类)
import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; imp ...
- C# 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke [问题点数:40分
注意: this.DateTimeRun = true; new Thread(jishi_kernel).Start(); 线程的启动,不能放在 public Form ...
- 如何去掉Myeclipse对JS等文件的验证
或 MyEclipse->validation->Excluded Resource下找到不需要验证的文件或者文件夹 或 右键点击该项目-->MyEclipse-->Exclu ...
- 动态添加一列到DataTable的第一列
dt.Columns.Add("ROWNUM", typeof(Int64));dt.Columns["ROWNUM"].SetOrdinal(0);
- 前端开发之JavaScript基础篇二
主要内容: 1.流程控制条件语句和switch语句 2.for循环和while循环 3.Break语句和Continue语句 4.数组和数组常用方法 5.函数 6.对象 一.流程控制条件语句和swit ...
- 2017年Java学习总结
2017年Java学习 Java,是我学习的第三种计算机编程语言,刚拿到这本教材时,我被它的厚度与书中字体的密集程度吓了一跳,不过在学习过程中,有Python,C语言的学习基础上,加上老师的 ...
- 使用RampTexture来控制diffuse shading
[RampTexture] RampTexture(渐变纹理),可以是1D/2D纹理. This allows you to accentuate the surface's colors to fa ...
- Oracle-11g 回缩表高水位
回缩表高水位的意义: 所有的 Oracle 段都有一个在段内容纳数据的上线,即高水位线(high water mark).HWM 是一个标记,很像水库的丽水最高水位,即使表内数据全部删除,HWM 也还 ...
- sql解决主键冲突
在数据插入的时候,假设主键对应的值已经存在,则插入失败!这就是主键冲突.当主键存在冲突(duplicate key)的时候,可以选择性的进行处理,即忽略.更新或者替换. 1.忽略 insert ign ...
- C++ const引用
(1) 在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用. 1 int ival ...