问题标签 [implicit-class]

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 投票
1 回答
480 浏览

scala - 隐式值类的优雅分组

我正在为现有的Java库编写一组隐式Scala包装器类(以便我可以装饰该库以使其对Scala开发人员更方便)。

举个简单的例子,假设Java库(我无法修改)有一个类,如下所示:

现在假设我想用Scala风格的 getter 和 setter 来装饰这个类。我可以使用以下隐式类来做到这一点:

implicit关键字告诉Scala编译器它可以将 的实例隐式转换Value为 的实例RichValue(前提是后者在范围内)。所以现在我可以将其中定义的方法应用RichValueValue. 例如:

(同意,这不是很好的代码,也不完全是功能性的。我只是想演示一个简单的用例。)

不幸的是,Scala不允许implicit类是顶级的,因此它们必须在 a 、 或 中定义package object,而object不仅仅是在 a 中。(我不知道为什么这个限制是必要的,但我认为它是为了与隐式转换函数兼容。)classtraitpackage

但是,我也在扩展RichValuefromAnyVal以使其成为value class。如果您不熟悉它们,它们允许Scala编译器进行分配优化。具体来说,编译器并不总是需要创建 的实例RichValue,并且可以直接对值类的构造函数参数进行操作。

换句话说,使用Scala 隐式值类作为包装器几乎没有性能开销,这很好。:-)

但是,值类的一个主要限制是它们不能在 aclass或 a中定义trait;它们只能是packages、package objects 或objects 的成员。(这样他们就不需要维护指向外部类实例的指针。)

隐式值类必须遵守两组约束,因此它只能在 apackage object或 an中定义object

这就是问题所在。我要包装的库包含具有大量类和接口的深层包层次结构。理想情况下,我希望能够使用单个import语句导入我的包装类,例如:

使使用它们尽可能简单。

我目前看到的实现这一点的唯一方法是将所有隐式值类定义放在单个源文件中 的单个package object(或)中:object

然而,这远非理想,我更愿意镜像目标库的包结构,但仍然通过单个import语句将所有内容纳入范围。

有没有一种直接的方法来实现这一点,而不会牺牲这种方法的任何好处?

(例如,我知道如果我放弃使这些包装器值类,那么我可以在许多不同的 s 中定义它们trait- 每个组件包一个 - 并让我的根package object扩展所有这些,通过单个将所有内容带入范围导入,但我不想为了方便而牺牲性能。)

0 投票
1 回答
191 浏览

java - Scala - Java interop - 是否可以从 scala 中“选择”被调用的 java 方法?

我在从我的 Scala 代码(scala 2.10.4)调用 Jedis(Java)时遇到了一些互操作问题。

我有一个在隐式类中实现的特征

在基础类上调用方法时出现以下错误

收到以下错误(scala 2.10.4):

我尝试添加一个包装器并将有问题的调用移到隐式类之外:

然后出现此错误:

此代码在使用 scala 2.11 时完全没有问题,并且仅在 scala 2.10 中出现问题

是否有可能“选择”而不是推断应该调用的正确方法?

0 投票
2 回答
621 浏览

scala - Scala:使隐式类可以从注入定义它的类的类中访问

我在注入其他类的类中定义了一个隐式类

有没有办法从类 C 访问隐式类 B(特别是它的方法 b),而不显式导入它?(请注意,A 类不能成为特征,因为它也注入了一些类。)

0 投票
1 回答
372 浏览

scala - 隐式类和“不是类型参数的成员”错误

我有以下类型类定义 -

值得注意的是,在ToBigInt对象中,我包含了一个包含该toBigInt方法的隐式类。

不幸的是,以下代码无法编译 -

另一方面,intellij 的代码没有问题。这段代码有什么问题?

更新:我已经缩小了问题的范围 -

对象中未使用的导入import FromBigInt._导致Test2编译时错误。

0 投票
1 回答
58 浏览

scala - scala中的隐式类未按预期显示输出

我试图在 scala 中运行一个简单的程序,其中涉及 scala 中的隐式类。程序的预期输出是“CZF”,即每个字符加 1。但是,当我在 Eclipse IDE 上执行它时,它既不返回任何结果,也不返回错误。

当我在终端上尝试以下代码块时:

它返回给我“CZF”。我是 scala 语法的新手,任何人都可以帮助我了解为什么我无法在 IDE 上看到结果。

0 投票
1 回答
79 浏览

scala - Scala 从隐式类方法中选择了错误的隐式转换

当转换发生在隐式类声明中时,编译器无法选择正确的隐式转换方法。在下面的示例中,我有一个Foo[T]类和一个隐式Helper类,它接受Foo并提供一个print方法。该 print 方法调用show,它本身就是一个隐式转换提供的方法 on Foo

问题是提供了两种可能的转换show:一种转换Foo[T]为 a Bar[T],另一种转换Foo[Array[T]]为 a BarArray[T]。这个想法是,当我们有一个Foo包含数组的 a 时,我们希望应用更具体的BarArray转换。据我了解,编译器首先选择具有最具体类型的转换。

这在正常上下文中有效,如下例所示,但print在隐式Helper类中的方法的上下文中中断。在那里,show调用了相同的方法,因此我希望应该应用相同的转换。但是,在这种情况下,编译器总是选择Bar转换,即使它有Foo[Array[T]]并且应该选择BarArray转换。

出了什么问题?

最小的失败代码示例:

版本:

  • 斯卡拉 2.12.10
  • SBT 1.4.3
  • JDK 1.8.0_241
0 投票
0 回答
91 浏览

scala - Scala 中的隐式类:性能和良好实践

据我所知,隐式类用于为现有类型提供扩展方法,或者说丰富来自其他库或 API 的类型。但是,我正在玩耍并尝试了这个:

我只想y()从这个文件中访问,而在其他地方未定义。

我本可以添加一个从类 Person 继承的私有类,从而y()在其中添加方法。[1]

所以我的问题是:除了这违背了隐式类本质上创建的原则之外;幕后到底发生了什么,这是否有任何应该注意的性能问题(与解决方案 1 相比)?

0 投票
1 回答
51 浏览

scala - 在不更改父 trait 或 case 类的情况下创建类型敏感函数

假设我有两个类PersonBusiness,它们由 trait 扩展Entity

假设我不能更改EntityPerson并且Business(它们在不同的文件中并且不被更改)我如何定义一个函数,比如 a printEntity,它打印字段nameid,取决于实体?例如,给定 and 的实例,PersonBusiness该如何做这样的事情:

任何想法表示赞赏!对不起,缺乏背景,我还在学习!

0 投票
1 回答
106 浏览

scala - akka 流 SubFlow 的隐式类(通用路径相关类型)

我很难得到一个implicit class编译akka.stream.scaladsl.SubFlow

我的测试代码:

到目前为止我所拥有的隐式课程。

不幸的是,我无法确定为隐式类定义的正确泛型类型。

编译器错误:

查看子流的定义:我不明白我需要如何在我的隐式类上定义泛型类型,trait SubFlow[+Out, +Mat, +F[+_], C] extends FlowOps[Out, Mat] 然后将其用于类型FC.SubFlow

斯卡拉版本:2.12.12