首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用“OR”来实现枚举案例?

如何使用“OR”来实现枚举案例?
EN

Stack Overflow用户
提问于 2020-12-17 18:31:21
回答 4查看 68关注 0票数 1

我有以下代码:

代码语言:javascript
运行
复制
enum class Items {
  ITEM_1,
  ITEM_2,
}

我想补充一句:

  • AT_LEAST_ONE,在某种程度上等于ITEM_1 or ITEM_2
  • ALL,意思是ITEM_1 and ITEM_2

用例1:当我使用if (item == Items.AT_LEAST_ONE)时,它希望它实际上是指if (item == Items.ITEM_1 || item ==Items.ITEM_2)

用例2:当我在函数中使用它们作为参数时:calling_function(ALL)而不是calling_function( Items.ITEM_1,Items.ITEM_2)

在科特林有办法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-12-17 18:41:33

您所要求的是不支持的。没有像枚举常量这样的东西,也就是其他枚举常数的集合。

但是,枚举类可以具有函数,所以您可以使用它来实现您想要的结果:

代码语言:javascript
运行
复制
enum class Items {

    ITEM_1,
    ITEM_2;

    fun isFoo(): Boolean =
        this == ITEM_1 || this == ITEM_2
}

现在您可以调用if (item.isFoo()),而不是建议的if (item == Items.ITEM_3)

票数 3
EN

Stack Overflow用户

发布于 2020-12-17 19:14:52

正如Ben所说,枚举不是这样工作的--每个成员都是一个不同的对象实例,所以Item3必须是一个具体的、独特的东西,而不是代表其他对象的逻辑概念。

不过,如果您愿意,您可以获得与带有密封类的枚举类似的功能,并且可以使用这些类创建类型层次结构:

代码语言:javascript
运行
复制
sealed class Items {
    sealed class AT_LEAST_ONE : Items() {
        // objects because there should be one, singleton instance of each
        object ITEM_1 : AT_LEAST_ONE()
        object ITEM_2 : AT_LEAST_ONE()
    }
}

println("ITEM_1 is an Items: ${ITEM_1 is Items}")
println("ITEM_1 is AT_LEAST_ONE: ${ITEM_1 is AT_LEAST_ONE}")

> ITEM_1 is an Items: true
> ITEM_1 is AT_LEAST_ONE: true

如果不需要,实际上不需要嵌套它们,层次结构是基于构造函数中的超级类型的。因此,您可以为事物创建您自己的组,如果您愿意,可以为它们提供多个类型的接口!

代码语言:javascript
运行
复制
// no nesting, Items is the supertype, multiple types for some
interface Special
interface AT_LEAST_ONE

sealed class Items
object ITEM_1 : Items(), AT_LEAST_ONE, Special
object ITEM_2 : Items(), AT_LEAST_ONE

// casting because otherwise the compiler knows "is" will fail and complains
println("ITEM_2 is special: ${(ITEM_2 as Any) is Special}")
println("ITEM_1 is special: ${(ITEM_1 as Any) is Special}")

> ITEM_2 is special: false
> ITEM_1 is special: true

唯一的问题是它不是枚举,所以不同的objects没有删除 enum ,所以如果需要的话,您必须自己解决。据我所知,枚举中也没有类似于values()方法的方法,即使编译器知道所有类型(因此它可以检查模式匹配是详尽的)

票数 1
EN

Stack Overflow用户

发布于 2020-12-18 06:43:21

您可以尝试将抽象函数添加到枚举类中,以满足额外条件。

我试着这样做:

代码语言:javascript
运行
复制
enum class Items {
    ITEM_1 {
        override fun calculate(item: Items): Boolean = item == ITEM_1
    },
    ITEM_2 {
        override fun calculate(item: Items): Boolean = item == ITEM_2
    },
    //AT_LEAST_ONE only for check
    AT_LEAST_ONE {
        override fun calculate(item: Items): Boolean = item == ITEM_1 || item == ITEM_2
    },
    //ALL only for check
    ALL {
        override fun calculate(item: Items): Boolean = item == ITEM_1 && item == ITEM_2
    };

    abstract fun calculate(item:Items): Boolean

    enum class GetItem{
        ALL{
            override fun get(): List<Items> {
                return listOf(ITEM_1,ITEM_2)
            }
        };

        abstract fun get(): List<Items>
    }
}

这个枚举类的用法如下:

代码语言:javascript
运行
复制
    Log.e("ENUM TEST", "TEST ITEM_1 : (item == ITEM_1) ${Items.ITEM_1 == Items.ITEM_1}")
    Log.e("ENUM TEST", "TEST ITEM_2 : (item == ITEM_2) ${Items.ITEM_2 == Items.ITEM_2}")
    Log.e("ENUM TEST", "TEST AT_LEAST_ONE : (item == AT_LEAST_ONE) ${Items.AT_LEAST_ONE.calculate(Items.ITEM_1)}")
    Log.e("ENUM TEST", "TEST ALL : (item == ALL) ${Items.ALL.calculate(Items.ITEM_1)}")
    Log.e("ENUM TEST", "TEST ALL : (ALL == ALL) ${Items.ALL == Items.ALL}")
    Log.e("ENUM TEST", "TEST ALL : (ALL == listOf(ITEM_1, ITEM_2) ${Items.GetItem.ALL.get().size}")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65346419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档