代码之家  ›  专栏  ›  技术社区  ›  intentionally-left-nil

从生成器构造二进制的理解

  •  0
  • intentionally-left-nil  · 技术社区  · 6 年前

    我正在看 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
    

    如果代码不能独立存在,那么它如何在理解中工作?它在理解之外的其他地方有效吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Dogbert    6 年前

    这就是elixir选择用于二进制理解的语法。另一方面,二郎使用 <= 而不是 <- 对于二元理解:

    % 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 据我所知,宏使用它。 对于 只是elixir中的一个宏,因此您可以定义自己接受相同语法的宏。

    它在理解之外的其他地方有效吗?

    据我所知,没有。