使用Kotlin apply作用域函数:flush()与startTimer()调用是否正确?
关于Kotlin apply作用域函数使用正确性的解答
你的改写完全正确,apply作用域函数就是用来针对同一个对象执行一系列初始化或配置操作的,它的特性就是在作用域内可以直接调用对象的属性和方法,并且最后会返回原对象,和你这里的需求完美匹配。
对比原代码和改写后的代码:
- 原代码先获取对象,再逐个执行属性赋值与方法调用;
- 改写后的
apply版本把所有操作封装在作用域内,既避免了重复书写c.,也让代码结构更紧凑、可读性更高。
你在apply作用域内调用startTimer()和flush()的方式完全没问题,这两个方法和其他属性赋值逻辑一致,都是针对note.cards()[0]这个对象执行的,和原代码的语义完全相同,没有任何逻辑偏差。
另外,如果后续不需要修改c变量的值,还可以把var改成val,更符合Kotlin不可变优先的编码原则:
val c = note.cards()[0].apply { type = CARD_TYPE_REV queue = QUEUE_TYPE_REV due = (col.sched.today - 8).toLong() factor = STARTING_FACTOR setReps(3) lapses = 1 ivl = 100 startTimer() flush() }
内容的提问来源于stack exchange,提问作者Critical AY
相关产品推荐
相关产品推荐

