

Scala初心者です。（コップ本を読んだが理解できていない箇所が多いです）stack
overflowに質問するのも初めてですので至らぬ点がありましたら指摘ください。

双方向循環リンクリストを記述しています。

[code]

    case class Ring( a: Int, var priv: Ring, var next: Ring){
        if( priv != null) priv.next = this
        if( next != null) next.priv = this
    }
    object Test extends App{
        val r1 = Ring( 1, null, null)
        val r2 = Ring( 2, r1, null)
        val r3 = Ring( 3, r2, r1)
    }
    
[/code]

scalaではなるべくvarではなく、valを使うように書籍等で書かれているので、privとnextをvalにしたいと考えていますができませんでした。  
リストを構築した後は、privもnextも変更しないのでvalにしたいと考えていますができますでしょうか。


CC BY-SA 3.0
2017-05-01T14:02:24.830
34405
2017-06-02T12:27:00.967
20304
question
scala
Scalaで双方向循環リンクリストを記述したい


一般に、不変な相互再帰的データを構成するには遅延評価を使います。scalaの場合、名前呼びと`lazy val`を併用することで実現できます。

[code]

    class Ring(val a: Int, p: => Ring, n: => Ring) {
      lazy val prev = p
      lazy val next = n
    }
    
    object Test extends App {
      val r1 = new Ring(1, r3, r2)
      val r2: Ring = new Ring(2, r1, r3)
      val r3: Ring = new Ring(3, r2, r1)
    
      /*
      var node = r1
      do {
        println(node.a)
        node = node.next
      } while (node ne r1)
    
      do {
        println(node.a)
        node = node.prev
      } while (node ne r1)
      */
    }
    
[/code]

名前呼びをしているのでケースクラスに出来ないことと、`r2`,`r3`に型注釈が必要なことに注意してください。


CC BY-SA 3.0
2017-06-02T12:27:00.967
35225
2017-06-02T12:27:00.967
13199
34405
answer