Elixir 使用命名参数将管道插入到案例中

Elixir 使用命名参数将管道插入到案例中,elixir,Elixir,在case语句中使用piped参数的语法是什么?我好像到处都找不到。我有两个“想法”,但我不知道哪一个是正确的,如果有的话 something |> do_something() |> case do nil -> {:error, "ITS REAL NIL"} %MyStruct{} -> Methods.next_something(&1.attrib) _ -> {:error, "NAH BRUH. THE

在case语句中使用piped参数的语法是什么?我好像到处都找不到。我有两个“想法”,但我不知道哪一个是正确的,如果有的话

something
|> do_something()
|> case do
  nil -> {:error, "ITS REAL NIL"}
  %MyStruct{} -> Methods.next_something(&1.attrib)
  _ -> {:error, "NAH BRUH. THE WEIRD HAPPENED."}
这应该有用

something
|> do_something()
|> case do
  nil -> {:error, "ITS REAL NIL"}
  %MyStruct{atrib: atrib} -> Methods.next_something(atrib)
  _ -> {:error, "NAH BRUH. THE WEIRD HAPPENED."}
end

管道与这个问题无关。这将有助于:

case%{foo:bar}do
map=%{}->{:success,map.foo}
结束
但更清晰、更好的做法是匹配左侧的值,您希望在右侧使用这些值:

case%{foo:bar}do
%{foo:foo}->{foo:success,foo}
结束

这个问题本身揭示了你对
做什么的根本性误解

接受两个参数:
条件
子句
。和
做。。。end
语法只是
do:…
关键字列表参数的语法糖,由编译器内联

当您有一个arity 2的函数时,您可以毫不犹豫地使用管道操作符将第一个参数传递到那里,而将第二个参数保持不变<代码>做。。。end
块就是第二个参数

考虑以下代码:

case:ok,do:(:ok->42;u->nil)
#⇒ 42
以上相当于

case(:ok,[do:(:ok->42;u->nil)])
#⇒ 42
现在我们显然看到了两个参数,第一个是类型
term()
,第二个是关键字列表。就这样

因此,不能有任何捕获的参数:我们没有捕获,我们有一个常规调用(对宏
case


也就是说,您的第二种方法是正确的。

没错,只需添加
结尾
,因为您不能在捕获之外使用&1,第二种方法似乎更正确,它如何回答所述问题?在我看来,这是一个XY问题,OP实际上是在询问模式匹配在案例陈述中是如何工作的,所以我演示了这一点(这是有用的,而不是没有用的,正如否决票所建议的那样)。是否使用管道与匹配的工作方式无关。老实说,我不确定OP为什么不尝试编译这两个版本。虽然它回答了所述的问题,但答案本身质量很差,几乎无法解释什么和为什么。
something
|> do_something()
|> case do
  nil -> {:error, "ITS REAL NIL"}
  %MyStruct{atrib: atrib} -> Methods.next_something(atrib)
  _ -> {:error, "NAH BRUH. THE WEIRD HAPPENED."}
end