Enums 在Kotlin中使用枚举和

Enums 在Kotlin中使用枚举和,enums,kotlin,Enums,Kotlin,要么我的语法错误,要么你不能使用with应用于enum常量。IntelliJ说这是因为RegexOption没有伴生对象,而RegexOption需要在这里初始化。我认为您无法实例化枚举 // this works: val RX_OPTIONS = mapOf( 'c' to RegexOption.COMMENTS, 'd' to RegexOption.DOT_MATCHES_ALL, 'e' to RegexOption.CANON_EQ, 'i' to RegexOpt

要么我的语法错误,要么你不能使用
with
应用于
enum
常量。IntelliJ说这是因为
RegexOption
没有伴生对象,而
RegexOption需要在这里初始化。我认为您无法实例化枚举

// 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
) }
为什么第二个例子不起作用?如果它们不在伴星对象中,它们看起来就不会在实例中。与
是否有一个对应项可以在这种情况下工作?如果不是,写一个是否容易(因为
with
只是一个简单的例子)

编辑(细化问题):


在一个区块中(甚至不一定是这个区块)在这里,我输入了20个对相同长枚举名的引用,比如
Class.Inner.VeryInner.yougetheidea.SOMEOPTION
,是否可以使用with语句类的构造来计算出除了
SOMEOPTION
名之外的所有名称,即使是我必须将自己编写为高阶函数的块?我考虑过
typealias
,但我真的希望这只适用于块下面的答案告诉我,带高阶函数的
对此不起作用,但有办法吗?
的单行程序实现是:

public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
public-inline-fun-with(receiver:T,block:T.()->R):R=receiver.block()
T.()
是一个带有接收者的函数文本,接收者是一个对象。你通过了一门课


可以找到Kotlin函数文本和receiver的文档。

谢谢——提到了companion类(让人联想到Java静态成员,但与Java静态成员不同),我认为它可以工作,因为常量是成员。枚举中的IGNORE_大小写更像是嵌套类而不是属性吗?我猜你是说不可能做我想做的事情,因为没有语言结构可以让我写它?@sirksel我想你是在寻找,或者你可以使用地图和它的
get
操作符…虽然这很有帮助,但我仍然在寻找一个通用的解决方案,而且不一定只适用于此映射应用程序。当
是答案时,可能是
,但我对切换功能并不感兴趣,只是对块的名称进行了缩短。如果你正在设想一种我可以在
时使用的方法,你能用一个快速的代码示例提出一个单独的答案吗?请看上面我问题的编辑部分。我删除了误导性标签“with statement”。在kotlin中,它不是一个语句,而是一个更高阶的函数。它可能会帮助人们找到这个问题,因为人们(像我一样)错误地认为kotlin有一个
with
语句,特别是因为搜索引擎经常对诸如“with”这样的介词取消优先级。不过编辑得不错。