将变量分配给 case 语句的 return Elixir

assign variable to the return of a case statement Elixir

在 Elixir 中,我可以做吗

foo = ""
foo = case bar do
        _ -> "foo is now this value"
      end

即,将 case 语句的 return 分配给 Elixir 中的变量(我知道你可以用 if 语句做同样的事情)?如果我可以,这是不好的做法吗?

一个case语句可以赋给一个变量,它的值将是匹配的子句之一。

这是一个受您在评论中描述的用例启发的示例:

list =
  case list do
    [{:foo, _} | rest] -> rest
    _ -> list
  end

list 无论如何都会被重新分配,所以如果你想保持它不变,你需要有一个返回原始值的显式子句。如果没有 _ -> list 子句,则会引发 CaseClauseError

这是绝对合法的,无论如何都不是坏习惯。此外, 中的每个语句都return 一个值,因为一切都是宏。

这在任何地方都被广泛使用,即使有人只是为了副作用而忽略了 returned 值,它确实会从任何调用中得到 returned。

Kernel.if/2 is as well a macro, that gets compiled into Kernel.SpecialForms.case/2 behind the scene.

从字面上看,任何东西,包括但不限于 Kernel.def/2 returns 一个值; def/2 returns AST 然后被编译成用于 ErlangVM 的 BEAM。

最常见的例子是 IO.inspect/2,也讽刺地称为 poor man debug,它可以放在代码的任何地方,因为它 return返回它接收到的第一个参数。

IO.inspect({:foo, 42})
# ... some std output

#⇒{:foo, 42}