4
関数のデフォルトパラメータ値は、関数拡張からアクセスできますか?Kotlinの関数のデフォルトパラメータ値へのアクセス
fun DieRoll.cheatRoll():Int = roll(min = max -1)
fun roll(min: Int = 1, max: Int = 6): Int = (min..max).rand()
関数のデフォルトパラメータ値は、関数拡張からアクセスできますか?Kotlinの関数のデフォルトパラメータ値へのアクセス
fun DieRoll.cheatRoll():Int = roll(min = max -1)
fun roll(min: Int = 1, max: Int = 6): Int = (min..max).rand()
いいえ、これは不可能です。デフォルト値にはアクセスできません。バイトコードで
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()
いいえ、できません。パラメータのデフォルト値は副作用の可能性のある任意の式になる可能性があるため、明示的に使用するのははっきりとわかりません。セマンティクスはどのように使用するのがよいでしょうか? – hotkey
最小値と最大値を定数として保存するのはどうですか?そうすれば、アクセスの可視性も向上します。 – creativecreatorormaybenot