相关疑难解决方法(0)

Scala:编译时间常数

如何在Scala中声明编译时常量?在C#中,如果你声明

const int myConst = 5 * 5;
Run Code Online (Sandbox Code Playgroud)

myConst以字面值25表示.是:

final val myConst = 5 * 5
Run Code Online (Sandbox Code Playgroud)

等价还是有其他机制/语法?

scala constants

5
推荐指数
2
解决办法
1251
查看次数

为什么Scala无法按照文档进行工作?

2.10.3的Scala API文档说我可以"使用refiy生成表示给定Scala表达式的抽象语法树".因此,我可以这样做:

scala> val uni = scala.reflect.runtime.universe 
uni: scala.reflect.api.JavaUniverse = scala.reflect.runtime.JavaUniverse@4e42766

scala> uni reify { 1 to 3 } 
res2: uni.Expr[scala.collection.immutable.Range.Inclusive] = Expr[scala.collection.immutable.Range.Inclusive](Predef.intWrapper(1).to(3))
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我得到了我正在寻找的东西:( Predef.intWrapper(1).to(3))一个方便的扩展表示要执行的操作).

1 + 3然而,当我试图进行具体化时,我并不表示要执行我想要的操作.

scala> uni reify { 1 + 3 }
res5: uni.Expr[Int(4)] = Expr[Int(4)](4)
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?是+原始的操作,因此,没有具体化?

Scala文档显示了一个具体化的例子,暗示了一个更有用的表示形式:

reify{ 2 + 4 } // Apply( Select( Literal(Constant(2)), newTermName("$plus")), List( Literal(Constant(4)) ) )
Run Code Online (Sandbox Code Playgroud)

如何检查1 + 3(如果存在)适当的扩展表示,以及如何检索任何表达式的详细表示(紧接在上面)?

编辑:我现在看到Scala文档中的表示显示是由showRaw.但是,我仍然无法重现上面示例中的原始表示形式2 + 4.

scala abstract-syntax-tree reification

1
推荐指数
1
解决办法
176
查看次数