将函数重新分配到一个值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将函数重新分配到一个值相关的知识,希望对你有一定的参考价值。

我不明白到底是为什么,为什么我在进行 somefunc() = 100? 现在,当我 "打电话" somefunc,它输出 100. 我也试过只做 somefunc = 100,然后给我一个错误。在重新分配了 somefunc()100,当我只是写 somefunc,它仍然说它是一个函数。

这里到底发生了什么?为什么我在重新指定 somefunc 的值,但当将 somefunc(),不是吗?为什么 somefunc 还是说它是一个函数,即使在重新分配之后?

答案

当你写 somefunc() = 100 在全局范围内,你定义了一个新的方法,为 somefunc 功能。这有两个效果。

  1. 如果 somefunc 是未定义的,将其设为常量(即不能像 const x = 123)绑定到一个新的通用函数。
  2. 无论它是否是新的,都要添加一个方法用于 () -> 100somefunc 通用函数对象。

绑定的事实是 somefunc 是恒定的,这就是为什么你不能在之后重新分配它。这对于性能来说非常重要,因为非恒定的 globals 的性能相当糟糕;如果函数绑定不是恒定的,那么任何时候你调用一个函数都会很慢。

尽管你不能改变什么函数 somefunc 所指的函数,你可以通过向它添加方法,甚至覆盖现有的方法来改变函数本身。例如,在后面写 somefunc() = 200 并没有创建一个新的函数,而是用一个新的方法代替了这个函数中不接受参数的方法,返回200而不是100。

当你写:

somefunc() = 100

它只是一个简写

function somefunc()
    return 100
end

所以,即使有一个 = 符号,那是一个赋值运算符,它和写出 x = 100,它只是简单地绑定了 100 名称 x. 特别要注意的是,写出e.g.。

somefunc = () -> 100

允许你写 somefunc(),并得到 100. 但这次你可以自由地以后再写 somefunc = 100作为 somefunc = () -> 100 并不是一个函数定义,而是将匿名的函数 () -> 100 名下 somefunc.

以上是关于将函数重新分配到一个值的主要内容,如果未能解决你的问题,请参考以下文章

将字符串重新分配给数组中的一组值列表

在 Julia 的函数中重新分配字典值

C语言:不能将“int **”类型的值分配到“int”类型实体

有没有办法将2个非常相似的代码片段组合成一个函数并重复?

重新加载时刷新片段

Asynctask结果显示重新创建片段后