问题标签 [scala-reflect]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
118 浏览

scala - 在 Scala 中访问方法的 AST

是否有一种反射方式来访问类方法的 AST?

我想得到这样的东西

因此。

我相信这将是一个编译时的宇宙。

0 投票
2 回答
215 浏览

scala - 从 TypeTag 和方法获取精确的返回类型

说我有

并希望bar在 a 上调​​用时Foo[Int](即Bar[Int]在这种情况下)从类型标记Foo[Int]和名称中获取返回类型"bar"(我们可以假设没有重载,或者我们可以将它们区分开来)。这可以用 scala-reflect 完成吗?

0 投票
1 回答
178 浏览

scala - Scala 反射中的去锯齿类型

如何解决给定的别名Type?IE

我如何Option[Option[_$1]]underlying(或从tpe)获得?我知道typeSymbol确实可以解决别名,但它似乎在此过程中丢失了参数:

0 投票
1 回答
915 浏览

scala - 比较 Scala 反射符号

Types Scaladoc页面警告:

类型相等可以用 =:= 检查。重要的是要注意 == 不应该用于比较类型的相等性 - == 不能在存在类型别名的情况下检查类型相等性,而 =:= 可以。

Symbols没有类似的警告,但是查看实现,它似乎没有覆盖equals。有没有办法比较符号是否相等(即它们是否代表相同的 Scala 类型/val/方法/等)?

对于TypeSymbols 我显然可以使用.toTypeand =:=,所以问题主要是关于TermSymbols 的。

0 投票
1 回答
49 浏览

scala - 使用反射为类实例生成 scala 源

假设您有一个类的实例。生成有效 scala 源代码的最佳方法是什么,可以在运行时将其写入文件并编译该实例?(利用 scala 反射 API/宏?)是否可以将 AST 表示解析为源代码?

0 投票
1 回答
1598 浏览

scala - Scala - TypeTags、ClassTags 和 WeakTypeTags 的运行时性能

简介

...TypeTag[T]封装了一些编译时类型的运行时类型表示T。...
... TypeTags 总是由编译器生成。... [1]

TypeTags 位于scala.reflect.**包中。另一个SO 答案提到使用 java 反射会在您的应用程序中产生运行时性能开销。

问题:s、s 和s 在运行时在
多大程度上使用 java 反射?它们是在编译时生成的,但在使用时会导致运行时性能开销吗?TypeTagClassTagWeakTypeTag

示例

虽然标签是在编译时生成的,但运行时我能感觉到延迟。类型比较是否在底层使用了性能不佳的 java 反射?

0 投票
1 回答
429 浏览

scala - 构造更高种类的类型标签

给定一个简单的参数化类型class LK[A],我可以写

现在我想写一个类似的class HK[F[_], A]

这可能吗?我试过了

但由于明显的原因,两者都不起作用(在第一种情况下F[_]是存在类型而不是更高种类的类型,在第二种TypeTag[F]情况下无法编译)。

我怀疑答案是“不可能”,但如果不是,我会很高兴。

编辑:我们目前使用WeakTypeTags 如下(稍微简化):

如果我们替换为 ,所有这些都可以正常WeakTypeTag工作TypeTag。不幸的是,这不会:

0 投票
2 回答
141 浏览

scala - 当 reflect.runtime.universe._ 存在时,为什么 reflect.runtime.universe.RuntimeClass 会推断为 Nothing?

我偶然发现了一种奇怪的情况,即在似乎更合适的地方推断出reflect.runtime.universe._进口原因。reflect.runtime.universe.RuntimeClassNothing

考虑这个简单的方法和List

我可以使用它来查找某种类型的第一个元素List,并且效果很好,正如预期的那样。

如果我不提供类型参数,则A推断为Nothing,所以我得到Option[Nothing],也如预期的那样。

但是,如果我import scala.reflect.runtime.universe._再次不提供类型参数,A现在推断为reflect.runtime.universe.RuntimeClass而不是Nothing.

这不是一个大问题,因为如果不find手动提供类型参数,我几乎无法想象该方法的很多用例,但为什么会发生这种情况呢?似乎部分归咎于,因为ClassTag再次删除它会导致Nothing推断(尽管由于擦除而完全破坏了该方法)。这里发生了什么?

0 投票
1 回答
3717 浏览

scala - 如何使用反射实例化 Scala 对象

我有一些代码使用反射来实例化 Java 或 Scala 类,允许用户指定名称: 假设loadIt下面是使用这种方法定义的假设方法。

如果是 Scala 类,这很好name用,但如果它是对象,则不行。假设我定义了一个对象:

并将其称为:

我得到错误:

有什么方法可以正确实例化对象吗?

0 投票
2 回答
901 浏览

scala - 为什么我们必须显式指定 ClassTag 类型类

既然 scala 已经迭代到使用 typeclass 的 JVM类型擦除修复ClassTag,为什么它是一个选择加入,而不是让编译器总是捕获类型签名以进行运行时检查。拥有一个隐式参数化类型约束将使得classTag[T]无论泛型参数声明如何都可以调用。

编辑:我应该澄清一下,我并不是说 scala 应该将幕后的签名更改为始终包含ClassTag。相反,我的意思是,既然ClassTag表明 scala 可以捕获运行时类型信息并因此避免类型擦除限制,为什么不能将该捕获作为编译器的一部分隐含,以便该信息始终在 scala 代码中可用?

我怀疑它与向后兼容性、Java 生态系统兼容性、二进制大小或运行时开销相关,但这些只是推测。