【发布时间】:2014-08-26 22:54:00
【问题描述】:
我想这样写代码:
def boundary do
:crypto.rand_bytes(8)
|> Base.encode16
|> &("--------FormDataBoundary" <> &1)
end
但它不起作用。
【问题讨论】:
标签: elixir
我想这样写代码:
def boundary do
:crypto.rand_bytes(8)
|> Base.encode16
|> &("--------FormDataBoundary" <> &1)
end
但它不起作用。
【问题讨论】:
标签: elixir
它看起来有点奇怪,但必须有效:
def boundary do
:crypto.rand_bytes(8)
|> Base.encode16
|> (&("--------FormDataBoundary" <> &1)).()
end
【讨论】:
(&("--------FormDataBoundary" <> &1)).() 看起来您定义了一个接受 1 个参数的匿名函数,然后用零参数调用它,然后它就成为了管道的一部分?我不明白你为什么最后需要.()。这不是调用匿名函数吗?我不想自己称呼它,我希望它成为管道的一部分。
.()。
相关:如果“匿名”函数已分配给变量,您可以像这样通过管道传递给它:
def boundary do
add_marker = fn (s) ->
"--------FormDataBoundary" <> s
end
:crypto.rand_bytes(8)
|> Base.encode16
|> add_marker.()
end
【讨论】:
接受的答案有效,但您可以使用
更优雅地做到这一点(&"--------FormDataBoundary#{&1}").()
而不是
(&("--------FormDataBoundary" <> &1)).()
这是完整的功能:
def boundary do
:crypto.strong_rand_bytes(8)
|> Base.encode16()
|> (&"--------FormDataBoundary#{&1}").()
end
奖励:我还用:crypto.strong_rand_bytes/1 替换了:crypto.rand_bytes/1(elixir 1.6+ 中不存在)。
【讨论】:
你也可以这样使用:
def boundary do
:crypto.rand_bytes(8)
|> Base.encode16
|> (fn chars -> "--------FormDataBoundary" <> chars end).()
end
与其他形式相比,这种形式的一个优势是您可以轻松编写简单的“案例”语句:
def do_some_stuff do
something
|> a_named_function()
|> (
fn
{:ok, something} -> something
{:error, something_else} ->
Logger.error "Error"
# ...
end
).()
end
发件人:
使用fn 比couchemar's answer 更清晰一点:
def boundary do
:crypto.rand_bytes(8)
|> Base.encode16
|> (&("--------FormDataBoundary" <> &1)).()
end
...但是,对于您的特定示例,使用& 的上述表单可能是最好的。如果管道表达式更复杂,命名匿名函数参数可能更有用。
我的回答也比Nathan Long's answer简洁一点:
def boundary do
add_marker = fn (s) ->
"--------FormDataBoundary" <> s
end
:crypto.rand_bytes(8)
|> Base.encode16
|> add_marker.()
end
...如果由于某种原因您需要在管道中多次调用该函数,他的回答会更好。
【讨论】:
|> fn x -> x end.()
你真的不能走吗?
thing
|> func_one()
|> fn input -> do_stuff_here() end)
你可以做一些事情,比如把东西直接放到箱子里
thing
|> func_one()
|> case do
所以,我认为您可以直接输入匿名函数。
【讨论】:
|> (fn input -> do_stuff_here() end).(),否则你是正确的。
case tho - 这很方便!