Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

529
Views
¿Qué es ${type}Var en Kotlin/Native?

Esta documentación es muy poco clara para mí cuando intenta decir qué es ${type}Var .

... para las enumeraciones de Kotlin se llama ${type}Var

¡¿Qué?! ¿Qué son las enumeraciones de Kotlin? ¿Enumeraciones regulares de Kotlin?

 enum class MyEnum { FIRST, SECOND }

No creo que esté implícito.

Bien, veamos los ejemplos en esta documentación:

struct S* se asigna a CPointer<S> , int8_t* se asigna a CPointer<int_8tVar>

Está bien, está claro

char** está asignado a CPointer<CPointerVar<ByteVar>>

¿Por qué char** está asignado a CPointer<CPointerVar<ByteVar>> pero no a CPointer<CPointer<Byte>> ?

Entonces, finalmente, la pregunta es: ¿qué es IntVar , LongVar , CPointerVar<T> y otras cosas como ${type}Var ?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Deberías leer todo el párrafo de nuevo con atención.

Todos los tipos de C admitidos tienen representaciones correspondientes en Kotlin:

  • Las enumeraciones se pueden asignar a la enumeración de Kotlin

También en C hay lvalues y rvalues (En C++ el equivalente es Type & para lvalues y Type para rvalues). La distinción principal es que los valores l se pueden establecer en algún valor, mientras que los valores r no se pueden cambiar después de la inicialización. Entonces, para cada tipo en C, necesita su propio tipo Kotlin para lvalue y para rvalue.

en el tema

Todos los tipos de C admitidos tienen representaciones correspondientes en Kotlin:

sólo se consideran los valores de r. Pero para lvalues, lo único que necesita agregar es Var hasta el final del tipo. La única excepción es

Para estructuras (y typedefs a estructuras) esta representación es la principal y tiene el mismo nombre que la estructura misma

Ahora volvamos a las enumeraciones. Las enumeraciones regulares de Kotlin se asignan a las enumeraciones regulares de C. Entonces, en realidad, FIRST y SECOND tienen el tipo MyEnum en ambos idiomas. Pero, ¿qué sucede si desea crear una variable que contenga MyEnum por ejemplo?

 // This is C Code MyEnum a = FIRST;

a tiene el tipo MyEnum en C, pero es lvalue (en C++ es MyEnum & ), por lo que en Kotlin a tendrá el tipo MyEnumVar porque eso es exactamente lo que se dice en la documentación: ${type}Var , donde ${type} = MyEnum .

A las siguientes preguntas:

El argumento de tipo T de CPointer debe ser uno de los tipos "lvalue"

Entonces, para struct S* debería ser CPointer<SVar> , pero recuerda que struct s son excepciones y no debemos agregar Var , así que eso es solo CPointer<S> .

  • int8_t* es CPointer<int_8tVar> - aquí no hay excepción.
  • char* es CPointer<ByteVar> ; de nuevo, sin excepción (solo tipos lvalue, excepto estructuras).
  • char** es CPointer<CPointerVar<ByteVar>> ya que necesitamos lvalue para CPointer<ByteVar> y eso es exactamente CPointerVar<ByteVar> .

Finalmente: IntVar , LongVar , CPointerVar<T> y otras cosas son lvalues de tipos int , long , CPointer . Eso puede ser necesario si desea cambiar el objeto en la función. Algo así como Ref<${type}> en Java.

over 4 years ago · Santiago Trujillo Report

0

¿Qué es IntVar , LongVar , CPointerVar<T> y otras cosas como ${type}Var ?

Eso está al comienzo de la oración cuyo final citaste:

el tipo de Kotlin que representa el valor l de este tipo, es decir, el valor ubicado en la memoria en lugar de un valor autónomo inmutable simple

"ubicado en la memoria" significa que puede tomar su dirección (usando el operador & en C o .ptr en Kotlin).

¡¿Qué?! ¿Qué son las enumeraciones de Kotlin? ¿Enumeraciones regulares de Kotlin?

Sí, entonces cuando Kotlin/Native ve MyEnum , también genera MyEnumVar .

¿Por qué char** está asignado a CPointer<CPointerVar<ByteVar>> pero no a CPointer<CPointer<Byte>> ?

CPointer<CPointer<Byte>> es ilegal: el parámetro de tipo de CPointer debe extender CPointed y Byte y CPointer<T> no. Y la razón por la que necesitan extender CPointed es porque quitar la referencia a un puntero da un valor l: ¡algo que tiene una dirección!

Consulte https://docs.microsoft.com/en-us/cpp/c-language/l-value-and-r-value-expressions o https://eli.thegreenplace.net/2011/12/15/understanding -lvalues-and-rvalues-in-c-and-c/ para obtener más información sobre lvalues en C (y C++).

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!