我有以下类,嵌套在名为Solution
的对象中:
class TreeNode(l_son: TreeNode, r_son: TreeNode,
l_val: Int, r_val: Int, nr: Int)
此外,在对象Solution
中,我尝试引用其字段:
def query(left: Int, right: Int, node: TreeNode): Int = {
var sum = 0;
if(left <= node.l_val && node.r_val <= right) {
sum = node.nr
}
但是,每次我引用其中一个字段时,都会收到错误:
Solution.scala:36:错误:值l_val不是Solution.TreeNode的成员 if(left&lt; = node.l_val&amp;&amp; node.r_val&lt; = right){ ^ Solution.scala:36:error:value r_val不是Solution.TreeNode的成员 if(left&lt; = node.l_val&amp;&amp; node.r_val&lt; = right){ ^ Solution.scala:37:error:value nr不是Solution.TreeNode的成员 sum = node.nr
我认为为字段自动创建getter和setter。如果这是真的,为什么我不能访问它们?
答案 0 :(得分:4)
class TreeNode(l_son: TreeNode, r_son: TreeNode,
l_val: Int, r_val: Int, nr: Int)
等声明
没有定义任何类成员,只是构造函数参数。你仍然可以在类体中使用它们,就好像它们是成员一样(除了,你不能做this.l_son
),因为整个体是在构造函数中定义的,所以它本质上是一个闭包。
要将类成员定义为构造函数参数,必须在构造函数参数列表中使用val
或var
作为前缀:
class TreeNode(val l_son: TreeNode ...)
案例类的特殊之处在于它们将自动为每个构造函数参数创建一个(不可变的)成员,以及一组使案例类有用的其他自动成员。