Elixir 长生不老药&x27;在外部.ex文件中编写的匿名函数可以';t使用交互式shell运行
我可以直接在交互式shell中编写匿名函数,如下所示Elixir 长生不老药&x27;在外部.ex文件中编写的匿名函数可以';t使用交互式shell运行,elixir,anonymous-function,first-class-functions,Elixir,Anonymous Function,First Class Functions,我可以直接在交互式shell中编写匿名函数,如下所示 iex> total_bottles_milk = fn total -> total * 2 end iex> total_bottles_milk.(2) 但是,如果我在外部文件中写入并在交互式shell中运行,则会显示编译错误 我的文件名和目录路径是lib/expense.ex 下面是我的代码 defmodule Expense do total_bread_slices = fn total ->
iex> total_bottles_milk = fn total -> total * 2 end
iex> total_bottles_milk.(2)
但是,如果我在外部文件中写入并在交互式shell中运行,则会显示编译错误
我的文件名和目录路径是lib/expense.ex
下面是我的代码
defmodule Expense do
total_bread_slices = fn total -> (total * 10) / 100 end
total_bottles_milk = fn total -> total * 2 end
total_cakes = fn total -> total * 15 end
def total_expense(bread_slices, bottles_of_milk, cakes) do
total_bread_slices.(bread_slices) + total_bottles_milk.(bottles_of_milk) + total_cakes.(cakes)
end
end
当我进入文件夹路径并运行iex-S mix
运行我的费用模块时,终端显示编译错误。我想知道只有我可以直接在交互式shell中运行匿名函数,而不是从外部源编译它。我想写我作为一等公民的职能。如果有办法,我该怎么做?您不能在elixir中创建这样的“变量”(请参见下面的
edit1
和edit2
)。您看到的错误是正常的
您可以将匿名函数放入命名函数中,并从中调用它们,这将得到相同的结果:
defmodule Expense do
def total_expense(bread_slices, bottles_of_milk, cakes) do
total_bread_slices().(bread_slices) + total_bottles_milk().(bottles_of_milk) + total_cakes().(cakes)
end
defp total_bread_slices, do: fn total -> (total * 10) / 100 end
defp total_bottles_milk, do: fn total -> total * 2 end
defp total_cakes, do: fn total -> total * 15 end
end
通过这种方式,您将调用命名函数,该函数将返回匿名函数,然后将参数传递给匿名函数
编辑1
您不能在模块内创建这样的变量。这在iex中有效,因为它是一个交互式环境。但是,
x=y
语法在elixir模块的函数之外无效
编辑2
感谢@Dogbert的更正。实际上,您可以在模块内部和函数外部创建变量,但不能在def
内部使用它们您不能在elixir中创建这样的“变量”(请参见下面的EDIT 1
和EDIT 2
)。您看到的错误是正常的
您可以将匿名函数放入命名函数中,并从中调用它们,这将得到相同的结果:
defmodule Expense do
def total_expense(bread_slices, bottles_of_milk, cakes) do
total_bread_slices().(bread_slices) + total_bottles_milk().(bottles_of_milk) + total_cakes().(cakes)
end
defp total_bread_slices, do: fn total -> (total * 10) / 100 end
defp total_bottles_milk, do: fn total -> total * 2 end
defp total_cakes, do: fn total -> total * 15 end
end
通过这种方式,您将调用命名函数,该函数将返回匿名函数,然后将参数传递给匿名函数
编辑1
您不能在模块内创建这样的变量。这在iex中有效,因为它是一个交互式环境。但是,
x=y
语法在elixir模块的函数之外无效
编辑2
感谢@Dogbert的更正。实际上,您可以在模块内部和函数外部创建变量,但不能在
def
内部使用它们。多亏了@Abdullah Esmail,我可以这样编写我的函数
defmodule Expense do
def total_bread_slices do
fn total -> (total * 10) / 100 end
end
def total_bottles_milk do
fn total -> total * 2 end
end
def total_cakes do
fn total -> total * 15 end
end
def total_expense(bread_slices, bottles_of_milk, no_of_cakes) do
bread = total_bread_slices()
milk = total_bottles_milk()
cakes = total_cakes()
bread.(bread_slices) + milk.(bottles_of_milk) + cakes.(no_of_cakes)
end
end
感谢@Abdullah Esmail,我可以这样编写我的函数
defmodule Expense do
def total_bread_slices do
fn total -> (total * 10) / 100 end
end
def total_bottles_milk do
fn total -> total * 2 end
end
def total_cakes do
fn total -> total * 15 end
end
def total_expense(bread_slices, bottles_of_milk, no_of_cakes) do
bread = total_bread_slices()
milk = total_bottles_milk()
cakes = total_cakes()
bread.(bread_slices) + milk.(bottles_of_milk) + cakes.(no_of_cakes)
end
end
多亏了@Dogbert,如果我想使用函数作为值,这里还有另一种方法 首先,我定义了一个命名函数,然后使用Elixir的函数捕获操作符
&
,我可以更轻松地将命名函数用作值
这样,使用&
操作符捕获对函数的引用,使用=
操作符绑定到变量,就可以将命名函数绑定到变量
defmodule Expense do
defp total_bread_slices(total) do
(total * 10) / 100
end
defp total_bottles_milk(total) do
total * 2
end
defp total_cakes(total) do
total * 15
end
def total_expense(bread_slices, bottles_of_milk, no_of_cakes) do
bread = &total_bread_slices/1
milk = &total_bottles_milk/1
cakes = &total_cakes/1
bread.(bread_slices) + milk.(bottles_of_milk) + cakes.(no_of_cakes)
end
end
多亏了@Dogbert,如果我想使用函数作为值,这里还有另一种方法 首先,我定义了一个命名函数,然后使用Elixir的函数捕获操作符
&
,我可以更轻松地将命名函数用作值
这样,使用&
操作符捕获对函数的引用,使用=
操作符绑定到变量,就可以将命名函数绑定到变量
defmodule Expense do
defp total_bread_slices(total) do
(total * 10) / 100
end
defp total_bottles_milk(total) do
total * 2
end
defp total_cakes(total) do
total * 15
end
def total_expense(bread_slices, bottles_of_milk, no_of_cakes) do
bread = &total_bread_slices/1
milk = &total_bottles_milk/1
cakes = &total_cakes/1
bread.(bread_slices) + milk.(bottles_of_milk) + cakes.(no_of_cakes)
end
end
在运行《长生不老药行动手册》第二版中的示例时,我也遇到了同样的问题。为了避免在iex中重新键入lambda函数示例,我将它们保存在一个文件中。我尝试在iex中加载它们,例如:
iex解决方案/ch05.ex
但当我调用lambda函数时:
a_lambda.(“某物”)
我在iex中遇到一个编译错误
现在,我将lambda代码从文件中直接复制/粘贴到Iex,它可以正常工作。在运行《Elixir In Action book,第二版》中的示例时,我遇到了同样的问题。为了避免在iex中重新键入lambda函数示例,我将它们保存在一个文件中。我尝试在iex中加载它们,例如:
iex解决方案/ch05.ex
但当我调用lambda函数时:
a_lambda.(“某物”)
我在iex中遇到一个编译错误
现在,我将lambda代码从文件中直接复制/粘贴到Iex,它可以工作。感谢您的回答。但我想写我作为一等公民的职责。所以,这意味着我只能在交互式shell中这样写?这取决于你所说的“一流公民”是什么意思。问题不在于定义和使用函数。这主要是因为您无法在elixir(函数之外)中创建这样的变量。例如,可以让函数返回函数并将其存储到变量中。请检查下面的啊..现在知道了。感谢您的时间。您完全可以在模块/外部函数中创建变量。您无法从
def
@Dogbert中访问它们,谢谢。我只知道这是可能的。从未使用或考虑过它,出于某种原因认为它是无效的。相应地更新了答案。谢谢你的回答。但我想写我作为一等公民的职责。所以,这意味着我只能在交互式shell中这样写?这取决于你所说的“一流公民”是什么意思。问题不在于定义和使用函数。这主要是因为您无法在elixir(函数之外)中创建这样的变量。例如,可以让函数返回函数并将其存储到变量中。请检查下面的啊..现在知道了。感谢您的时间。您完全可以在模块/外部函数中创建变量。您无法从def
@Dogbert中访问它们,谢谢。我只知道这是可能的。从未使用或考虑过它,出于某种原因认为它是无效的。相应地更新了答案。你说的“一等公民”是什么意思?你可以定义