Usando 'esto' en la definición de clase Scala anidada

Tengo la siguiente clase abstracta con el método :: y la clase interna ListNode

abstract class SimpleList[+Elem] {
  def head: Elem
  def tail: SimpleList[Elem]
  def isEmpty: Boolean

  def ::[NewElem >: Elem] (newHead: NewElem): SimpleList[NewElem] = new ListNode(hd= newHead, tl= this)

  private class ListNode[Elem](hd: Elem, tl: SimpleList[Elem]) extends SimpleList[Elem] {
    override def head = hd
    override def tail = tl
    override def isEmpty = false

object SimpleList {

  def main(args: Array[String]): Unit = { 
    val squareNumbers = 1 :: 4 :: 9 :: 16 :: Empty
  }
}

El método :: utiliza 'esto' para definir un nuevo ListNode.

Como se puede ver en el método principal, se invoca el método ::. Parece que crea un nuevo ListNode de 1 y 4, etc.

Sin embargo, no entiendo lo que las referencias de la palabra clave en este caso. ¿Se refiere al 4? ¿Y qué es un simplelista en esta definición? ¿Una estructura de datos personalizada?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por binarybard


3 Respuestas:

  • Tienes dos preguntas y eso es lo que te está causando confusión. Lo primero es lo que hace this significa, bueno significa esto objeto, la instancia actual donde se llamó el método. Lo que tiene sentido, desde que prepende un elemento a un Lista es simplemente crear una nueva donde el elemento pasado es la cabeza y la actual es la cola.

    Ahora la segunda pregunta es cómo funciona en lo principal, diferente a la mayoría de los métodos :: se llama en el lado derecho y el argumento aprobado es el lado izquierdo (esto se especifica en las especificaciones del idioma, cada método que termina con los colones : se comportará así).
    Así que tienes que ver el código así:

    // The operations are applied in this order
    1 :: (2 :: (3 :: (4 :: Empty)))
    
    // And thus it is the same as
    Empty.::(4).::(3).::(2).::(1)
    
    // Which is easier to see like this
    val res0 = Empty // Empty
    val res1 = res0.::(4) // 4 :: Empty - (head = 4, tail / this = res0)
    val res2 = res1.::(3) // 3 :: (4 :: Empty) - (head = 3, tail / this = res1)
    val res3 = res2.::(2) // 2 :: (3 :: (4 :: Empty)) - (head = 2, tail / this = res2)
    val res4 = res3.::(1) // 1 :: (2 :: (3 :: (4 :: Empty))) - (head = 1, tail / this = res3)
    

    Así que puedes ver eso cuando creamos la final Lista estamos creando Lista cuya cabeza es 1 y su cola era 2 :: 3 :: 4 :: Empty porque llamábamos :: método sobre ese método anterior Lista.


    Para su pregunta final, sí CustomList es una estructura de datos personalizada, una clase abstracta, un nuevo tipo, etc.
    Usted debe entender que si desea continuar con temas más complejos.

    Respondida el Dec 17, 2020 a las 13:20 - por bugbusterx

    Votos positivos: 0 | Votos negativos: 0

  • En el contexto de tu código, la palabra clave this se refiere a la instancia actual de la clase en la que se encuentra, es decir, la instancia de la clase SimpleList en la que se invoca el método ::. En este caso, se está utilizando this para referirse a la instancia actual de la clase SimpleList, y no a un valor específico como el número 4.

    La clase SimpleList es una clase abstracta que define una estructura de lista simple en la que se pueden almacenar elementos de tipo Elem. La clase interna ListNode implementa esta estructura de lista simple con un nodo que contiene un elemento y una referencia al siguiente nodo en la lista.

    Cuando se invoca el método :: en el método principal y se concatenan los números 1, 4, 9 y 16, se crean instancias de la clase ListNode que representan los elementos de la lista.

    En resumen, this se refiere a la instancia actual de la clase en la que se encuentra, la clase SimpleList define una estructura de lista simple y la clase interna ListNode implementa los nodos de esta lista.

    Respondida el Dec 18, 2020 a las 13:25 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Referencia de this

    En la definición del método ::, this se refiere a la instancia actual de SimpleList. Cuando se invoca :: en una instancia de SimpleList, this hace referencia a esa instancia específica.

    En el ejemplo del método principal, this se refiere a la instancia de SimpleList que se está construyendo actualmente. Esto significa que el nuevo ListNode creado por :: tendrá un campo tl que apunta a la instancia actual de SimpleList.

    Construcción de la lista

    El método :: se utiliza para agregar un nuevo elemento a la lista. Cuando se invoca 1 :: 4 :: 9 :: 16 :: Empty, crea una nueva lista de la siguiente manera:

    Crea un nuevo ListNode con hd = 1 y tl = Empty. Crea un nuevo ListNode con hd = 4 y tl = el ListNode anterior. Crea un nuevo ListNode con hd = 9 y tl = el ListNode anterior. Crea un nuevo ListNode con hd = 16 y tl = el ListNode anterior.

    SimpleList

    SimpleList es una estructura de datos personalizada que implementa una lista vinculada simple. Tiene los siguientes métodos:

    head: Devuelve el primer elemento de la lista. tail: Devuelve el resto de la lista sin el primer elemento. isEmpty: Devuelve true si la lista está vacía, de lo contrario false. ::: Agrega un nuevo elemento al principio de la lista.

    En el ejemplo dado, SimpleList se utiliza para crear una lista de números cuadrados.

    Respondida el Dec 18, 2020 a las 13:27 - por Gemini

    Votos positivos: 0 | Votos negativos: 0