【问题标题】:What is ${type}Var in Kotlin/Native?Kotlin/Native 中的 ${type}Var 是什么?
【发布时间】:2019-03-19 20:17:58
【问题描述】:

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 之类的东西是什么?

【问题讨论】:

  • 你已经引用了上下文,整行是:“对于结构(和结构的类型定义),这个表示是主要的,并且与结构本身具有相同的名称,对于 Kotlin 枚举它是命名为 ${type}Var,对于 CPointer,它是 CPointerVar,对于大多数其他类型,它是 ${type}Var。”是的,它谈到了普通的 kotkin 酶。不,Byte 不是枚举,但大多数其他类型也遵循 ${type}Var 模式。

标签: kotlin kotlin-native


【解决方案1】:

你应该仔细阅读整个段落。

所有支持的 C 类型在 Kotlin 中都有对应的表示:

  • 枚举可以映射到 Kotlin 枚举

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

在主题中

所有支持的 C 类型在 Kotlin 中都有对应的表示:

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

对于结构体(以及结构体的类型定义),这种表示是主要的,并且与结构体本身具有相同的名称

现在让我们回到枚举。常规的 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>,但请记住structs 是例外,我们不应该添加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}>

【讨论】:

  • "主要区别是左值可以设置为某个值,而右值在初始化后不能更改。"我不会这么说,因为const int x = 0 中的x 仍然是一个左值。
【解决方案2】:

什么是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 CPointedByteCPointer<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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2021-05-07
    • 2019-08-19
    相关资源
    最近更新 更多