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

标签 kotlin default-value default-parameters

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

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
     <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 {
     }
 }

在 Java 语法中看起来像
final public class AKt {
    final public static void test(int i) {
    }

    public static void test$default(int i, int i0, Object a) {
        if ((i0 & 1) != 0) {
            i = 123;
        }
        AKt.test(i);
    }

    final public static void test2() {
        AKt.test$default(0, 1, (Object)null);
        AKt.test(100);
    }
}

所以对你来说最好的选择是将默认值提取到一个常量中:
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()

关于kotlin - 在 Kotlin 中访问函数的默认参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45786399/

相关文章:

PostgreSQL - 根据另一个单元格值设置默认单元格值

java - 如何更改默认的 "Validation Error: Value is not valid"消息?

c++ - 函数的默认值作为函数参数

postgresql - jOOQ 查询表达式类型安全,无需自定义转换器

kotlin - Kotlin 中的 tailrec 函数无法返回阶乘结果

python - "Least Astonishment"和可变默认参数

c++ - 具有默认模板参数的多态类的模板推导失败

c++ - 代码执行派生类方法,但从基类方法获取默认参数

javascript - Kotlin:什么是 kjsm 文件?

string - 在kotlin中合并两个字符串