代码之家  ›  专栏  ›  技术社区  ›  shubhamagiwal92

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

  •  2
  • shubhamagiwal92  · 技术社区  · 7 年前

    我是新手 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)
    

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Aleksei Matiushkin    7 年前

    以下两个示例都非常有效:

    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
    

    问题是:用长生不老药,大写的术语 :

    iex(5)> is_atom(Greeting)
    true
    

    这就是为什么大写模块名称有效的原因。而且 greeting 是一个普通变量,这就是为什么编译器试图就地解析它并抛出错误。

        2
  •  0
  •   J. Sebio    7 年前

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