为什么在Elixir中使用下划线作为参数,而不是完全不使用参数?
我知道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 在本例中,我编写了一个方法(来自教程),该方法接受三个参数,现在都不使用,因此使用下划线,但为什么不使用空括号?在第二个示例中,我
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中称为函数重载。