scala - 如何向库对象添加新方法?

标签 scala enrich-my-library

我有一个图书馆的类(class)(特别是 com.twitter.finagle.mdns.MDNSResolver )。我想扩展这个类(我希望它返回一个 Future[Set],而不是一个 Try[Group])。

当然,我知道我可以对它进行子类化并在那里添加我的方法。但是,我正在努力学习 Scala,这似乎是一个尝试新事物的机会。

我认为这可能的原因是 JavaConverters 的行为.以下代码:

class Test {
    var lst:Buffer[Nothing] = (new java.util.ArrayList()).asScala
}

不编译,因为没有asScala Java 的 ArrayList 上的方法.但是,如果我导入一些新定义:
class Test {
    import collection.JavaConverters._
    var lst:Buffer[Nothing] = (new java.util.ArrayList()).asScala
}

然后突然有一个asScala方法。所以看起来像 ArrayList类正在被透明地扩展。

我了解 JavaConverters 的行为吗?正确吗?我可以(并且应该)复制该方法吗?

最佳答案

Scala 支持一种叫做隐式转换的东西。请看以下内容:

val x: Int = 1
val y: String = x

第二个分配不起作用,因为 String是预期的,但 Int被发现。但是,如果您将以下内容添加到范围内(只是在范围内,可以来自 任何地方 ),它可以工作:
implicit def int2String(x: Int): String = "asdf"

请注意,方法的名称无关紧要。

所以通常所做的,称为 pimp-my-library-pattern:
class BetterFoo(x: Foo) {
  def coolMethod() = { ... }
}

implicit def foo2Better(x: Foo) = new BetterFoo(x)

这使您可以调用coolMethodFoo .这经常被使用,从 Scala 2.10 开始,你可以这样写:
implicit class BetterFoo(x: Foo) {
  def coolMethod() = { ... }
}

它做同样的事情,但显然更短更好。

所以你可以这样做:
implicit class MyMDNSResolver(x: com.twitter.finagle.mdns.MDNSResolver) = {
  def awesomeMethod = { ... }
}

您可以调用awesomeMethod在任何 MDNSResolver , 如果 MyMDNSResolver是在范围内。

关于scala - 如何向库对象添加新方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17072184/

相关文章:

java - 可选化 Java getter

scala - 在scala中使用“丰富我的图书馆”的最佳方法是什么?

scala - 有没有办法将 Scala 类 "enrich"而不将代码包装到另一个对象中?

string - Scala 字符串按字符数量递减分割

Scala 用于理解和循环

scala - 为什么在 actor 中创建一个 actor 是危险的

scala - 为所有 Traversable 丰富我的图书馆

java - Blowfish 在 Java/Scala 中加密并在 bash 中解密

java - Spark/scala 中的 SQL 查询

scala - 如何将“丰富我的图书馆”模式应用于Scala集合?