将函数重新分配到一个值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将函数重新分配到一个值相关的知识,希望对你有一定的参考价值。
我不明白到底是为什么,为什么我在进行 somefunc() = 100
? 现在,当我 "打电话" somefunc
,它输出 100
. 我也试过只做 somefunc = 100
,然后给我一个错误。在重新分配了 somefunc()
到 100
,当我只是写 somefunc
,它仍然说它是一个函数。
这里到底发生了什么?为什么我在重新指定 somefunc
的值,但当将 somefunc()
,不是吗?为什么 somefunc
还是说它是一个函数,即使在重新分配之后?
当你写 somefunc() = 100
在全局范围内,你定义了一个新的方法,为 somefunc
功能。这有两个效果。
- 如果
somefunc
是未定义的,将其设为常量(即不能像const x = 123
)绑定到一个新的通用函数。 - 无论它是否是新的,都要添加一个方法用于
() -> 100
至somefunc
通用函数对象。
绑定的事实是 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
.
以上是关于将函数重新分配到一个值的主要内容,如果未能解决你的问题,请参考以下文章