【问题标题】:Using dates in guard statements of an erlang function在 erlang 函数的保护语句中使用日期
【发布时间】:2013-01-27 05:33:06
【问题描述】:

我已经定义了如下函数

bc_link_for(Date) when Date < {2010, 1, 4} orelse Date > erlang:date()
    -> "";
bc_link_for(_)
    -> "something".

第二个保护语句是针对未来日期的。当我编译这个程序时,我收到错误illegal guard expression。关于在警戒语句中使用日期类型的在线帮助并不多。

【问题讨论】:

    标签: date erlang guard


    【解决方案1】:

    除了is_integeris_floatis_listlength等特定的守卫功能外,一般不允许在守卫中使用函数。

    但在您的情况下,erlang:date() 是引发错误的原因。

    您只需要在函数内部进行比较:

    bc_link_for(Date) ->
        case Date < {2010, 1, 4} orelse Date > erlang:date() of
            true -> "";
            false -> "something"
        end.
    

    在比较中使用元组在守卫中是完全可以接受的。

    【讨论】:

    • 补充@chops 的出色回复,守卫不能调用任意函数的原因是必须保证它们没有副作用。见goo.gl/KUzFD
    【解决方案2】:

    Guard 表达式在它们允许的范围内受到限制。这是为了帮助优化器,等等。它们记录在这里:

    http://www.erlang.org/doc/reference_manual/expressions.html#id79673

    【讨论】:

    • 所以我的第一个保护声明被接受了,因为它被认为是一个普通的元组而不是日期类型?
    猜你喜欢
    • 2018-03-03
    • 2014-11-25
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多