Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 长生不老药&x27;在外部.ex文件中编写的匿名函数可以';t使用交互式shell运行_Elixir_Anonymous Function_First Class Functions - Fatal编程技术网

Elixir 长生不老药&x27;在外部.ex文件中编写的匿名函数可以';t使用交互式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 ->

我可以直接在交互式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 -> (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中访问它们,谢谢。我只知道这是可能的。从未使用或考虑过它,出于某种原因认为它是无效的。相应地更新了答案。你说的“一等公民”是什么意思?你可以定义