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

时间:2017-08-30 23:40:46

标签: erlang elixir erlang-shell

我是source的新手。我试图在模块内运行一个函数。我在文件中的代码如下:

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)

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

2 个答案:

答案 0 :(得分:1)

我会在这里给出正确答案,因为@ 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是一个普通变量,这就是编译器尝试在原地解决它并引发错误的原因。

答案 1 :(得分:0)

在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")