【发布时间】:2015-09-19 08:58:00
【问题描述】:
我偶然发现了这一点,它在我目前正在编写的 OpenGL 应用程序中引起了问题,所以我不得不问:
abstract class Entity
{
protected var modelMatrixLocation: Int = _
protected var modelViewProjectionMatrixLocation: Int = _
}
class ConcreteEntity extends Entity
{
modelMatrixLcoation: Int = getUniformLocation(shaderID, "modelMatrix")
println(modelMatrixLocation)
println(modelViewProjectionMatrixLocation)
}
具体实体打印出来
0
0
现在显然现实世界的例子有点复杂,但这正是发生的事情。我有两个 Ints 代表着色器中制服的位置,但忘记初始化一个。
然后我不得不进行大量调试以找出为什么我的着色器表现如此奇怪(在它工作之前 - 这纯粹是巧合,因为从未使用过 modelMatrix 但设置了 modelViewProjectionMatrix,所以一切都奇迹般地工作了)
所以我的问题: 1.) 为什么未初始化的变量 Int 设置为 0? (而不是,例如,-1)我的意思是,-1 会更合适,因为它不会与 SQL 查询、Collection-object-fetching 或类似的东西发生冲突——在计算机科学中,我们通常从 0 开始计数,所以 -1 会抛出一个更明显的错误。
2.) 我怎样才能避免这种情况?我如何确保 abstract class Entity 中的所有变量都被真正填充?
我的意思是,我可能会这样做:
protected var modelMatrixLocationName: String = _
protected val modelMatrixLocation: Int = getUniformLocation(shaderID, "modelMatrixLocationName")
稍作调整,但这很丑。
另一种方法是改用Option。一方面,这似乎是一种很好的(r)方式来处理这个问题,但我仍然需要使用一个 var,我想避免这种情况。一路vals! ;)
有更好的想法吗?
【问题讨论】:
-
_不会留下未初始化的变量,它会显式地将它们初始化为默认值,对于Int,它是 0。 -
但是在Scala中没有办法只
declare一个变量,是吗?
标签: scala variables initialization var