【问题标题】:<< and >> symbols in ErlangErlang 中的 << 和 >> 符号
【发布时间】:2010-11-16 00:00:10
【问题描述】:

首先,我是这里的 Erlang 菜鸟。我需要与 MySQL 数据库交互,我找到了erlang-mysql-driver。我正在尝试,对某些语法有点困惑。

我可以用这个从数据库中获取一行数据(为了简洁起见,这里过于简化了):

Result = mysql:fetch(P1, ["SELECT column1, column2 FROM table1 WHERE column2='", Key, "'"]),  
case Result of  
    {data, Data} ->  
        case mysql:get_result_rows(Data) of  
            [] -> not_found;  
            Res ->  
              %% Now 'Res' has the row

现在这里是 `Res' 的一个例子:

[[<<"value from column1">>, <<"value from column2">>]]

我知道这是一个记录列表。在这种情况下,查询返回 1 行 2 列。

我的问题是:
&lt;&lt;&gt;&gt; 符号是什么意思?将这样的列表转换为我定义的记录的最佳(Erlang 推荐)语法是什么:

-record(  
    my_record,  
    {   
      column1 = ""  
      ,column2 = ""  
    }  
 ).     

【问题讨论】:

    标签: erlang


    【解决方案1】:

    这些是位串理解。

    位串推导类似于列表推导。它们用于高效简洁地生成位串。

    位串推导式使用以下语法编写:

    << BitString || Qualifier1,...,QualifierN >>
    

    BitString 是一个位串表达式,每个限定符要么是一个生成器,要么是一个位串生成器,要么是一个过滤器。

    • 生成器写为:

     Pattern <- ListExpr. 
    

    ListExpr 必须是计算结果为术语列表的表达式。

    • 位串生成器写为:

     BitstringPattern <= BitStringExpr. 
    

    BitStringExpr 必须是计算结果为位串的表达式。

    • 过滤器是一个计算结果为真或假的表达式。 生成器模式中的变量在围绕位串理解的函数子句中隐藏变量。

    位串理解返回一个位串,它是通过连接对所有过滤器都为真的位串生成器元素的每个组合评估BitString 的结果而创建的。

    例子:

    1> << << (X*2) >> || 
    <<X>> <= << 1,2,3 >> >>.
    <<2,4,6>>
    

    【讨论】:

    • 我明白了。谢谢回复。我现在要尝试写一个 MySQL Row -> Record 函数,看看会发生什么......
    • 在我的例子中,我没有任何过滤器或生成器,所以看起来我可以简单地调用 erlang:bitstring_to_list/1。非常感谢!
    • > 最重要的含义是表示二进制文件本身。问题中没有位串理解的迹象!
    【解决方案2】:

    在您的具体示例中,您可以通过匹配返回的列值来进行转换,然后像这样创建一个新记录:

    case mysql:get_result_rows(Data) of
      [] ->
        not_found;  
      [[Col1, Col2]] ->  
        #my_record{column1 = Col1, column2 = Col2}
    end
    

    【讨论】:

      【解决方案3】:

      只是一个小提示:结果不是位串理解,它们只是位串。但是,您可以使用位串推导来生成位串序列(上面使用生成器和那个进行了描述),很像列表和列表推导。

      您可以使用 erlang:binary_to_list/1 和 erlang:list_to_binary/1 在二进制和字符串(列表)之间进行转换。

      mysql 驱动程序返回位字符串的原因是可能因为它们操作起来要快得多。

      【讨论】:

      • 我发现 bitstring_to_list 工作正常。我还必须查找 binary_to_list 。我确实设法让我的代码正常工作,但我一直希望让它更正确。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2011-08-29
      • 2022-08-03
      • 1970-01-01
      • 2015-03-08
      • 2011-12-23
      相关资源
      最近更新 更多