kotlin - 你能帮我解释一下这个功能是如何工作的吗?它使用 Inline、reified、valueOf() 和 enumValues

标签 kotlin enums inline kotlin-reified-type-parameters

我真的可以用你的帮助来解释这个功能。
我有一个包含 2 个字符串值、一个国家名称和一个货币的国家枚举。练习是使用 2 个字符串输入,检查枚举是否有国家,然后比较它们的货币,相应地返回 true 或 false。我设法用 2 个 for 循环和 2 个 if 来做到这一点,但我知道这并不理想。
然后我尝试使用 contains()valueOf(input)但是当输入不在枚举中时,它会抛出 valueOf() 的非法参数异常。

if (values().contains(valueOf(country1.toUpperCase())) && values().contains(valueOf(country2.toUpperCase()))) {
    return valueOf(country1.toUpperCase()).currency == valueOf(country2.toUpperCase()).currency
    } else return false
我在这里搜索并找到了 valueOfOrNull()我不太明白的方法
inline fun <reified T : Enum<T>> enumValueOfOrNull(country: String): T? {
            return enumValues<T>().find { it.name == country.toUpperCase() }
        }
你能帮我解释一下这是如何工作的吗?我不知道内联、具体化的 T: Enum 是如何工作的以及它返回什么。
另外,我刚开始学习 lambda,所以我对 .find {} 有了一个基本的了解。部分,但我可以使用 it 的解释
我感谢您的所有帮助,非常感谢您。

最佳答案

在 Kotlin , inline functions让他们的 body 在编译时转换,并且,在每个调用站点内联。虽然这需要编译器做更多的工作并导致更大的二进制文件,inline函数更灵活一些,因为编译器不是将它们的主体编译成一个字节码,而是从每个调用站点获取更多附加信息,并将其嵌入到内联主体中,根据调用产生不同的结果。嵌入到转换后的内联函数体中的此类附加数据的一个示例是从调用站点传递给函数的 lambda,允许 non-local control flow .
编译器可以为特定调用站点转换主体的另一种方法是嵌入来自调用站点的实际泛型类型参数。在为所有调用站点生成单个编译函数体时,编译器无法生成任何将实际类型参数考虑在内的代码,例如 foo is T检查。换句话说,实际的 type arguments are erased .但是,通过每个单独的调用站点的内联正文,这成为可能。该功能称为 reified type parameters .
然后, enumValues 是编译器特别对待的内在函数,可以在作为 Enum 子类型的具体类型参数上调用(每个 enum class 都是),然后在内联函数体中会有一个返回枚举值的调用。这不是唯一在内联期间使用 reified 类型参数的内在函数: typeOf 也这样做,并产生 KType可以用来内省(introspection)实际类型参数的标记。

关于kotlin - 你能帮我解释一下这个功能是如何工作的吗?它使用 Inline、reified、valueOf() 和 enumValues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64063540/

相关文章:

java - 垂直滑动手指即可打开 fragment

c# - 如何在 C# 中枚举枚举?

带有静态局部变量的 C99 静态内联函数

javascript - thymeleaf 内联 javascript 框架问题

java - 在 Debug模式下计算实例化类的数量失败

http - 在 Image HTTP 响应 Jetty 中包含文本 header

java - RealmResult 通过数千个对象的迭代很慢

enums - 如何使 CRMSvcUtil.exe 生成不重复、无错误的早期绑定(bind)选项集?

c# - 使用枚举和继承的工厂设计模式

c++ - 为什么在这种情况下内联函数会花费更多时间?代码如下 :