我再说一遍,如果这个问题对你来说很愚蠢,欢迎新手使用scala和downpvote。。。
好的,我有一个名为"ListNode"的case类,下面是我得到的错误:
scala> case class ListNode[Int](vl: Int, nt: ListNode[Int] = null) {
| def value: Int = vl
| def next: ListNode[Int] = nt
| }
defined class ListNode
scala> var a = ListNode(1)
a: ListNode[Int] = ListNode(1,null)
scala> var b = ListNode(2)
b: ListNode[Int] = ListNode(2,null)
scala> a.next = b
<console>:11: error: value next_= is not a member of ListNode[Int]
a.next = b
^
我读过这个、这个、这个和这个,但仍然不明白它的意思。。。
为什么我不能像在Java中那样,将下一个节点设置为另一个节点?
非常感谢。
我看到两个问题(可能还有更多)。
1-您的类型参数应该是一个参数,而不是Int
规范。
2-如果要重新分配next
的值,则它需要是var
。
case class ListNode[T](vl: T, nt: ListNode[T] = null) {
val value: T = vl
var next: ListNode[T] = nt
}
scala> val a = ListNode(1)
a: ListNode[Int] = ListNode(1,null)
scala> val b = ListNode(2)
b: ListNode[Int] = ListNode(2,null)
scala> a.next = b
a.next: ListNode[Int] = ListNode(2,null)
当然,作为一个案例类,它可以大大简化。
// this is all you need
case class ListNode[T](value: T, var next: ListNode[T] = null)
这是因为您使用的是def
,它是一个函数。您可能想要使用vars来定义case类。
下面的代码会起作用,但您可能需要重新考虑可变事例类的整个概念。
case class ListNode[Int](v1:Int, nt:ListNode[Int]=null) {
var _nt = nt
def value: Int = v1
def next: ListNode[Int] = _nt
def next_=( newNext:ListNode[Int] ) = { _nt = newNext }
}
scala> val a = ListNode(1,null)
a: ListNode[Int] = ListNode(1,null)
scala> a.next = ListNode(2,null)
a.next: ListNode[Int] = ListNode(2,null)
请注意,理想情况下,更改案例类是通过复制完成的:
scala> a.copy( v1=500 )
res0: ListNode[Int] = ListNode(500,null)
此外,如果某个东西可能是null
,你可以考虑用Option
包装它。。。但我认为这是一个"踢轮胎"代码,而不是生产代码:-)。
next
也是一个函数(它是用def
定义的),因此尝试为其赋值是没有意义的。
另外,在Scala中使用null
不是一个好的做法。最好使用Option类。有几种方法可以更改代码来解决问题。如果您想使用可变类,请考虑以下内容:
class ListNode[Int](value: Int, nt: Option[ListNode[Int]] = None) {
var next = nt
}
object ListNode {
def apply(value: Int, nt: Option[ListNode[Int]] = None) = new ListNode[Int](value, nt)
}
var a = ListNode(1)
var b = ListNode(2)
a.next = Some(b)