【问题标题】:What does double backslash mean in elixir?长生不老药中的双反斜杠是什么意思?
【发布时间】:2021-09-04 09:47:10
【问题描述】:

我在网上查看了双反斜杠在 elixir 中的含义。我遇到了一个使用它的代码。但我仍然无法理解双反斜杠在长生不老药中的作用。示例代码如下。

defmodule Concat do
    def join(a, b, sep \\ " ") do
        a <> sep <> b
    end
end

IO.puts Concat.join("Hello", "world")      #=> Hello world
IO.puts Concat.join("Hello", "world", "_") #=> Hello_world

【问题讨论】:

    标签: elixir


    【解决方案1】:

    简而言之 - 它表示参数的“默认值”。然而,由于 Erlang 是如何实现的,实际上它的意思是“创建一个省略了这个参数的新函数,它将用给定的值调用这个函数来代替这个参数)。所以你的例子将被扩展为:

    defmodule Concat do
      def join(a, b), do: join(a, b, " ")
      def join(a, b, sep), do: a <> sep <> b
    end
    

    【讨论】:

      【解决方案2】:

      这在documentation中有解释:

      默认参数

      \\ 用于指定函数参数的默认值。 例如:

      defmodule MyMath do
        def multiply_by(number, factor \\ 2) do
          number * factor
        end
      end
      
      MyMath.multiply_by(4, 3)
      #=> 12
      
      MyMath.multiply_by(4)
      #=> 8
      

      编译器将其翻译成多个不同的函数 arities,这里是MyMath.multiply_by/1MyMath.multiply_by/2,那个 表示具有默认值的参数的参数是 通过或不通过。

      当定义一个带有默认参数以及多个参数的函数时 显式声明的子句,您必须编写一个函数头 声明默认值。例如:

      defmodule MyString do
        def join(string1, string2 \\ nil, separator \\ " ")
      
        def join(string1, nil, _separator) do
          string1
        end
      
        def join(string1, string2, separator) do
          string1 <> separator <> string2
        end
      end
      

      请注意,\\ 不能与匿名函数一起使用,因为它们可以 只有一个单一的arity。

      【讨论】:

        猜你喜欢
        • 2019-07-30
        • 2015-12-03
        • 1970-01-01
        • 2015-02-02
        • 2013-10-24
        • 2016-04-06
        • 2021-06-15
        • 1970-01-01
        • 2014-07-15
        相关资源
        最近更新 更多