我有一个包含主构造函数的Kotlin类,代码如下:
这很好运作,因为我实际上没有在次要构造函数中解析
我遇到了一个未解决的引用错误:fullname。它在作用域中不存在,但如果我将它放在大括号中,那么我就无法通过
class Person(first: String, last: String, age: Int){
init{
println("Initializing")
}
}
我想添加一个次要构造函数,将全名解析为first
和last
名称,并调用主构造函数。但是,我无法正确使用语法...
class Person(first: String, last: String, age: Int){
// Secondary constructor
constructor(fullname: String, age: Int):
this("first", "last", age)
{
println("In secondary constructor")
}
init{
println("Initializing")
}
}
这很好运作,因为我实际上没有在次要构造函数中解析
fullname
。当我继续尝试解析fullname时,会出现问题。constructor(fullname: String, age: Int):
var first = fullname.split()[0];
...
{
println("In secondary constructor")
}
我遇到了一个未解决的引用错误:fullname。它在作用域中不存在,但如果我将它放在大括号中,那么我就无法通过
this
调用主构造函数。constructor(fullname: String, age: Int):
{
var first = fullname
this(first, "foo", age)
println("In secondary constructor")
}
我遇到了一个涉及缺少invoke
函数的错误。
很抱歉,在Kotlin文档中找不到这种情况的好例子。
first
和last
变量。但如果您不介意我问一下,为什么必须同时公开Person(first, last, age)
和Person(full name, age)
?如果客户端在使用fullName
时忘记在first
和last
之间添加空格会怎么样?在构造函数委托之前无法声明变量。 - Dioxinthis
是一个委托,这就是为什么你不能在大括号内部使用它的原因。你需要做一些类似于constructor(...) : this(fullName.split(" ")[0], fullName.split(" ")[1])
的事情,这有可能会超出索引范围。 - Dioxinconstructor(fullName)
呢?我能想到的唯一情况是从IO读取,但如果是这种情况,解析IO数据的系统应该分割名字的第一个和最后一个部分。名字应该在到达“Person”时被分割,这不是“Person”类的责任,实现这个功能实际上可能会损害可重用性(如果你有一个由两个单词组成的姓氏怎么办?如果吹奏大号的约翰·范·豪滕(John Van Houten)使用该构造函数会有问题,假设他不想让“Van”成为他的姓氏,也不想将其排除在外)。 - Dioxin