为何该函数不命名为"Left"?Elixir函数参数为何可跨名称分布?
关于Elixir中
left and right函数定义的疑问解答 首先明确:你看到的这个写法是Elixir的中缀函数(运算符风格)定义,不是参数在函数名前后,而是and才是真正的函数名,left和right是它的两个参数。
核心原因:Elixir支持中缀函数语法
Elixir作为函数式语言,借鉴了Haskell等语言的特性,允许将符合规则的函数以中缀形式定义和调用:
- 对于由运算符类符号(或
and/or这类关键字)组成的函数名,你可以写成参数1 函数名 参数2的形式,本质和函数名(参数1, 参数2)完全等价。 - 那个示例里的
def left and right do ... end,实际是定义了一个名为and/2的函数,left和right是它的两个入参,就像你写def add(a, b) do ... end一样,只是换成了中缀的写法。
为什么and能被当作函数重新定义?
虽然and本身是Elixir内置的逻辑运算符,但在模块内部你可以重新定义它(当然实际开发中绝对不推荐这么做,会严重混淆语义)。Jose的这个例子就是故意用这个反直觉的合法语法,来演示类型系统的局限——语法上完全合规,但语义上很容易让人误解成left是函数名,从而引发bug。
实际验证的小技巧
在iex里你可以测试:
defmodule Test do def left and right do Enum.random([left, right]) end end # 两种调用方式效果完全一致 Test.left and Test.right Test.and(Test.left, Test.right)
内容的提问来源于stack exchange,提问作者Onorio Catenacci
相关产品推荐
相关产品推荐

