【问题标题】:Extract only the number from a ref in erlang仅从 erlang 中的 ref 中提取数字
【发布时间】:2015-10-02 22:52:38
【问题描述】:

我是 Erlang 的新手。 我只需要获取从 make_ref() 返回的数字。 所以,如果 make_ref() 返回 :#Ref 我想从中提取 441。

知道怎么做吗?

【问题讨论】:

  • 你为什么需要这个?
  • 我需要创建一个 uniqe 编号,并且 ref 中有它
  • 无法保证 ref 中具有唯一编号。 ref 保证是唯一的,但数字是 ref 作为字符串的 representation。这绝对不是生成唯一数字的正确方法。
  • 另请注意,现代 Erlang 运行时具有 erlang:unique_integer 函数,它正是这样做的

标签: functional-programming erlang


【解决方案1】:

试试这个:

unique_integer() ->
    try
        erlang:unique_integer()
    catch
        error:undef ->
            {MS, S, US} = erlang:now(),
            (MS*1000000+S)*1000000+US
    end.

编辑: 此解决方案与使用io_lib:format("~p", [Ref]) 提取整数之间的主要区别在于速度。当我的解决方案在 R18 中花费大约 40ns 时,转换为列表、正则表达式并返回到整数需要 9µs。我会选择快两个数量级的解决方案。

【讨论】:

    【解决方案2】:

    erlang:ref_to_list/1 函数将引用转换为列表,但文档警告不要在生产代码中使用它。我们可以改用io_lib:format/2。将 ref 转换为列表后,我们可以使用正则表达式提取数字。

    这是一个从 ref 的字符串表示中提取数字的函数:

    extract_from_ref(Ref) when is_reference(Ref) ->
        [RefString] = io_lib:format("~p", [Ref]),
        {match, L} = re:run(RefString,
                            "#Ref<(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)>",
                            [{capture, all_but_first, list}]),
        IntList = lists:map(fun list_to_integer/1, L),
        list_to_tuple(IntList).
    

    要仅获取 ref 的字符串表示形式的最后一个数字,您可以像这样使用它:

    {_, _, _, N} = extract_ref(make_ref()).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2016-10-27
      • 2017-05-29
      • 2016-12-13
      • 2019-09-14
      • 2021-07-28
      相关资源
      最近更新 更多