相关疑难解决方法(0)

静态返回类型的Scala宏

所以我有这个宏:

import language.experimental.macros
import scala.reflect.macros.Context

class Foo
class Bar extends Foo { def launchMissiles = "launching" }

object FooExample {
  def foo: Foo = macro foo_impl
  def foo_impl(c: Context): c.Expr[Foo] =
    c.Expr[Foo](c.universe.reify(new Bar).tree)
}
Run Code Online (Sandbox Code Playgroud)

我已经说了三次我想要foo返回一个Foo,但我可以做以下(在2.10.0-RC3中):

scala> FooExample.foo
res0: Bar = Bar@4118f8dd

scala> res0.launchMissiles
res1: String = launching
Run Code Online (Sandbox Code Playgroud)

如果我删除任何一个上的类型参数,也会发生同样的事情c.Expr.如果我真的想确保无论谁打电话foo都看不到他们正在获得Bar,我必须在树本身添加类型归属.

这实际上非常棒 - 例如,我可以将宏指向某种类型的模式,并Vocabulary使用表示词汇表中的术语的成员方法创建某个类的匿名子类,这些将在返回的对象上可用.

我想知道我到底在做什么,所以我有几个问题.首先,该foo方法实际上的返回类型是什么?它是否仅适用于(可选)文档?它明确地约束了返回类型(例如,Int在这种情况下我无法将其更改为),如果我将其完全删除,则会出现如下错误:

scala> FooExample.foo
<console>:8: error: type mismatch;
 found   : Bar
 required: Nothing
              FooExample.foo …
Run Code Online (Sandbox Code Playgroud)

macros types scala scala-2.10 scala-macros

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

如何测试Scala宏?

在scala宏上执行测试的建议方法是什么?

我意识到由于需要单独编译,需要两个项目.如有必要,此步骤可以接受并且大部分都是清楚的.

但是,如何断言宏扩展失败呢?如果没有一些特殊功能,测试用例将无法编译,因此整个测试项目将无法编译.

我认为这个断言需要另一个形式的宏

errors(code: => _): List[CompileError]
Run Code Online (Sandbox Code Playgroud)

它返回内部宏的编译错误.如果他们应该发出警告,那么测试警告也是必需的......等等......

Scala宏是否有一些现有的测试工具?

scala scala-macros

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

Scala中保存动态类型的元组的通用getter方法?

我希望编写一个Scala方法,它接受任意大小和类型的元组以及索引,并返回该索引处元组中的元素.我知道如何做所有事情,但保留类型.我还没有想出一种方法来使返回值成为元组项的动态类型.

这是我到目前为止的功能:

def subscript_get(tup: Product, index:Int): Any={
    return tup.productElement(index)    
}
Run Code Online (Sandbox Code Playgroud)

例如,用法是:

subscript_get((0,1,2,3),0) --> Int = 0

subscript_get((0,1,"asdf",3),2) --> java.lang.String = asdf

我知道我可以将结果反馈给我正在寻找的东西,但这对我不起作用,因为我不能总是知道我应该投射到什么类型.

这样的事情甚至可能吗?谢谢!

generics types scala tuples

6
推荐指数
2
解决办法
1066
查看次数

标签 统计

scala ×3

scala-macros ×2

types ×2

generics ×1

macros ×1

scala-2.10 ×1

tuples ×1