You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该函数不命名为"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:53:31