问题标签 [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.
scala - 在 Scala 中访问方法的 AST
是否有一种反射方式来访问类方法的 AST?
我想得到这样的东西
因此。
我相信这将是一个编译时的宇宙。
scala - 从 TypeTag 和方法获取精确的返回类型
说我有
并希望bar
在 a 上调用时Foo[Int]
(即Bar[Int]
在这种情况下)从类型标记Foo[Int]
和名称中获取返回类型"bar"
(我们可以假设没有重载,或者我们可以将它们区分开来)。这可以用 scala-reflect 完成吗?
scala - Scala 反射中的去锯齿类型
如何解决给定的别名Type
?IE
我如何Option[Option[_$1]]
从underlying
(或从tpe
)获得?我知道typeSymbol
确实可以解决别名,但它似乎在此过程中丢失了参数:
scala - 使用反射为类实例生成 scala 源
假设您有一个类的实例。生成有效 scala 源代码的最佳方法是什么,可以在运行时将其写入文件并编译该实例?(利用 scala 反射 API/宏?)是否可以将 AST 表示解析为源代码?
scala - Scala - TypeTags、ClassTags 和 WeakTypeTags 的运行时性能
简介:
...
TypeTag[T]
封装了一些编译时类型的运行时类型表示T
。...
...TypeTag
s 总是由编译器生成。... [1]
TypeTag
s 位于scala.reflect.**
包中。另一个SO 答案提到使用 java 反射会在您的应用程序中产生运行时性能开销。
问题:s、s 和s 在运行时在
多大程度上使用 java 反射?它们是在编译时生成的,但在使用时会导致运行时性能开销吗?TypeTag
ClassTag
WeakTypeTag
示例:
虽然标签是在编译时生成的,但运行时我能感觉到延迟。类型比较是否在底层使用了性能不佳的 java 反射?
scala - 构造更高种类的类型标签
给定一个简单的参数化类型class LK[A]
,我可以写
现在我想写一个类似的class HK[F[_], A]
:
这可能吗?我试过了
但由于明显的原因,两者都不起作用(在第一种情况下F[_]
是存在类型而不是更高种类的类型,在第二种TypeTag[F]
情况下无法编译)。
我怀疑答案是“不可能”,但如果不是,我会很高兴。
编辑:我们目前使用WeakTypeTag
s 如下(稍微简化):
如果我们替换为 ,所有这些都可以正常WeakTypeTag
工作TypeTag
。不幸的是,这不会:
scala - 当 reflect.runtime.universe._ 存在时,为什么 reflect.runtime.universe.RuntimeClass 会推断为 Nothing?
我偶然发现了一种奇怪的情况,即在似乎更合适的地方推断出reflect.runtime.universe._
进口原因。reflect.runtime.universe.RuntimeClass
Nothing
考虑这个简单的方法和List
:
我可以使用它来查找某种类型的第一个元素List
,并且效果很好,正如预期的那样。
如果我不提供类型参数,则A
推断为Nothing
,所以我得到Option[Nothing]
,也如预期的那样。
但是,如果我import scala.reflect.runtime.universe._
再次不提供类型参数,A
现在推断为reflect.runtime.universe.RuntimeClass
而不是Nothing
.
这不是一个大问题,因为如果不find
手动提供类型参数,我几乎无法想象该方法的很多用例,但为什么会发生这种情况呢?似乎部分归咎于,因为ClassTag
再次删除它会导致Nothing
推断(尽管由于擦除而完全破坏了该方法)。这里发生了什么?
scala - 如何使用反射实例化 Scala 对象
我有一些代码使用反射来实例化 Java 或 Scala 类,允许用户指定名称: 假设loadIt
下面是使用这种方法定义的假设方法。
如果是 Scala 类,这很好name
用,但如果它是对象,则不行。假设我定义了一个对象:
并将其称为:
我得到错误:
有什么方法可以正确实例化对象吗?
scala - 为什么我们必须显式指定 ClassTag 类型类
既然 scala 已经迭代到使用 typeclass 的 JVM类型擦除修复ClassTag
,为什么它是一个选择加入,而不是让编译器总是捕获类型签名以进行运行时检查。拥有一个隐式参数化类型约束将使得classTag[T]
无论泛型参数声明如何都可以调用。
编辑:我应该澄清一下,我并不是说 scala 应该将幕后的签名更改为始终包含ClassTag
。相反,我的意思是,既然ClassTag
表明 scala 可以捕获运行时类型信息并因此避免类型擦除限制,为什么不能将该捕获作为编译器的一部分隐含,以便该信息始终在 scala 代码中可用?
我怀疑它与向后兼容性、Java 生态系统兼容性、二进制大小或运行时开销相关,但这些只是推测。