我正在查看comprehension docs的长生不老药,我对此片段感到困惑:
for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>
具体来说,这部分:<<c <- " hello world ">>
这究竟是什么?从我的理解c <- " hello world "
是一个生成器,<<>>
是二进制语法。那么,把它放在一起它是一个发电机的二进制?很奇怪,好吧,但也许这类似于python的列表理解,例如[x for x in (1..3)]
然而,它看起来并非如此,因为该声明无法独立存在:
iex(2)> <<c <- " hello world ">>
** (CompileError) iex:2: undefined function <-/2
(elixir) src/elixir_bitstring.erl:65: :elixir_bitstring.expand_expr/4
(elixir) src/elixir_bitstring.erl:32: :elixir_bitstring.expand/6
(elixir) src/elixir_bitstring.erl:12: :elixir_bitstring.expand/4
如果代码不能自立,那么它在理解中如何运作?它是否在理解之外的其他地方有效?
答案 0 :(得分:1)
这只是Elixir选择用于二进制理解的语法。另一方面,Erlang使用<=
代替<-
来进行二元理解:
% List Comprehension
1> [ X || X <- [1, 2, 3] ].
[1,2,3]
% Binary Comprehension
2> [ X || <<X>> <= <<1, 2, 3>> ].
[1,2,3]
如果代码不能独立存在,那么它在理解中如何运作?
此语法是有效的Elixir代码:
iex(1)> quote do: <<c <- " hello world ">>
{:<<>>, [], [{:<-, [], [{:c, [], Elixir}, " hello world "]}]}
但据我所知,只有for
宏使用它。 for
只是Elixir中的一个宏,因此您可以定义自己的宏,这些宏接受相同的语法。
除了理解之外的其他地方有效吗?
据我所知,没有。