2016-12-24 152 views
1

说,我在凤凰城/药剂一个配置的这一部分:我应该在这种情况下使用宏吗?或...

use Mix.Config 

config :my_app, MyApp.Endpoint, 
    var1: 111, 
    var2: 222, 
    var3_depends_on_var2: ???? # var2 + 666 

我想“var3_depends_on_var2”依赖于“VAR2”的价值,同时我不想明确复制粘贴它。如果我不能引用它,我相信我应该使用宏而不是。是这样吗?如果是,如何?这是值得的努力?

回答

2

由于这些线路都不过是在调用Mix.config/3,并在最后一个参数寄托都发生了,这是一个Keyword名单,不能简单地从另一声明中是指一个Keyword值。

你可以使用什么样的只是初步var声明:

use Mix.Config 
var = 222 

config :my_app, MyApp.Endpoint, 
    var1: 111, 
    var2: var, 
    var3_depends_on_var2: var + 666 
+0

好吧,但我怎么用宏来做到这一点? – Saurabh

+0

由于我放在第一句话的原因,你不能。正如Chris McCord所说:使用宏的第一条规则是你不应该使用宏。我明白你愿意使用它们,只是因为现在你可以使用它们,但这是一种错误的方式。没有宏的任何事情都应该在没有宏的情况下完成。 – mudasobwa

+0

ненучетыблинвсамомделе? – Saurabh

1

因为这是一个花好月圆的脚本文件,你可以使用正常的变量:

use Mix.Config 

var2 = 222 

config :my_app, MyApp.Endpoint, 
    var1: 111, 
    var2: var2, 
    var3_depends_on_var2: var2 + 666 

我想不出任何不是超级复杂的方式与宏做到这一点。

+0

没有甚至超复杂的方式与宏做到这一点,因为'var2'碰巧出现在同一个术语声明为'var3'内。由于“关键字”本身尚未定义,因此目前无法通过“关键字”访问它。 – mudasobwa

+0

我的超级复杂的方法是将'myconfig:foo,Bar,a:b,c:d,e:f'重写为'a = b; c = d; e = f; config:foo,Bar,a:a,c:c,e:e'(其中'b','d'和'f'是表达式)。我认为这会奏效。 – Dogbert

相关问题