如何基于用户输入创建scala类?

如何基于用户输入创建scala类?,scala,Scala,我有一个用例,需要根据用户输入创建一个类 例如,用户输入可以是:Int,fieldname1:String,fieldname2:。。等 然后必须在运行时创建一个类,如下所示 Class Some { Int fieldname1 String fieldname2 ..so..on.. } 这是Scala支持的吗?非常感谢您的帮助。不,不太感谢 类的思想是定义一个可以在编译时检查的类型。你看,在运行时创建它会有点矛盾 您可能希望以不同的方式存储用户输入,例如地图 通过在运行

我有一个用例,需要根据用户输入创建一个类

例如,用户输入可以是:Int,fieldname1:String,fieldname2:。。等 然后必须在运行时创建一个类,如下所示

Class Some
{
   Int fieldname1
   String fieldname2
   ..so..on..
}
这是Scala支持的吗?非常感谢您的帮助。

不,不太感谢

类的思想是定义一个可以在编译时检查的类型。你看,在运行时创建它会有点矛盾

您可能希望以不同的方式存储用户输入,例如地图

通过在运行时创建类,您试图实现什么目标?

不,不太可能

类的思想是定义一个可以在编译时检查的类型。你看,在运行时创建它会有点矛盾

您可能希望以不同的方式存储用户输入,例如地图


通过在运行时创建类,您试图实现什么目标?

您的场景似乎没有意义。这不是运行时实例化的问题,JVM当然可以通过反射来实现这一点。实际上,您所要求的是动态生成一个类,只有当您的代码稍后使用它时,这个类才有用。但是,如果您不知道它是什么样子,那么您的代码以后如何使用它呢?例如,您以后的代码如何知道它可以引用哪些字段?

您的场景似乎没有意义。这不是运行时实例化的问题,JVM当然可以通过反射来实现这一点。实际上,您所要求的是动态生成一个类,只有当您的代码稍后使用它时,这个类才有用。但是,如果您不知道它是什么样子,那么您的代码以后如何使用它呢?例如,您以后的代码如何知道它可以引用哪些字段?

我认为这是有意义的,只要您以通用方式使用数据模型

这种方法在这里有效吗?视情况而定

如果您的数据来自一个在运行时读取但在编译时可用的文件,那么您很幸运,类型安全性将得到维护。事实上,你有两个选择

将项目分为两部分:

在第一次运行中,读取文件并写入新源 以编程方式作为字符串,或者更好地使用

在第二次运行中,使用项目的其余部分编译生成的类并正常使用它

如果1太手动,则使用。这里的想法是主子项目的编译时间遵循宏子项目的运行时。因此,如果我们为主子项目提供一个空类,则可以在编译时使用宏在运行时看到的数据动态地向其添加成员。-要开始,请修改宏以从中的文件读取


否则,如果您认为数据确实只有在运行时才能知道,那么@Rob Starling的建议可能会像我一样对您有效。如果你想成为一只豚鼠,我会和你分享。对于调试,我有一个App.scala,它展示了如何将字符串传递给运行时类生成器,并在运行时使用Java反射访问它,甚至使用它定义scala类型别名。所以问题是,您的新动态类是否会在Slick中用作类型参数,或者不能,就像它有时在其他库中所做的那样

我认为这是有道理的,只要您以通用的方式使用数据模型

这种方法在这里有效吗?视情况而定

如果您的数据来自一个在运行时读取但在编译时可用的文件,那么您很幸运,类型安全性将得到维护。事实上,你有两个选择

将项目分为两部分:

在第一次运行中,读取文件并写入新源 以编程方式作为字符串,或者更好地使用

在第二次运行中,使用项目的其余部分编译生成的类并正常使用它

如果1太手动,则使用。这里的想法是主子项目的编译时间遵循宏子项目的运行时。因此,如果我们为主子项目提供一个空类,则可以在编译时使用宏在运行时看到的数据动态地向其添加成员。-要开始,请修改宏以从中的文件读取


否则,如果您认为数据确实只有在运行时才能知道,那么@Rob Starling的建议可能会像我一样对您有效。如果你想成为一只豚鼠,我会和你分享。对于调试,我有一个App.scala,它展示了如何将字符串传递给运行时类生成器,并在运行时使用Java反射访问它,甚至使用它定义scala类型别名。所以问题是,您的新动态类是否会在Slick中用作类型参数,或者不能,就像它有时在其他库中所做的那样

嗯。。。一方面,scala的类型系统特别关注编译时,并在运行时丢弃大量类型信息,另一方面,我很确定您可以生成java字节码并将其输入类加载器以定义新的c语言
在运行时运行。然而,使用它同样会很乏味,而且会涉及反射。我正试图用Slick导出数据库结果。Slick需要一个模式来获取类型化信息。在我的例子中,返回的结果是动态的。所以,我必须以某种方式在运行时创建一个类,您可以使用Slick的普通SQL查询来获得通用结果PositionedResult,并根据自己的喜好映射它们。好好看看。。。一方面,scala的类型系统特别关注编译时,并在运行时丢弃大量类型信息,另一方面,我很确定您可以生成java字节码,并将其提供给类加载器,以便在运行时定义新的类。然而,使用它同样会很乏味,而且会涉及反射。我正试图用Slick导出数据库结果。Slick需要一个模式来获取类型化信息。在我的例子中,返回的结果是动态的。所以,我必须以某种方式在运行时创建一个类,您可以使用Slick的普通SQL查询来获得通用结果PositionedResult,并根据自己的喜好映射它们。谢谢朱利安,我想我需要的是案例类生成器。我会尝试一下,让你知道。Case类是Slick用来查询数据的。因此,如果您的包提供具有运行时类型的Case类,那么我的问题将得到解决。在运行时获取类是容易的部分,确保它被视为正确的类型是棘手的部分。因此,通过反射使用类是可行的,但是Slick不使用它们作为类型参数吗?一些库可以使用生成的类作为类型参数,其他库则以某种方式限制了它。谢谢Julian,我认为case类生成器正是我所需要的。我会尝试一下,让你知道。Case类是Slick用来查询数据的。因此,如果您的包提供具有运行时类型的Case类,那么我的问题将得到解决。在运行时获取类是容易的部分,确保它被视为正确的类型是棘手的部分。因此,通过反射使用类是可行的,但是Slick不使用它们作为类型参数吗?有些库可以使用生成的类作为类型参数,而其他库则以某种方式使用它。您的论点是正确的。我以后不能用它了。你的建议是什么?你的论点是正确的。我以后不能用它了。你有什么建议?