【问题标题】:is_module guard clause in elixir长生不老药中的 is_module 保护子句
【发布时间】:2018-01-05 22:58:53
【问题描述】:

我将模块传递给函数并希望使用保护子句(函数被设计为具有 :atom 或模块)传递给它。

如何检查函数中的参数是否为模块(例如 is_atom 表示原子?)

【问题讨论】:

    标签: elixir


    【解决方案1】:

    仅使用保护子句是不可能的。为此,我会在函数体中使用Code.ensure_loaded?/1。除了模块存在与否返回true/false之外,如果在代码路径中能找到对应的beam文件,也会尝试加载模块:

    iex(1)> defmodule A do
    ...(1)> end
    iex(2)> Code.ensure_loaded?(A)
    true
    iex(3)> Code.ensure_loaded?(B)
    false
    iex(4)> Code.ensure_loaded?(Map)
    true
    iex(5)> Code.ensure_loaded?(:maps)
    true
    # I created `a.beam` using `erlc` in the same folder as `iex` was started
    iex(6)> Code.ensure_loaded?(:a) 
    true
    

    【讨论】:

    • 嗯,如何在我的函数中使用它作为保护子句?
    • 请看我的编辑。这在保护条款中是不可能的。 is_atom 是您可以在警卫中执行的唯一检查,它将消除不可能是模块的东西,但它无法检查模块是否存在。
    • 嗯,我不想检查模块是否存在,我想检查是否传递了模块而不是原子
    • 模块只是一个原子。 Foo 是 Elixir 中 :"Elixir.Foo" 的语法糖。
    【解决方案2】:

    模块名称是一个原子,因此除了检查 is_atom 之外,您请求的内容是不可能的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      相关资源
      最近更新 更多