Enum和在Kotlin

无论我的语法是错误的,或者你不能用于应用enum常量。 IntelliJ说这是因为RegexOption没有伴随对象,而且RegexOption needs to be initialized here 。 我不认为你可以实例化一个枚举。

 // this works: val RX_OPTIONS = mapOf( 'c' to RegexOption.COMMENTS, 'd' to RegexOption.DOT_MATCHES_ALL, 'e' to RegexOption.CANON_EQ, 'i' to RegexOption.IGNORE_CASE, 'l' to RegexOption.LITERAL, 'm' to RegexOption.MULTILINE, 'u' to RegexOption.UNIX_LINES ) // this doesn't work: val RX_OPTIONS2 = with(RegexOption) { mapOf( 'c' to COMMENTS, 'd' to DOT_MATCHES_ALL, 'e' to CANON_EQ, 'i' to IGNORE_CASE, 'l' to LITERAL, 'm' to MULTILINE, 'u' to UNIX_LINES ) } 

为什么第二个例子没有工作? 如果他们不在伴侣对象中,那么他们似乎不会在一个实例中。 有没有可以在这种情况下工作的对口? 如果不是,写一个很容易(因为只是一个单行 )?

编辑(改进问题):

在一个块(不一定是这一个),我键入20引用相同的长枚举名称,如Class.Inner.VeryInner.YouGetTheIdea.SOMEOPTION是有可能的因素除了SOMEOPTION名称使用with-statement-就像为了一个块而构建的 – 甚至是我必须把自己写成一个更高阶的函数呢? 我已经考虑过typealias ,但我真的希望这只适用于块。 下面的答案告诉我,高阶函数不适用于此,但有没有办法做到这一点?

with的单线实现是:

 public inline fun  with(receiver: T, block: T.() -> R): R = receiver.block() 

T.()是一个带有接收者函数 ,接收者是一个对象。 你正在上课。

Kotlin 函数文字与接收器的文档可以在这里find。