2016-12-24 6 views
1

Скажем, у меня есть эта часть конфига в Phoenix/Elixir:Должен ли я использовать макросы в этом случае? Или ...

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

Вы не можете, из-за причины, которую я поставил в первом предложении. Как и Крис МакКорд: первое правило использования макросов - вы не должны использовать макросы. Я понимаю вашу готовность использовать их только потому, что теперь вы можете, но это неправильный путь. Все, что можно сделать без макросов, должно быть сделано без них. – mudasobwa

+0

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

1

Поскольку это файл сценария Elixir, вы можете просто использовать обычные переменные:

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' to' a = b; c = d; e = f; config: foo, Bar, a: a, c: c, e: e' (где 'b',' d' и 'f' - выражения). Думаю, это сработает. – Dogbert

 Смежные вопросы

  • Нет связанных вопросов^_^