【问题标题】:Should I use a macros in this case? Or ...在这种情况下我应该使用宏吗?要么 ...
【发布时间】:2017-05-09 15:55:11
【问题描述】:

说,我在 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”,同时我不想显式复制粘贴它。如果我不能参考它,我相信我应该改用宏。是这样吗?如果是,如何?值得付出努力吗?

【问题讨论】:

    标签: macros elixir phoenix-framework


    【解决方案1】:

    由于这些行只不过是对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
    

    【讨论】:

    • 你不能,因为我在第一句话中的原因。正如 Chris McCord 所说:使用宏的第一条规则是你不应该使用宏。我理解你愿意使用它们只是因为现在你可以,但这是错误的方式。没有宏可以完成的所有事情都应该没有宏来完成。
    • не ну че ты блин в самом деле?
    • Использование макросов просто «потому что могу» — очень плохая практика。 Почитайте Metaprogramming Elixir Криса, серьезно。
    • 我的意思是,从技术上讲,您可以编写一个宏来扩展此代码或其他内容。但是你最好用这种方式编写它而不是使用低值间接
    【解决方案2】:

    由于这是一个 Elixir 脚本文件,你可以只使用普通变量:

    use Mix.Config
    
    var2 = 222
    
    config :my_app, MyApp.Endpoint,
      var1: 111,
      var2: var2,
      var3_depends_on_var2: var2 + 666
    

    我想不出任何不超级复杂的方法来使用宏来做到这一点。

    【讨论】:

    • 使用宏甚至没有超级复杂的方法可以做到这一点,因为var2 恰好出现在与var3 相同的术语声明中。由于Keyword 本身尚未定义,目前无法通过Keyword 访问它。
    • 我超级复杂的方法是将myconfig :foo, Bar, a: b, c: d, e: f重写为a = b; c = d; e = f; config :foo, Bar, a: a, c: c, e: e(其中bdf是表达式)。我认为这会奏效。
    猜你喜欢
    • 2011-01-17
    • 2022-07-22
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多