Elixir,默认关键字列表参数
Elixir, default keyword list argument
在 elixir 中可以在函数定义中使用默认参数,但我发现使用单个关键字列表参数是不可能的,例如:
def do_stuff(
success: sucess \ fn(conn) -> conn end,
error: error
) do
# ...
end
此外,我考虑过使用 JS promises 之类的东西来避免这种 "callback passing" 编码风格,但我找不到 Elixir 的 promises 实现。
也许语言中内置了一些东西可以帮助我编写更好的代码并更接近 elixir 标准。
主要问题:可以使用默认关键字参数吗?
附带问题:Elixir 是否提供了一些东西来帮助避免这种 "callback passing" 编程风格以支持更 reactive/composable 的机制?
不,不可能使用默认关键字参数,因为关键字参数只是单个关键字列表的语法糖:
do_stuff(success: ..., failure: ...)
与
相同
do_stuff([success: ..., failure: ...])
所以关键字列表实际上只是一个参数。您在函数定义中所做的是 匹配 传递给 do_stuff/1
的关键字列表:一定要注意这一点,因为您的函数定义将不匹配如果关键字的顺序不相同(即 do_stuff(failure: ..., success: ...)
)。
我认为克服这个问题的一个好方法是简单地为 do_stuff
函数使用两个不同的参数:
def do_stuff(success \ fn(conn) -> conn end, failure \ fn(err) -> err end)
这样默认参数就可以正常工作了。如果你真的需要你的参数是一个关键字列表,那么你可以在函数体内处理默认值:
def do_stuff(options) do
success = options[:success] || (fn(conn) -> conn end)
failure = options[:failure] || (fn(err) -> err end)
end
最后,关于您提到的 "callback style",除非您开始研究并发性和消息通过.
在 elixir 中可以在函数定义中使用默认参数,但我发现使用单个关键字列表参数是不可能的,例如:
def do_stuff(
success: sucess \ fn(conn) -> conn end,
error: error
) do
# ...
end
此外,我考虑过使用 JS promises 之类的东西来避免这种 "callback passing" 编码风格,但我找不到 Elixir 的 promises 实现。
也许语言中内置了一些东西可以帮助我编写更好的代码并更接近 elixir 标准。
主要问题:可以使用默认关键字参数吗?
附带问题:Elixir 是否提供了一些东西来帮助避免这种 "callback passing" 编程风格以支持更 reactive/composable 的机制?
不,不可能使用默认关键字参数,因为关键字参数只是单个关键字列表的语法糖:
do_stuff(success: ..., failure: ...)
与
相同do_stuff([success: ..., failure: ...])
所以关键字列表实际上只是一个参数。您在函数定义中所做的是 匹配 传递给 do_stuff/1
的关键字列表:一定要注意这一点,因为您的函数定义将不匹配如果关键字的顺序不相同(即 do_stuff(failure: ..., success: ...)
)。
我认为克服这个问题的一个好方法是简单地为 do_stuff
函数使用两个不同的参数:
def do_stuff(success \ fn(conn) -> conn end, failure \ fn(err) -> err end)
这样默认参数就可以正常工作了。如果你真的需要你的参数是一个关键字列表,那么你可以在函数体内处理默认值:
def do_stuff(options) do
success = options[:success] || (fn(conn) -> conn end)
failure = options[:failure] || (fn(err) -> err end)
end
最后,关于您提到的 "callback style",除非您开始研究并发性和消息通过.