Scala宏,他们在哪里使用?
我只是注意到
Scala有宏,但是我从来没有看过任何使用它们的代码.它们也似乎与C预处理器宏等不同.阅读通过
overview的宏,它看起来并不像他们提供以前在Scala以前不可能的任何东西.在动机标题下,有一些宏可以启用的东西:
稍后在菜单中,有实验性的宏功能,如宏类型,quasiquotes,无类型的宏等等.显然有这个需求! 所有这些似乎都是为建立非常复杂的图书馆,对Scala有很强的了解的人们的好功能.但是,宏会为平均Scala开发人员提供一些东西吗?使用宏会使我的Scala代码更好吗? 解决方法
作为“平均”Scala开发人员,您很可能不会自己编写宏,除非您有非常好的理由.
宏是一种编译时间元编程的方法,也就是说你编程程序.例如,作为Scala 2.10的一部分的def宏(尽管仍然是“实验性”)看起来像一个常规的方法,但是只要您在代码中调用该方法,编译器将用该方法后隐藏的任何宏替换该调用将产生(一个新的代码片段). 一个很简单的例子.将您的项目编译到代码中的日期: import java.util.Date import reflect.macros.Context import language.experimental.macros object CompileTime { def apply(): Date = macro applyImpl def applyImpl(c: Context)(): c.Expr[Date] = { import c.universe._ val now = System.currentTimeMillis() // this is executed during compilation! val nowExpr = c.Expr[Long](Literal(Constant(now))) val code = reify(new Date(nowExpr.splice)) c.Expr(code.tree) } } 使用该宏(以下代码必须与上述宏代码分开编译): object MacroTest extends App { println(s"This project was compiled on ${CompileTime()}") } (如果你多次运行,你会看到编译时间确实是恒定的) 所以简而言之,宏提供了以前没有的任何Scala版本的功能.你可以用宏做的事情,你不能用其他方式(通常你可以使用运行时反射来编写类似的东西,但在编译时检查宏). 然而,作为一个用户,您将会越来越多地了解到包含宏的库,因为它们可以提供完全类型安全的强大的构造.例如,可以使用宏来自case的自动序列化程序,因为宏可以检查您的案例类的类型并构建正确的程序结构(AST)来读取和写入该案例类,而不会有运行时的危险失败. 一些随机链接 > https://github.com/retronym/macrocosm (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |