如何根据用户输入创建Scala类?

vkc1a9a2  于 2022-11-09  发布在  Scala
关注(0)|答案(3)|浏览(146)

我有一个需要根据用户输入创建类的用例。
例如,用户输入可以是:“(Int,fieldname1):(字符串,fieldname2):..”,则必须在运行时创建一个类,如下所示

Class Some
{
   Int fieldname1
   String fieldname2
   ..so..on..
}

这是Scala支持的吗?任何帮助都是非常感谢的。

8yparm6h

8yparm6h1#

你的设想似乎没有道理。这与其说是运行时示例化的问题,不如说是一个运行时示例化的问题(JVM当然可以通过反射来做到这一点)。实际上,您所要求的是动态生成一个类,这只有在您的代码稍后使用它时才有用。但是,如果您不知道它看起来是什么样子,那么您的代码以后如何利用它呢?例如,后面的代码如何知道它可以引用哪些字段?

qacovj5a

qacovj5a2#

不,不太喜欢。
类的概念是定义一种可在编译时检查的类型。您看,在运行时创建它可能会与此相矛盾。
您可能希望以不同的方式存储用户输入,例如Map。
您试图通过在运行时创建一个类来实现什么目标?

voj3qocg

voj3qocg3#

我认为这是有意义的,只要您以通用的方式使用您的“数据模型”。
这种方法在这里行得通吗?视情况而定。
如果您的数据来自在运行时读取但在编译时可用的文件,那么您就幸运了并且*类型安全将得到维护。事实上,您将有两个选择。

  • 将您的项目一分为二:
  • 在第一次运行中,以编程方式读取文件并写入新的源代码(作为字符串,或者更好的方式,使用Treehugger)。
  • 在第二次运行中,使用项目的其余部分编译生成的类并正常使用。
  • 如果#1过于“手动”,则使用Macro Annotations。这里的想法是主子项目的编译时间跟随宏子项目的运行时。因此,如果我们为主子项目提供一个“空”类,则可以在编译时使用宏在运行时看到的数据动态地向其添加成员。-要开始,请修改宏以从this example中的文件中读取

否则,如果你的数据“真的”只有在运行时才是可知的,那么@Rob Starling的建议可能会像对我一样适用于你。如果你想当小白鼠,我会和你分享my attempt。为了进行调试,我在里面有一个App.scala,它展示了如何将字符串传递给运行时类生成器,并在运行时使用Java反射访问它,甚至用它定义Scala类型别名。因此,问题是,您的新动态类将在Slick中充当类型参数,还是不能,就像它有时在其他库中所做的那样?

相关问题