Scala构造函数重载参数不生效
Scala constructor overloading parameter is not taking effect
我试图了解我实现构造函数重载的方式有什么问题。我想在具有同名成员的 class 中添加一个接受参数 count
的构造函数。
想法是 count
根据默认构造函数参数之一进行计算,除非它通过重载构造函数传递。我稍后展示代码。
为了说服自己这可行,我构建了一个快速简单的测试:
import org.scalatest.FunSuite
class ConstructorOverloadTest extends FunSuite {
test("Overload parameter shadows class member") {
val actual = new TestME(200).length
200 === actual
1 !== actual
}
class TestME(name:String) {
val length = name.length
def this(length:Int) = {
this("*")
}
}
}
测试按预期通过。这让我明白重载构造函数参数 length
shadows/replaces class 成员 length
.
但是当我在另一个 class 中执行相同操作时,class 成员不是 shadowed/replaced。
class MyClass(input1: Array[Float], input2: Array[Byte], input3: Array[Float]) {
val count = input2.length
val index = doSomething()
def this(count: Int) = {
this(Array(), Array(), Array())
}
def printCount() = {
if (this.count == 0)
println("ZERO")
else
println("OTHER")
}
}
当我使用这个class如下
val myInstance = new MyClass(200)
myInstance.printCount()
我希望它能在屏幕上打印 OTHER
。相反,它打印 ZERO
.
为什么?
您的测试似乎有问题。 new TestME(200).length
returns 1
,说明构造参数实际上并没有覆盖length
.
class TestME(name:String) {
val length = name.length
def this(length:Int) = {
this("*")
}
}
println(new TestME(200).length)
1
根据 summerbulb 的评论:
测试的断言应该包含在 assert
:
// Closer to correct...
assert(200 === actual)
assert(1 !== actual)
应按以下顺序传递实际值和预期值:
// Correct!
assert(actual === 200)
assert(actual !== 1)
我试图了解我实现构造函数重载的方式有什么问题。我想在具有同名成员的 class 中添加一个接受参数 count
的构造函数。
想法是 count
根据默认构造函数参数之一进行计算,除非它通过重载构造函数传递。我稍后展示代码。
为了说服自己这可行,我构建了一个快速简单的测试:
import org.scalatest.FunSuite
class ConstructorOverloadTest extends FunSuite {
test("Overload parameter shadows class member") {
val actual = new TestME(200).length
200 === actual
1 !== actual
}
class TestME(name:String) {
val length = name.length
def this(length:Int) = {
this("*")
}
}
}
测试按预期通过。这让我明白重载构造函数参数 length
shadows/replaces class 成员 length
.
但是当我在另一个 class 中执行相同操作时,class 成员不是 shadowed/replaced。
class MyClass(input1: Array[Float], input2: Array[Byte], input3: Array[Float]) {
val count = input2.length
val index = doSomething()
def this(count: Int) = {
this(Array(), Array(), Array())
}
def printCount() = {
if (this.count == 0)
println("ZERO")
else
println("OTHER")
}
}
当我使用这个class如下
val myInstance = new MyClass(200)
myInstance.printCount()
我希望它能在屏幕上打印 OTHER
。相反,它打印 ZERO
.
为什么?
您的测试似乎有问题。 new TestME(200).length
returns 1
,说明构造参数实际上并没有覆盖length
.
class TestME(name:String) {
val length = name.length
def this(length:Int) = {
this("*")
}
}
println(new TestME(200).length)
1
根据 summerbulb 的评论:
测试的断言应该包含在
assert
:// Closer to correct... assert(200 === actual) assert(1 !== actual)
应按以下顺序传递实际值和预期值:
// Correct! assert(actual === 200) assert(actual !== 1)