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 era2 :: 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 claseSimpleList
en la que se invoca el método::
. En este caso, se está utilizandothis
para referirse a la instancia actual de la claseSimpleList
, 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 tipoElem
. La clase internaListNode
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 claseListNode
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 claseSimpleList
define una estructura de lista simple y la clase internaListNode
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 deSimpleList
. Cuando se invoca::
en una instancia deSimpleList
,this
hace referencia a esa instancia específica.En el ejemplo del método principal,
this
se refiere a la instancia deSimpleList
que se está construyendo actualmente. Esto significa que el nuevoListNode
creado por::
tendrá un campotl
que apunta a la instancia actual deSimpleList
.Construcción de la lista
El método
::
se utiliza para agregar un nuevo elemento a la lista. Cuando se invoca1 :: 4 :: 9 :: 16 :: Empty
, crea una nueva lista de la siguiente manera:Crea un nuevo
ListNode
conhd = 1
ytl = Empty
. Crea un nuevoListNode
conhd = 4
ytl = el ListNode anterior
. Crea un nuevoListNode
conhd = 9
ytl = el ListNode anterior
. Crea un nuevoListNode
conhd = 16
ytl = 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
: Devuelvetrue
si la lista está vacía, de lo contrariofalse
.::
: 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