2017-11-14 12 views
2

構文が間違っているか、withを使用してenumの定数に適用できません。 IntelliJによると、RegexOptionにはコンパニオンオブジェクトがありません。それはです。私はあなたがenumをインスタンス化できるとは思わなかった。KotlinのEnums With With Kotlin

// 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 
) } 

2番目の例はなぜ機能しませんか。それらがコンパニオンオブジェクトにない場合、インスタンス内にあるようには見えません。 withにはこのような状況で対応できるカウンターパートがありますか?そうでない場合は、withはちょうどone-linerなので、書きやすいですか? (質問の絞り込み)

EDIT:ブロックで

(必ずしもでも、この1)私はのように同じ長い列挙名に20個の参照を入力していすることが可能です文のような構造を使ってSOMEOPTIONの名前を除外してください。ブロックにはちょうどです。上位の関数として書かなければならないものさえありますか?私はtypealiasと考えましたが、私は本当にこれをブロックにのみ適用したいと思います。 以下の答えは、with高次関数はこれでは機能しませんが、それを行う方法はありますか?

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

T.()が受信リテラル関数であり、受信機が対象である:

+0

誤解を招くタグ「with-statement」を削除しました。 kotlinでは、それはステートメントではなく高次関数です。 –

+0

特に、検索エンジンが「with」のような前置詞を優先順位をつけないことが多いため、Kotlin *が「with」ステートメントを持っているという誤った印象を受けた人がこの質問を見つけるのに役立つかもしれません。しかし、編集でうまくいく。 – sirksel

答えて

4

withのワンライナーの実装です。あなたはクラスを通過しています。

受信機付き関数リテラルのドキュメントhereです。

+0

ありがとうございました - コンパニオンクラス(Java静的メンバーと同じではないが連想させるが)に言及して、定数がメンバーであったために動作すると思った。 enum内のIGNORE_CASEは、プロパティよりもネストされたクラスに似ていますか?私はあなたがそれを書くことを可能にする言語構成がないので、私がやろうとしていることをすることができないと言っていると思いますか? – sirksel

+1

@sirksel私はあなたが['when'式](https://kotlinlang.org/docs/reference/control-flow.html#when-expression)を探していると思うし、マップとその' get演算子... – Moira

+0

これは役に立ちますが、私はまだ**一般的な解決策**を探しています。このマッピングアプリケーションのためだけではありません。たぶん 'when'は答えですが、私は機能の切り替えに本当に関心がありません。ちょうどブロック名の短縮です。もしあなたが私のために 'when'を使う方法を考えているなら、クイックコードの例で別の答えを提案できますか?上記の私の質問の**編集**部分を参照してください。 – sirksel