将变量分配给 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
。
这是绝对合法的,无论如何都不是坏习惯。此外,elixir 中的每个语句都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}
在 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
。
这是绝对合法的,无论如何都不是坏习惯。此外,elixir 中的每个语句都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}