Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Elixir中使用下划线作为参数,而不是完全不使用参数?_Elixir_Phoenix Framework - Fatal编程技术网

为什么在Elixir中使用下划线作为参数,而不是完全不使用参数?

为什么在Elixir中使用下划线作为参数,而不是完全不使用参数?,elixir,phoenix-framework,Elixir,Phoenix Framework,我知道Elixir在需要忽略这些参数时使用下划线作为参数。我的问题是,为什么会有它们 def photos(_,_,_) do {:ok, Instagram.Posts.list_photos} end def photo(_, %{id: id}, _) do {:ok, Instagram.Posts.get_photo!(id)} end 在本例中,我编写了一个方法(来自教程),该方法接受三个参数,现在都不使用,因此使用下划线,但为什么不使用空括号?在第二个示例中,我

我知道Elixir在需要忽略这些参数时使用下划线作为参数。我的问题是,为什么会有它们

def photos(_,_,_) do
    {:ok, Instagram.Posts.list_photos}
end

def photo(_, %{id: id}, _) do
    {:ok, Instagram.Posts.get_photo!(id)}
end

在本例中,我编写了一个方法(来自教程),该方法接受三个参数,现在都不使用,因此使用下划线,但为什么不使用空括号?在第二个示例中,我使用了Id参数,但没有使用其他参数,所以为什么我仍然需要下划线?

你说得对。如果我们根本不使用它们,我们可以设置不带参数的函数:

def f() do
  # Do something...
end
然而,Elixir及其父项Erlang将函数及其arity一起标识;如果我们有时在同一个函数中使用一些或所有参数,我们需要一种方法来确定哪些参数被设置以及如何设置

在长生不老药中,这是:

def f(a) do
  # ...
end
与以下功能不同:

前者是
f/0
,而后者是
f/1
。现在,正如您所熟悉的,下面是一个模式匹配的示例:

def f(:flag, b) when is_number(b) do
  # paramater 'a' is set as :flag
  # and 'b' is a number, do
  # something with 'b' ...
end

def f(:flag, b) do 
  # paramater 'a' is set as :flag
  # and 'b' is not a number, do
  # something with 'b' ...
end

def f(a, :flag) do 
  # paramater 'a' is not set as :flag
  # but 'b' is,
  # do something with 'a' ...
end

def f(_, _) do
  # otherwise, we don't care
  # what 'a' and 'b' are, maybe
  # do something...
end

但是,您是对的,我们可以从技术上在调用者函数中执行这些检查,并在适当的时候调用
f/0
(而不是与任何初始检查都不匹配的
f(a,b)
),这是我们将与
f/2
分开定义的。但是我们可能会失去Elixir提供的这种语法上的方便和优雅。

你说得对。如果我们根本不使用它们,我们可以设置不带参数的函数:

def f() do
  # Do something...
end
然而,Elixir及其父项Erlang将函数及其arity一起标识;如果我们有时在同一个函数中使用一些或所有参数,我们需要一种方法来确定哪些参数被设置以及如何设置

在长生不老药中,这是:

def f(a) do
  # ...
end
与以下功能不同:

前者是
f/0
,而后者是
f/1
。现在,正如您所熟悉的,下面是一个模式匹配的示例:

def f(:flag, b) when is_number(b) do
  # paramater 'a' is set as :flag
  # and 'b' is a number, do
  # something with 'b' ...
end

def f(:flag, b) do 
  # paramater 'a' is set as :flag
  # and 'b' is not a number, do
  # something with 'b' ...
end

def f(a, :flag) do 
  # paramater 'a' is not set as :flag
  # but 'b' is,
  # do something with 'a' ...
end

def f(_, _) do
  # otherwise, we don't care
  # what 'a' and 'b' are, maybe
  # do something...
end

但是,您是对的,我们可以从技术上在调用者函数中执行这些检查,并在适当的时候调用
f/0
(而不是与任何初始检查都不匹配的
f(a,b)
),这是我们将与
f/2
分开定义的。但是,我们可能会失去Elixir提供的这种语法便利性和优雅性。

这是让系统知道变量存在,但不会使用它。如果名称不以下划线开头,并且不使用变量,则会收到编译时警告,变量未被使用

例如,你将一个数字除以另一个数字,你不能除以0。因此,您的代码将如下所示:

divide(_A, 0) -> "can't do";

divide(A, B) -> A/B.

我们使用相同的函数,但它使用模式匹配过滤掉0。由于您不会使用第一个数字,因此您可以用下划线将其命名,以告诉编译器忽略该事实。

这是为了让系统知道您知道变量在那里,但您不会使用它。如果名称不以下划线开头,并且不使用变量,则会收到编译时警告,变量未被使用

例如,你将一个数字除以另一个数字,你不能除以0。因此,您的代码将如下所示:

divide(_A, 0) -> "can't do";

divide(A, B) -> A/B.

我们使用相同的函数,但它使用模式匹配过滤掉0。由于您不会使用第一个数字,因此您可以用下划线将其命名,以告诉编译器忽略该事实。

查看模式匹配。简短回答:\用于忽略模式匹配上的参数,该参数允许根据调用方式调用不同的函数体。请查看模式匹配。简短回答:u用于忽略模式匹配上的参数,模式匹配允许根据调用方式调用不同的函数体。谢谢。这是一个非常清楚的解释:)谢谢你。这是一个非常清楚的解释:)这建立在另一个答案的基础上,这很有帮助。你的意思是,我想要两个除法函数,一个取一个数,然后除以这个数,再除以函数中的值。第二个变量将采用两个参数,并将一个参数除以另一个参数。这种方式取决于函数所做的工作,它基于传递的参数。例如,下划线表示它仍然是同一个函数“foo”,但它的工作原理与参数不同。实际上,它在Erlang中被称为函数重载。这建立在另一个答案的基础上,这很有帮助。你的意思是,我想要两个除法函数,一个取一个数,然后除以这个数,再除以函数中的值。第二个变量将采用两个参数,并将一个参数除以另一个参数。这种方式取决于函数所做的工作,它基于传递的参数。因此,下划线表示它仍然是同一个函数“foo”,例如,但它的工作方式因参数而异。实际上,它在Erlang中称为函数重载。