2
在Erlang中,我们可以定义一个像-define(TIME, 60 * 60).
这样的宏,并且从调用宏如?TIME
我们可以确切地知道它们是宏。如何命名一个宏,使它在Elixir中看起来像一个常量?
但是,在Elixir中,宏的调用看起来像一个函数调用。我们无法轻松区分函数调用的宏调用。
那么,有没有一种方法可以命名一些像常量一样的宏呢?
在Erlang中,我们可以定义一个像-define(TIME, 60 * 60).
这样的宏,并且从调用宏如?TIME
我们可以确切地知道它们是宏。如何命名一个宏,使它在Elixir中看起来像一个常量?
但是,在Elixir中,宏的调用看起来像一个函数调用。我们无法轻松区分函数调用的宏调用。
那么,有没有一种方法可以命名一些像常量一样的宏呢?
在Erlang中,一个宏作为模板工作。因此-define(TIME, 60 * 60)
将有效地将60 * 60
引入您的源代码(可能由编译器在此特定情况下预先计算)。
在药剂的等效是:
defmacro time do
quote do
60 * 60
end
end
但这具有完全相同的问题作为一个二郎。如果你真的想计算一些昂贵的东西,它仍然会在运行时在你使用宏time
的所有地方进行计算。
也就是说,药剂具有另一种构建,使您可以预先计算的值,在编译时,和简单地重新使用在你的功能,这是通过属性:
defmodule MyModule do
@time 60 * 60
def using_time do
@time
end
end
你第一个例子没有按” t在模块之外工作,所以不是整个程序中可用的常量。 –
它仍然在上面回答。如果您希望跨模块可用,那么您需要通过函数将其导出。这是唯一的方法。 –
我只是建议您将示例更改为defmodule Clock do macro_defined_here end –