【问题标题】:scala: value is not a member of ListNode[Int]scala:值不是 ListNode [Int] 的成员
【发布时间】:2015-12-17 22:06:19
【问题描述】:

再次,如果这个问题对你来说很愚蠢,欢迎 scala 的新手和 downvote...

好的,我有一个名为“ListNode”的案例类,下面是我得到的错误:

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
         ^

我读过thisthisthisthisthis,但还是不太明白它的含义...

为什么我不能像在 Java 中一样,将下一个节点设置为另一个节点?

非常感谢。

【问题讨论】:

    标签: scala


    【解决方案1】:

    我发现了两个问题(可能还有更多)。

    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)
    

    【讨论】:

      【解决方案2】:

      那是因为您使用的是def,它是一个函数。您可能希望使用 vars 定义案例类。

      下面的代码可以工作,但您可能需要重新考虑可变案例类的整个想法。

      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... 但我认为这是“踢轮胎”代码,而不是生产代码 :-)。

      【讨论】:

      • 感谢您的解释,您说得对,它不是用于生产...只是在玩...对不起,但是这里的“def next_”下划线是什么?不应该在scala中只使用相同的名称“next”而没有下划线吗?
      • 这是 Scala 创建属性的方式。实际发生的情况是,在表达式foo.next=bar 中,您调用foo 的方法next_=,并使用bar 作为参数。当您考虑它时,这很有意义,除了它在来自几乎任何其他语言之后都不直观......我认为这就是 Scala 的状态:-)
      • 非常感谢迈克尔!
      【解决方案3】:

      Scala 中的案例类是不可变的,这意味着您无法更改它们的值。在这种情况下,即使您没有使用案例类,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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多