Scala:隐式转换来生成方法值?

发布于 2024-12-11 20:28:50 字数 504 浏览 0 评论 0原文

如果我在 Scala 中有以下类:

class Simple {
  def doit(a: String): Int = 42
}

并且该类的实例

o = new Simple()

是否可以定义一个隐式转换,将该实例和编译时已知的方法变形为这样的元组?

Tuple2 (o, (_: Simple).doit _)

我希望我能够本着以下精神提出一个用于注册函数回调的方法:

doThisLater (o -> 'doit)

我在功能上让我的函数回调基于 Retronym 对 上一个问题,但是添加这厚厚的语法糖层会很棒。

If I have the following class in Scala:

class Simple {
  def doit(a: String): Int = 42
}

And an instance of that class

o = new Simple()

Is possible to define an implicit conversion that will morph this instance and a method known at compile into a tuple like this?

Tuple2 (o, (_: Simple).doit _)

I was hoping I could come up with one for registering function callbacks in the spirit of:

doThisLater (o -> 'doit)

I functionally have my function callbacks working based on retronym's answer to a previous SO question, but it'd be great to add this thick layer of syntactic sugar.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

中性美 2024-12-18 20:28:50

您只需对方法进行 eta 扩展即可。 REPL 会话示例,

scala> case class Deferred[T, R](f : T => R)
defined class Deferred

scala> def doThisLater[T, R](f : T => R) = Deferred(f)
doThisLater: [T, R](f: T => R)Deferred[T,R]

scala> val deferred = doThisLater(o.doit _)  // eta-convert doit
deferred: Deferred[String,Int] = Deferred(<function1>)

scala> deferred.f("foo")
res0: Int = 42

You can just eta-expand the method. Sample REPL session,

scala> case class Deferred[T, R](f : T => R)
defined class Deferred

scala> def doThisLater[T, R](f : T => R) = Deferred(f)
doThisLater: [T, R](f: T => R)Deferred[T,R]

scala> val deferred = doThisLater(o.doit _)  // eta-convert doit
deferred: Deferred[String,Int] = Deferred(<function1>)

scala> deferred.f("foo")
res0: Int = 42
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文