在elixir中,可以在函数定义中使用默认参数,但是我发现无法使用单个关键字列表参数来实现,例如:
def do_stuff(
success: sucess \\ fn(conn) -> conn end,
error: error
) do
# ...
end
另外,我考虑过通过使用类似JS promises的方法来避免这种“回调传递”风格的编码,但是我找不到Elixir的promises实现。
也许在语言中内置了一些功能,可以帮助我编写更好的代码并更严格地遵守Elixir标准。
主要问题:可以使用默认关键字参数吗?
附带的问题: Elixir是否提供某种帮助来避免这种“回调传递”风格的编程,而倾向于一种更具反应性/可组合性的机制?
不,不可能使用默认的关键字参数,因为关键字参数只是单个关键字列表上的语法糖:
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
最后,关于您提到的“回调样式” fn
,除非您开始研究并发性和消息传递,否则我不知道有什么方法会与完成时传递的方法有很大不同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句