Tag: 功能

Kotlin:你可以用varargs命名参数吗?

例如,你可能有一个复杂的签名和可变参数的函数: fun complicated(easy: Boolean = false, hard: Boolean = true, vararg numbers: Int) 这应该是有道理的,你应该能够这样调用这个函数: complicated(numbers = 1, 2, 3, 4, 5) 不幸的是,编译器不允许这样做。 有没有可能使用可变参数命名参数? 有没有什么聪明的解决办法?

解释这个Kotlin函数结构

我正在使用这个Kotlin函数。 我知道我们有一个名为mPasswordView!!.setOnEditorActionListener的函数,它mPasswordView!!.setOnEditorActionListener参数TextView.OnEditorActionListener ,但那是什么? 我们在参数里面有花括号吗? mPasswordView!!.setOnEditorActionListener(TextView.OnEditorActionListener { textView, id, keyEvent -> if (id == R.id.login || id == EditorInfo.IME_NULL) { attemptLogin() return@OnEditorActionListener true } false })

如何使重写单一表达式函数的返回类型为Unit?

如何重写一个返回void或Unit的函数,用一个表达式返回一些非Unit类型的单表达式函数 ? 例如: interface Base { fun overrideMe(): Unit } class Derived: Base { override fun overrideMe() = runAsync { } }

单元测试验证通过被调用的功能

比方说,我有这个功能(写在Kotlin): fun determineBottomBarView(assignee: String?, showChatAssignerFunction: () -> Unit, showChatComposerFunction: () -> Unit, hideChatComposerAndAssignerFunction: () -> Unit) { if (assignee.isNullOrEmpty()) { showChatAssignerFunction() } else { if (assignee.equals(localRequestManager.getUsername())) { showChatComposerFunction() } else { hideChatComposerAndAssignerFunction() } } } 当受让人为空或空时,是否可以验证(在单元测试中) showChatAssignerFunction是否被调用? 谢谢你们!

Kotlin:我如何创建一个“静态”可继承的函数?

例如,我想在扩展Parent的类型Child上有一个函数example() ,这样我就可以同时使用这个函数。 Child.example() Parent.example() 第一个“显而易见”的方法是通过Parent的伴侣对象,但是这不允许用于Child example() 。 我尝试的第二种方法是在Parent.Companion上定义一个扩展函数,这是不方便的,因为你不得不定义一个伴随对象。 它也不允许example()为Child 。 有人知道我怎么能做到这一点?

如何创建包级功能?

我正在阅读Kotlin参考指南 ,其中一部分说: 在Kotlin中,与Java或C#不同,类没有静态方法。 在大多数情况下,建议仅使用包级函数。 如何创建一个包级功能?

Kotlin中的“。()”是什么意思?

我见过一个函数有一个由ClassName给出的参数的例子。()这似乎不是一个扩展函数,它是ClassName.Function() Kotterknife就是一个例子: private val View.viewFinder: View.(Int) -> View? get() = { findViewById(it) } 我不太了解这个功能, 和MaterialDrawerKt fun Activity.drawer(setup: DrawerBuilderKt.() -> Unit = {}): Drawer { val builder = DrawerBuilderKt(this) builder.setup() return builder.build() } 代码允许你直接调用的地方 drawer { … } 而不是把它括在括号内的论点。 这个地方有任何文件吗?

Kotlin:获得一个类的函数的参考“实例

我正在尝试传递一个函数到Kotlin中的函数,这里是我的代码。 fun validateValueWithFunc(value: String, parsefun: (CharSequence) -> Boolean, type: String){ if(parsefun(value)) print("Valid ${type}") else print("Invalid ${type}") } 我传递的函数是从Regex类“containsMatchIn” val f = Regex.fromLiteral("some regex").containsMatchIn 我知道::函数引用操作符,但我不知道如何在这种情况下使用它

何时在Kotlin中使用内联函数?

我知道一个内联函数可能会提高性能,并导致生成的代码增长,但我不知道什么时候使用它是正确的。 lock(l) { foo() } 编译器可以发出下面的代码,而不是为参数创建一个函数对象并生成一个调用。 ( 来源 ) l.lock() try { foo() } finally { l.unlock() } 但是我发现kotlin没有为非内联函数创建函数对象。 为什么? /**non-inline function**/ fun lock(lock: Lock, block: () -> Unit) { lock.lock(); try { block(); } finally { lock.unlock(); } }

Kotlin函数声明:在大括号之前等号

在Kotlin中,函数声明语法允许您在花括号之前写入等号。 考虑这两个例子: 没有=标志: fun foo() { bar() println("baz") } 通过调用foo()执行正文中的代码。 带=号: fun foo() = { bar() println("baz") } 在这里,当调用foo()时,什么都不会发生,但是为了让body执行,可以写成foo()() 。 这两个声明有什么区别, 为什么他们的行为有所不同? 这个问题虽然意义不大,却被作者故意的提出和回答 ,因为在功能定义不正确的情况下,人们已经发现了一些问题。