首页 > 解决方案 > 将函数重新分配给值

问题描述

我不明白为什么会发生/为什么我在做的时候没有出错somefunc() = 100?现在,当我“调用”时somefunc,它会输出100. 我也试过做somefunc = 100,然后给我一个错误。重新分配somefunc()给后100,当我刚写的时候somefunc,它仍然说它是一个函数。

这里到底发生了什么?为什么我在重新分配somefunc一个值时会出错,但在重新分配时却somefunc()没有?为什么somefunc即使在重新分配它之后仍然说它是一个函数?

标签: julia

解决方案


当您somefunc() = 100在全局范围内编写时,您为该somefunc函数定义了一个新方法。这有两个效果:

  1. 如果未定义,则使其成为绑定到新泛型函数somefunc的常量(即不能像 一样重新分配)。const x = 123
  2. 无论是否为通用函数对象添加() -> 100方法somefunc

绑定为常量的事实somefunc是您事后无法重新分配它的原因。这对性能非常重要,因为非常量全局变量的性能很差;如果函数绑定不是恒定的,那么任何时候调用函数都会很慢。

即使您无法更改函数所somefunc引用的内容,您也可以通过向其添加方法甚至覆盖现有方法来更改函数本身。例如,稍后编写somefunc() = 200不会创建新函数,而是用返回 200 而不是 100 的新方法替换不带参数的函数的方法。

当你写:

somefunc() = 100

它只是一个简写

function somefunc()
    return 100
end

因此,即使有一个=符号,它是一个赋值运算符,它与 write 不同x = 100,它只是将值绑定100到 name x。特别注意写作例如:

somefunc = () -> 100

让你写somefunc(),得到100。但是这次您可以稍后再编写somefunc = 100,因为somefunc = () -> 100它不是函数定义,而是将匿名函数绑定() -> 100到名称的 na 赋值somefunc


推荐阅读