我正在尝试解码websocket响应。如果它包含键'符号',我想打印出来。
我做到了这一点:
msg
|>Poison.decode!
|>Enum.member?("symbol")
|>if
|>IO.inspect
不出所料,它不喜欢我的'if'。是否有实现这一目标的管道方式?
答案 0 :(得分:3)
可悲的是,你无法做到,因为You can't pipeline into macros!
要实现您的需要,只需将此if
放入正确的函数中即可。或者甚至更好 - 由于模式匹配,您可以使用不同的函数头进行条件分支!
Enum.member/2
将返回true或false,因此您只需要:
defp processing_the_response(true) do
# something
end
defp processing_the_response(false) do
# something ELSE
end
答案 1 :(得分:1)
Kernel.if/2
定义为2.在你的管道中你用arity为1来调用它。这意味着Kernel.if/1
没有匹配。
另外,您的if
应该返回IO.inspect
来检查
[true, false]
|> Enum.random()
|> if(do: 42, else: "You can't handle the truth")
|> IO.inspect
或者
[true, false]
|> Enum.random()
|> if do
42
else
"You can't handle the truth"
end
|> IO.inspect
或者如果您希望返回表达式本身的结果
["My random data", nil]
|> Enum.random()
|> (fn item -> if(item, do: item, else: "Sorry... no data!") end).()
|> IO.inspect
甚至更好
value
|> something(42)
|> something_else()
|> case do
page where limit_size == nil -> page
page -> page |> limit(size)
end
|> some_more_things()
最后一个例子取自elixir forum
如果您不想通过管道进行管道并偶尔打印,如果有特定的密钥,这里有一种方法
[a: 1, b: 3, c: 15]
|> (fn enumerable -> if(a = Access.get(enumerable, :a), do: IO.inspect(a, label: "The :a")); enumerable end ).()
|> (fn enumerable -> if(f = Access.get(enumerable, :f), do: IO.inspect(f, label: "This shouldn't be printed")); enumerable end ).()
|> IO.inspect(label: "The enumerable")
最好的方法是使用多头功能。
答案 2 :(得分:0)
您的回复实际上是列表还是地图?因为Enum.member?不能在地图上工作。如果它是一个地图,你可以利用elixir为地图做的特殊模式匹配,以更容易的方式实现这一目标
def show_result(%{"symbol" => _value} = msg) do
IO.inspect(msg)
end
def show_result(msg) do
msg
end
此代码中的结果:
msg
|> Poison.decode!
|> show_result