【发布时间】:2019-10-11 06:50:24
【问题描述】:
我在 Elixir 中创建了一个简单的函数,它将元组中的值加 1。
我将模块命名为 Test 并将函数命名为 addToTuple。它需要一个参数,即元组本身。
def addToTuple({X,Y}) do
{X,Y+1}
end
我通过 iex 编译了模块并得到了这个警告:
warning: this expression will fail with ArithmeticError
Test.ex:68
第 68 行引用 {X,Y+1}。当我使用命令 Test.addToTuple({4,5}) 运行该函数时,我不断收到此错误:
** (FunctionClauseError) no function clause matching in Test.addToTuple/1
The following arguments were given to Test.addToTuple/1:
# 1
{4, 5}
Test.ex:67: Test.addToTuple/1
我希望得到 {4,6}。
知道这里发生了什么吗?
更新 1:
我将 X 和 Y 更改为小写,它起作用了。不过,这次我稍微修改了函数来玩转原子:
def addToTuple({A,x,y}) do
{A,x,y+1}
end
然后我用这个命令调用了这个函数:Test.addToTuple({:F,4,5})。我期待得到 {:F,4,6}。但相反,我收到了这个错误:
** (FunctionClauseError) no function clause matching in Test.addToTuple/1
The following arguments were given to Test.addToTuple/1:
# 1
{:F, 4, 5}
Test.ex:67: Test.addToTuple/1
我认为使用大写字符会被视为原子?如何解决?
【问题讨论】:
-
与 Erlang 不同,Elixir 中的变量是小写的。大写的名称被视为原子。而且您显然不能分配给原子,也不能添加数字。此外,按照惯例(非强制性),函数名称应为蛇形 (
add_to_tuple.) -
@AlekseiMatiushkin 谢谢,它工作。但是,我尝试修改函数,以便在元组中包含一个原子并得到一个错误。检查更新 1。
-
原子是一个生命周期常数。变量是小写的。你可以接受任何东西,包括原子,变量。你正在做的是模式匹配。尝试将
A作为第一个参数传递——这样会起作用。
标签: elixir