Kotlin / Native中的$ {type} Var是什么?

时间:2019-03-19 20:17:58

标签: kotlin kotlin-native

This documentation对我来说还很不清楚,它试图说什么是${type}Var

  

...对于Kotlin枚举,它被命名为${type}Var

是吗?什么是Kotlin枚举?普通的Kotlin枚举?

enum class MyEnum {
    FIRST, SECOND
}

我认为这并不暗示。

好的,让我们看一下本文档中的示例:

  

struct S*映射到CPointer<S>int8_t*映射到CPointer<int_8tVar>

好吧,很明显

  

char**映射到CPointer<CPointerVar<ByteVar>>

为什么char**映射到CPointer<CPointerVar<ByteVar>>而不是CPointer<CPointer<Byte>>

所以最后一个问题是:IntVarLongVarCPointerVar<T>和诸如${type}Var之类的其他东西是什么?

2 个答案:

答案 0 :(得分:2)

您应该再次仔细阅读整个段落。

  

所有受支持的C类型在Kotlin中都有相应的表示形式

     
      
  • 枚举可以映射到Kotlin枚举
  •   

在C中也有左值和右值(在C ++中,对等值是Type &,对于右值是Type)。主要区别是左值可以设置为某个值,而右值在初始化后不能更改。因此,对于C中的每种类型,您都需要为左值和右值使用自己的Kotlin类型。

在主题中

  

所有受支持的C类型在Kotlin中都有相应的表示形式

仅考虑右值。 但是对于左值,您只需添加Var到类型末尾即可。唯一的例外是

  

对于结构体(和对结构体的typedef),此表示形式是主要的表示形式,与结构体本身具有相同的名称

现在让我们回到枚举。常规Kotlin枚举映射到常规C枚举。因此实际上FIRSTSECOND在两种语言中的类型均为MyEnum。但是,如果要创建一个包含MyEnum的变量,例如:

// This is C Code
MyEnum a = FIRST;

a在C中的类型为MyEnum,但它是左值(在C ++中为MyEnum &),因此在Kotlin中,a的类型为MyEnumVar,因为完全是文档中所说的内容:${type}Var,其中${type} = MyEnum

接下来的问题:

  

CPointer的类型参数T必须是“左值”类型之一

因此对于struct S*,它应该是CPointer<SVar>,但是请记住,struct是个例外,我们不应该添加Var,所以只是CPointer<S>

  • int8_t*CPointer<int_8tVar>-这里也不例外。
  • char*CPointer<ByteVar>-同样也不例外(仅左值类型,结构除外)。
  • char**CPointer<CPointerVar<ByteVar>>,因为我们需要CPointer<ByteVar>的左值,而正好是CPointerVar<ByteVar>

最后: IntVarLongVarCPointerVar<T>和其他事物是类型intlongCPointer的左值。如果要更改函数中的对象,可能需要这样做。 Java中的Ref<${type}>之类的东西。

答案 1 :(得分:1)

  

IntVarLongVarCPointerVar<T>${type}Var之类的其他东西是什么?

那是在句子的开头,在句子的结尾加上引号:

  
    

表示此类型左值的Kotlin类型,即位于内存中的值,而不是简单的不可变的自包含值

  

“位于内存中”意味着您可以获取其地址(在C语言中使用&运算符,在Kotlin中使用.ptr)。

  

是吗?什么是Kotlin枚举?普通的Kotlin枚举?

是的,因此当Kotlin / Native看到MyEnum时,它还会生成MyEnumVar

  

为什么char**映射到CPointer<CPointerVar<ByteVar>>而不是CPointer<CPointer<Byte>>

CPointer<CPointer<Byte>>是非法的:CPointer's type parameter must extend CPointed,而ByteCPointer<T>则不是。他们需要扩展CPointed的原因是因为取消引用指针会产生一个左值:具有地址的东西!

有关C(和C ++)中的左值的更多信息,请参见https://docs.microsoft.com/en-us/cpp/c-language/l-value-and-r-value-expressionshttps://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c/