用外部.ex文件编写的Elixir匿名函数无法与交互式shell一起运行

pya*_*ing 1 anonymous-function elixir first-class-functions

我可以直接在交互式外壳中编写一个匿名函数,如下所示。

iex> total_bottles_milk = fn total -> total * 2 end  
iex> total_bottles_milk.(2)
Run Code Online (Sandbox Code Playgroud)

但是,如果我编写一个外部文件并在交互式外壳程序中运行,它将显示“编译错误”。

我的文件名和目录路径是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
Run Code Online (Sandbox Code Playgroud)

当我进入文件夹路径并运行iex -S mix以运行Expense模块时,终端显示Compilation错误。
我只是想知道我是否可以直接在交互式外壳程序中运行匿名函数,而不是从外部源进行编译。我想写我作为一等公民的职能。如果有办法,我该怎么办?

Abd*_*ail 5

你不能在仙丹(见创建“变量”像这样EDIT 1Edit 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
Run Code Online (Sandbox Code Playgroud)

这样,您将调用命名函数,该函数将返回匿名函数,然后将参数传递给该匿名函数。

编辑1

您不能创建类似于INSIDE模块的变量。这在iex中有效,因为它是一个交互式环境。但是,x = y语法在Elixir模块中的函数外部无效。

编辑2 感谢@Dogbert的更正。实际上,您可以在模块内部和函数外部创建变量,但不能在内部使用它们def

  • 您绝对可以在模块/外部函数中创建变量。您只是无法在`def`中访问它们。 (2认同)