Enums Kotlin Enum:引用它所属的任何Enum对象的函数';他是从哪里打来的
我正在尝试编写一个enum函数Enums Kotlin Enum:引用它所属的任何Enum对象的函数';他是从哪里打来的,enums,kotlin,Enums,Kotlin,我正在尝试编写一个enum函数print(),它可以从enummolecular中的一个对象按如下方式调用: Molecule.HYDROGEN_MOLECULE.print() myMolecule.print() 我不想为函数提供特定的枚举对象: Molecule.print(Molecule.HYDROGEN) 但是,当我在molecular中创建函数时,当我尝试引用MolecularFragment的列表时,我得到了一个错误 我需要在print()中使用什么语法来生成类似于mymol
print()
,它可以从enummolecular
中的一个对象按如下方式调用:
Molecule.HYDROGEN_MOLECULE.print()
myMolecule.print()
我不想为函数提供特定的枚举对象:
Molecule.print(Molecule.HYDROGEN)
但是,当我在molecular
中创建函数时,当我尝试引用MolecularFragment
的列表时,我得到了一个错误
我需要在print()中使用什么语法来生成类似于mymolecular.print()
的内容,以引用特定枚举对象的MolecularFragment
列表
enum class Molecule (val MolecularFragments : List<MolecularFragment> = emptyList()) {
HYDROGEN_MOLECULE(listOf(MolecularFragment.H2)),
WATER_MOLECULE(listOf(MolecularFragment.H2O)),
// ...
HEXANE_MOLECULE(listOf(MolecularFragment.CH3, MolecularFragment.CH2));
fun print() {
**var x : List<MolecularFragment> = Molecule.MolecularFragments**
x.forEach() {
println("$it")
}
println(" --- ${Molecule.toString()}")
}
}
枚举类分子(val MolecularFragments:List=emptyList()){
氢分子(listOf(MolecularFragment.H2)),
水分子(listOf(MolecularFragment.H2O)),
// ...
己烷_分子(列表(MolecularFragment.CH3,MolecularFragment.CH2));
趣味印刷品(){
**var x:List=分子。分子碎片**
x、 forEach(){
println(“$it”)
}
println(“--${Molecule.toString()}”)
}
}
我会使用类似的方法:
enum class MyType(val subTypes: List<String>) {
FIRST_TYPE(listOf("one", "two")),
SECOND_TYPE(listOf("three", "four"));
}
//Honestly his method could be moved in some util .kt file
fun printOneType(myType: MyType) {
myType.subTypes.forEach { print(it.toString()) }
}
正如@marstran在评论中指出的:从标记的行中删除
分子
,使其看起来像:
var x : List<MolecularFragment> = MolecularFragments
这样,您只需重写toString()
-方法,甚至可以将该toString
-方法重新用于其他目的,例如示例重写:
enum class Molecule ... {
// ...
override fun toString(): String {
return super.toString() + ": $molecularFragments"
}
}
。。正如@marstran所指出的:Kotlin中最常见的代码约定是以小写字母开头属性。我想这正是您想要的:
enum class MolecularFragment { H2, H2O, CH3, CH2 }
enum class Molecule (val molecularFragments : List<MolecularFragment> = emptyList()) {
HYDROGEN_MOLECULE(listOf(MolecularFragment.H2)),
WATER_MOLECULE(listOf(MolecularFragment.H2O)),
HEXANE_MOLECULE(listOf(MolecularFragment.CH3, MolecularFragment.CH2));
fun print() {
molecularFragments.forEach(::println)
println("${this::class.java.toString()}")
}
}
fun main(args: Array<String>) {
Molecule.HYDROGEN_MOLECULE.print()
}
enum类分子碎片{H2,H2O,CH3,CH2}
枚举类分子(val molecularFragments:List=emptyList()){
氢分子(listOf(MolecularFragment.H2)),
水分子(listOf(MolecularFragment.H2O)),
己烷_分子(列表(MolecularFragment.CH3,MolecularFragment.CH2));
趣味印刷品(){
分子碎片。forEach(::println)
println(“${this::class.java.toString()}”)
}
}
趣味主线(args:Array){
Molecule.HYDROGEN_Molecule.print()
}
几点注意:
- 用双星号突出显示的行甚至没有编译
- 可以使用函数引用打印元素
- 您不需要首先将属性
放入变量中molecularFragments
- 下次,请指定
,以便代码可以立即运行分子碎片
var x:List=MolecularFragments
。顺便说一句,Kotlin中的约定是用小写字母命名属性。像molecularFragments
。想像enum类方法就像想像普通类方法一样。您的对象(在枚举中:您的枚举常量)使用this
访问每个字段/属性。这似乎是OP最初不想要的。您的第一个方法printAll
应该是一个静态变量(伴生对象的方法),而不是成员方法。后者应该如下所示:fun print()=子类型。forEach(::println)
使用FIRST\u TYPE.print()
调用它,而不是FIRST\u TYPE.printOneType(SECOND\u TYPE)
,这没有多大意义。是的,我意识到了这一点,并做了一些补充:也许将来会有人需要像这样简单的语法。我不认为你明白我的意思。您的printOneType
-方法是一个成员函数,可以调用FIRST\u TYPE.printOneType(SECOND\u TYPE)
,这真的没有意义。这就是为什么我评论说像这样的方法应该移动到某个util.kt文件或类中。对不起,这也没有多大意义。如果您真的想要这样一个方法,您可能会将它放在enum的伴生对象中。但是,打印单个枚举应该是该枚举本身的一个成员函数。谢谢,我也尝试了与您的解决方案类似的语法,但也没有编译它。我很感激。
fun <T : Enum<T>> Enum<T>.printIt() = toString().also(::println)
enum class Molecule ... {
// ...
override fun toString(): String {
return super.toString() + ": $molecularFragments"
}
}
enum class MolecularFragment { H2, H2O, CH3, CH2 }
enum class Molecule (val molecularFragments : List<MolecularFragment> = emptyList()) {
HYDROGEN_MOLECULE(listOf(MolecularFragment.H2)),
WATER_MOLECULE(listOf(MolecularFragment.H2O)),
HEXANE_MOLECULE(listOf(MolecularFragment.CH3, MolecularFragment.CH2));
fun print() {
molecularFragments.forEach(::println)
println("${this::class.java.toString()}")
}
}
fun main(args: Array<String>) {
Molecule.HYDROGEN_MOLECULE.print()
}