【发布时间】:2018-11-01 15:48:58
【问题描述】:
抱歉,我对 Scala 不是很熟悉,但我很好奇这是否可行,但我一直无法弄清楚如何。
基本上,我想创建一些可以生成随机数据样本(在本例中为网格)的便利初始化程序。网格将始终填充特定类型的实例(在本例中为Location)。但在不同的情况下,我可能希望网格填充Location 的不同子类型,例如Farm 或 City。
在 Python 中,这很简单:
def fillCollection(klass, size):
return [klass() for _ in range(size)]
class City: pass
cities = fillCollection(City, 10)
我尝试在 Scala 中做类似的事情,但它不起作用:
def fillGrid[T <: Location](size): Vector[T] = {
Vector.fill[T](size, size) {
T()
}
}
编译器只是说“未找到:值 T”
那么,是否可以在 Scala 中近似上述 Python 代码?如果没有,处理这种情况的推荐方法是什么?我可以为每个子类型编写一个初始化程序,但在我的真实代码中,它们之间有相当多的样板代码重叠,所以如果可能的话,我想分享代码。
到目前为止,我想出的最佳解决方法是将闭包传递给初始化程序(这似乎是 Vectors 上的 fill 方法已经起作用的方式),例如:
def fillGrid[T <: Location](withElem: => T, size: Int = 100): Vector[T] = {
Vector.fill[T](n1 = size, n2 = size)(withElem)
}
这不是很大的不便,但它让我很好奇为什么 Scala 不支持“更简单”的 Python 风格的构造(如果它实际上不支持的话)。我有点明白为什么有一个“完全通用”的初始化程序会导致麻烦,但在这种情况下,我看不出一般初始化所有已知是给定子类型的实例的危害是什么父类型。
【问题讨论】:
标签: scala