我在将C ++数据结构转换为Scala时遇到问题。 Scala与C ++完全不同,但我喜欢它。 我在C ++中有以下代码片段:
struct Output
{
double point;
double solution[6];
};
struct Coeff
{
double rcont1[6];
double rcont2[6];
double rcont3[6];
double rcont4[6];
double rcont5[6];
double rcont6[6];
};
std::list<Output> output;
std::list<Coeff> coeff;
我现在用数据
填充while循环列表while(n<nmax) {
if step successfull
Output out;
out.point = some values;
out.solution[0] = some value;
output.push_back(out);
}
我尝试在Scala中创建一个简单的类来保存数据。
class Output
{
var point: Double
var solution: Array[Double] = new Array(6)
}
但是由于点没有初始化,所以这种方式不起作用。有没有解决的办法?我只想定义变量但不要初始化它。
另一个快速的事情。我正在寻找相当于stl :: lower_bound。
找到在排序容器中插入元素以维持订单的正确位置。
感谢您帮助Scala初学者
答案 0 :(得分:4)
为什么不想初始化它?为了效率?我担心JVM不会让你根据最初的变量随机丢弃变量。因此,无论如何你必须初始化它,为什么不指定你的“未初始化”值是什么?
class Output {
var point = 0.0
var solution = new Array[Double](6)
}
(如果您稍后需要查看该值是否已初始化,则可以使用Double.NaN
并检查point.isNaN
。)
您可以使用_
作为默认初始化,但除非您在通用代码中使用它:
class Holder[T] {
var held: T = _
}
然后你只是模糊了真正设定的价值。 (或者你宣布“我真的不在乎这里发生了什么,它可能是任何东西” - 这可能是有用的。)
答案 1 :(得分:3)
我刚刚找到了初学者的答案:
class Output
{
var point: Double = _
var solution: Array[Double] = Array(6)
}
Puh Scala有很多习惯用于: - )
任何人都有针对lower_bound等效项的解决方案吗?
答案 2 :(得分:3)
很难有效地翻译,因为你在伪代码背后隐藏了许多未知数,但我提倡这些方面的东西:
// type alias
type Coeff = Seq[Seq[Double]]
// parameters passed to a case class become member fields
case class Output (point: Double, solution: Seq[Double])
val outputs = (0 to nmax) map { n =>
Output(generatePoint(n), generateSolution(n))
}
如果你能更充分地充实你的示例代码,我将能够提供更好的翻译。