在 elixir 中访问模块中的函数时变量不存在编译错误

Variable does not exist compilation error while accessing a function in a module in elixir

我是 Elixir 的新手。我正在尝试 运行 模块内的函数。我在文件中的代码如下:

defmodule greeter do

  def print() do
    IO.puts "Hello workd" 
  end

  def print(name) do
    IO.puts "Hello " <> name 
  end

  defp print(name,age) do
    IO.puts "Hello " <>name<>" My age is "<> age 
  end

end

greeter.print()
greeter.print("Xyxss")

当我在命令行上 运行 elixirc filename.ex 时,出现以下错误:

warning: variable "greeter" does not exist and is being expanded to "greeter()", please use parentheses to remove the ambiguity or change the variable name
functions.ex:1
== Compilation error in file functions.ex ==
** (CompileError) functions.ex:1: undefined function greeter/0
   (stdlib) lists.erl:1354: :lists.mapfoldl/3
   (elixir) expanding macro: Kernel.defmodule/2
   functions.ex:1: (file)

我无法解决给定的错误。有人可以帮我解决这个问题吗?

在 elixir 中,模块是大写的,通常写成 CamelCase,因此,在您的情况下,您必须将代码重写为:

defmodule Greeter do

    def print() do
        IO.puts "Hello workd"
    end

    def print(name) do
        IO.puts "Hello " <> name
    end

    defp print(name,age) do
        IO.puts "Hello " <>name<>" My age is "<> age
    end

end

Greeter.print()
Greeter.print("Xyxss")

我会在这里给出正确答案,因为@J.Sebio 提供的答案完全错误。

Elixir 中的模块名称必须是一个原子。 下面的两个示例都可以完美运行:

iex(1)> defmodule :foo, do: def yo, do: IO.puts "YO"
iex(2)> :foo.yo
YO

iex(3)> defmodule :"42", do: def yo, do: IO.puts "YO"  
iex(4)> :"42".yo                                     
YO

事情是:在 Elixir 中,大写的术语 是一个原子 :

iex(5)> is_atom(Greeting)
true

这就是将模块名称大写的原因。此外,greeting 是一个普通变量,这就是编译器尝试就地解析它并抛出错误的原因。