2017-08-20 3 views
4

関数のデフォルトパラメータ値は、関数拡張からアクセスできますか?Kotlinの関数のデフォルトパラメータ値へのアクセス

fun DieRoll.cheatRoll():Int = roll(min = max -1) 

fun roll(min: Int = 1, max: Int = 6): Int = (min..max).rand() 
+6

いいえ、できません。パラメータのデフォルト値は副作用の可能性のある任意の式になる可能性があるため、明示的に使用するのははっきりとわかりません。セマンティクスはどのように使用するのがよいでしょうか? – hotkey

+0

最小値と最大値を定数として保存するのはどうですか?そうすれば、アクセスの可視性も向上します。 – creativecreatorormaybenot

答えて

3

いいえ、これは不可能です。デフォルト値にはアクセスできません。バイトコードで

fun test(a: Int = 123) { 
} 

fun test2() { 
    test() 
    test(100) 
} 

結果::

public final test(int arg0) { //(I)V 
    <localVar:index=0 , name=this , desc=Lorg/guenhter/springboot/kt/Fun;, sig=null, start=L1, end=L2> 
    <localVar:index=1 , name=a , desc=I, sig=null, start=L1, end=L2> 

    L1 { 
     return 
    } 
    L2 { 
    } 
} 

public static bridge test$default(org.guenhter.springboot.kt.Fun arg0, int arg1, int arg2, java.lang.Object arg3) { //(Lorg/guenhter/springboot/kt/Fun;IILjava/lang/Object;)V 
     iload2 // reference to arg2 
     iconst_1 
     iand 
     ifeq L1 
    L2 { 
     bipush 123 // <-- THIS IS YOUR DEFAULT VALUE 
     istore1 // reference to arg1 
    } 
    L1 { 
     aload0 // reference to arg0 
     iload1 // reference to arg1 
     invokevirtual org/guenhter/springboot/kt/Fun test((I)V); 
     return 
    } 
} 

public final test2() { //()V 
    <localVar:index=0 , name=this , desc=Lorg/guenhter/springboot/kt/Fun;, sig=null, start=L1, end=L2> 

    L1 { 
     aload0 // reference to self 
     iconst_0 
     iconst_1 
     aconst_null 
     invokestatic org/guenhter/springboot/kt/Fun test$default((Lorg/guenhter/springboot/kt/Fun;IILjava/lang/Object;)V); 
    } 
    L3 { 
     aload0 // reference to self 
     bipush 100 
     invokevirtual org/guenhter/springboot/kt/Fun test((I)V); 
    } 
    L4 { 
     return 
    } 
    L2 { 
    } 
} 

だからための最善の選択肢が一定にデフォルト値を抽出するために、次のようになります。

彼らはただ、バイトコードで bridge-methodに含まれています
private val DEFAULT_MIN = 1 
private val DEFAULT_MAX = 1 

fun DieRoll.cheatRoll():Int = roll(min = DEFAULT_MAX-1) 

fun roll(min: Int = DEFAULT_MIN, max: Int = DEFAULT_MAX): Int = (min..max).rand() 
関連する問題