在Kotlin中访问函数的默认参数值

函数的默认参数值是否可以从函数扩展或其他任何地方访问?

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

不,这是不可能的。 默认值不可访问。 它们只包含在字节码中的bridge-method中:

 fun test(a: Int = 123) { } fun test2() { test() test(100) } 

结果在字节码中:

 public final test(int arg0) { //(I)V   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  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 { } } 

所以对你来说最好的选择是将缺省值提取为一个常量:

 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()