问题标签 [extension-function]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
537 浏览

android - 开闭原理及扩展功能

我了解到开放关闭原则允许扩展类并限制修改。所以在 Kotlin 中,当我们使用扩展函数时

  1. 我们在扩展一个类吗
  2. 或者我们在修改一个类
  3. kotlin 中的扩展函数可以作为打开/关闭原则的示例吗?

我假设扩展手段应用继承和修改手段来添加或更改现有类的代码。

谢谢

0 投票
2 回答
83 浏览

kotlin - 我可以在课堂外使用扩展 *member* 吗?

如果我在 B 类中声明了 A 类型的扩展函数:

我可以从 B 类之外的代码中调用这个函数吗?

0 投票
2 回答
130 浏览

java - 在 java.lang.reflect.Proxy 对象上调用扩展函数时 Kotlin 的奇怪行为

今天我在 Kotlin 中玩了一些java.lang.reflect.Proxy,我对这种行为感到惊讶:

输出:


问题:

为什么在第一个示例中仅bark3Times调用代理而不是单独bark调用,但在第二个示例中不调用它bark5Times,但每次bark调用都调用这个时间?

0 投票
1 回答
519 浏览

android - 为 kotlin 扩展函数的基础对象附加上下文

这个问题专门针对Android开发中使用的Kotlin扩展功能。

因此,Kotlin 为我们提供了将某些扩展行为添加到类中以扩展基于类行为的能力。

示例:(取自我当前的 Android 项目,用于 Espresso 测试中的 viewAssertion)

在我的用例中,我可以像这样使用它:

一切都很好,除了这个扩展函数为所有Int对象提供了扩展行为,而不仅仅是 Android 中的 View ID,这一点都不好。

问题是是否有任何方法可以为此提供上下文Int,例如在 Android 中,我们在 Android 中为上述给定情况提供了@IdRes 支持注释?

0 投票
2 回答
624 浏览

java - 在java代码中定义Kotlin扩展函数

我想为字符串提供一个 Kotlin 扩展函数,该函数只能在MyParent类的继承者(受保护的函数)中访问。MyParent类是用 java 编写的,不能转换为 Kotlin。是否可以在 Java 代码中定义一个可用作 Kotlin 代码中的扩展函数的方法?

我想我期待某种适当的签名,或者一些神奇的 @ThisIsExtenstionFunction 注释。

0 投票
1 回答
45 浏览

kotlin - 如何编写就地扩展功能

如何编写 String.reverse()?

0 投票
0 回答
39 浏览

android - 如何为 RxBinding.textChanges() 提供副作用并在客户端保留其功能?

假设我正在编写自己的 View 类,它代表可编辑字段并在里面包含 EditText tv_input

我想将textChanges()委托给该内部 EditText tv_input,因此我在自定义EditTextIconItemView中编写了以下代码:

这很好用,但现在我希望我的客户端代码实际上跳过初始值,所以在客户端代码中我有:

这需要我在EditTextIconItemView中为textChanges()明确指定返回类型:

但这不会编译,因为doOnNext返回 Observable 不能转换为InitialValueObservable

但我实际上不希望客户端代码处理该副作用并在该视图上设置字符计数,这是EditTextIconItemView本身的责任。但我希望仍然能够判断是否在客户端跳过初始值。

我怎样才能让它工作?

谢谢你!

0 投票
1 回答
393 浏览

kotlin - 为什么我得到“推断类型是 Observable!但可观察预期”具有可观察的 Kotlin 扩展功能?

我有以下扩展功能:

我用它来将Subject带有Notification值的 a 转换为普通的Observable

我不太明白为什么我会收到错误

Type inference failed. Expected type mismatch: inferred type is Observable<T?>! but Observable<T> was expected

从哪里来inferred type is Observable<T?>?我想这与在 Java 中可空类型和不可空类型之间没有区别这一事实有关。

有哪些方法可以解决这个问题?

0 投票
1 回答
815 浏览

android - 如何在类上使用 Kotlin 扩展函数?

我有一个关于扩展功能的非常简短的问题,这将有助于清除我的一些代码。基本上我对类名的 hashCode 进行了一些转换,我想要一个扩展函数来进行转换。

例子:

获取名称 hashCode:StateA::class.java.name.hashCode()其中 StateA 是一个简单的类。

我想要扩展功能,例如:

但这似乎不起作用。当我使用 应用扩展函数时StateA.transformName(),该函数给我一个未解析引用的错误。

我尝试了各种方法,例如将函数应用于StateA::class或使 hashString 等于this::class.java.name.hashCode()但没有任何效果。有小费吗?

0 投票
1 回答
119 浏览

kotlin - 带有接收器的函数的 Kotlin 扩展函数

我在玩 Kotlin 的扩展功能。我想为返回补码函数的接收器创建一个布尔返回函数的扩展函数。

我的目标是能够写:

我确实意识到有更好、更清晰的方法来做我正在做的事情,我想在这里更好地理解语言本身,所以请不要告诉我isOdd写成{ !isEven() }:)

我想要类似的东西:

现在,

编译正确,所以语法在这里绝对有意义。问题是它this的类型I.() -> Boolean,我需要使用接收器访问我的函数的“内部接收器”,比如this@this,编写如下内容:

wherethis@this将是 type I。有没有办法达到这个效果?

另外,我注意到我不知道如何使用接收器调用函数,我尝试:

我得到一个error: expression 'this' of type 'I' cannot be invoked as a function. The function 'invoke()' is not found.

这对我来说听起来不对!this应该有类型I.() -> Boolean,不是I!我无法理解这个错误消息。

我想也许我只是使用了错误的语法,所以我改为:

但我得到同样的错误。正如我所期望innerthis的那样,这对我来说非常困惑 typeIthistype I.() -> Boolean。我的期望似乎得到了实现= this完美编译的证实。

有人可以向我解释编译器引发的错误吗?

谢谢!