如何将 arity 2 的函数作为 Elixir 中的参数传递给 Enum.map?
How to pass a function of arity 2 as an argument in Elixir for Enum.map?
假设我有类似的东西:
Enum.map(list, fn(x) -> String.duplicate("a", someValue * x) end)
但是,我想将 String.duplicate/2 函数作为参数传递,以简化我的代码:
Enum.map(list, &String.duplicate/2)
我知道你可以为 arity 1 函数做到这一点:
Enum.map(list, &String.downcase/1)
谢谢!
您不能将元数为 2 的函数传递给 Enum.map
,因为 Enum.map
会使用列表中的每个元素作为参数调用您的函数。如果你使用另一个像 Enum.reduce
这样的函数,那么它需要一个元数为 2 的函数。
这是对列表中的每个项目调用 String.downcase/1
函数的示例:
Enum.map(["FOO", "BAR", "BAZ"], fn(x) -> String.downcase(x) end)
# String.downcase("FOO")
# String.downcase("BAR")
# String.downcase("BAZ")
在您的重复示例中,您尝试使用单个参数(字符串 "FOO")调用 String.duplicate/2
。
您可以使用捕获语法创建函数(这是定义您提供的函数的 shorthand 方式):
Enum.map([1,2,3], &String.duplicate("a", &1))
您还可以在模块中定义一个只需要一个参数的命名函数,例如:
Enum.map([1, 2, 3], &duplicate_foo/1)
def duplicate_foo(times), do: String.duplicate("a", times)
假设我有类似的东西:
Enum.map(list, fn(x) -> String.duplicate("a", someValue * x) end)
但是,我想将 String.duplicate/2 函数作为参数传递,以简化我的代码:
Enum.map(list, &String.duplicate/2)
我知道你可以为 arity 1 函数做到这一点:
Enum.map(list, &String.downcase/1)
谢谢!
您不能将元数为 2 的函数传递给 Enum.map
,因为 Enum.map
会使用列表中的每个元素作为参数调用您的函数。如果你使用另一个像 Enum.reduce
这样的函数,那么它需要一个元数为 2 的函数。
这是对列表中的每个项目调用 String.downcase/1
函数的示例:
Enum.map(["FOO", "BAR", "BAZ"], fn(x) -> String.downcase(x) end)
# String.downcase("FOO")
# String.downcase("BAR")
# String.downcase("BAZ")
在您的重复示例中,您尝试使用单个参数(字符串 "FOO")调用 String.duplicate/2
。
您可以使用捕获语法创建函数(这是定义您提供的函数的 shorthand 方式):
Enum.map([1,2,3], &String.duplicate("a", &1))
您还可以在模块中定义一个只需要一个参数的命名函数,例如:
Enum.map([1, 2, 3], &duplicate_foo/1)
def duplicate_foo(times), do: String.duplicate("a", times)