首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dotty 0.19 (Scala 3)特性:上下文抽象

Dotty 0.19 (Scala 3)特性:上下文抽象
EN

Code Review用户
提问于 2019-09-29 18:16:41
回答 1查看 381关注 0票数 3

tl;

我试图编写一些尽可能通用、尽可能可行的代码,以便实体能够与相同类型或不同类型的其他实体通信,从而允许接收方回复发送方。

Details :

  • 尝试使用一些新的上下文抽象,例如给定和扩展方法
  • 具有通用实体类型以启用发送和接收消息
  • 能够发送与我所能接收的不同的消息类型。
  • 能够回复接收到的消息
  • 在存在T的情况下,能够在两个相同类型的Entity[T, TMsg]实例之间发送消息
  • 在存在TEntity[U, UMsg]的情况下,能够在不同类型的Entity[T, TMsg]D17之间发送消息
  • 有一个Person示例,能够接收可以执行所有这些操作的字符串

关于代码的Concerns :

  • 感觉比需要的更复杂,更难理解
  • 类型参数通常只是单个字符的参数,但我觉得它会使代码完全不可读,但是现在我有了非常长的类型签名。

The代码

代码语言:javascript
复制
trait Entity[Me, InMsg] 
  def (me: Me) send[Receiver, OutMsg] (receiver: Receiver, msg: OutMsg) (given Entity[Receiver, OutMsg], Entity[Me, InMsg]): Unit
  def (me: Me) receive[Sender, ReplyMsg] (sender: Sender, msg: InMsg) (given Entity[Sender, ReplyMsg]): Unit
  def (me: Me) name(): String

class Person(private val name: String)

object Person

  given Entity[Person, String]

    def (me: Person) send[Receiver, OutMsg] (receiver: Receiver, msg: OutMsg) (given Entity[Receiver, OutMsg], Entity[Person, String]): Unit = 
      receiver.receive[Person, String](me, msg)

    def (me: Person) receive[Sender, ReplyMsg] (sender: Sender, msg: String) (given Entity[Sender, ReplyMsg]): Unit = 
      println(f"I'm ${me.name} and I just RECEIVED a msg saying $msg from ${sender.name()}")

    def (me: Person) name () = 
      me.name

@main def m = Person("AAA").send(Person("BBB"), "Hi")
EN

回答 1

Code Review用户

发布于 2019-10-04 14:22:50

首先,这里有一件小事:

代码语言:javascript
复制
def (me: Me) send[Receiver, OutMsg] (receiver: Receiver, msg: OutMsg) (given Entity[Receiver, OutMsg], Entity[Me, InMsg]): Unit

第二个given参数实际上是多余的--它与this实际上是相同的类型,对于上下文参数,不应该有任何其他实例。

实际上,sendPerson中的实现显示了您可以有一个默认的impl:

代码语言:javascript
复制
def (me: Me) send[Receiver, OutMsg] (receiver: Receiver, msg: OutMsg) (given Entity[Receiver, OutMsg]): Unit =
  receiver.receive(me, msg)(given this)

接下来,一些更微妙的事情:

代码语言:javascript
复制
def (me: Me) receive[Sender, ReplyMsg] (sender: Sender, msg: InMsg) (given Entity[Sender, ReplyMsg]): Unit

不管是谁实现了这一点,都必须支持任何ReplyMsg,因此不能创建一个(不通过抛出或空值破坏类型系统)。尝试以一种发送返回的方式实现它--您将无法调用使用普通代码编译的send。如果需要的话,可以使用现有要素简化签名:

代码语言:javascript
复制
def (me: Me) receive[Sender] (sender: Sender, msg: InMsg) (given Entity[Sender, ?]): Unit

但我认为不是,因为你想回复一些事情。您必须想出一种方法来使其工作--最简单的方法是有3个参数-- Entity[Me, In, Out]并接受具有Me[Other, Out, In]的东西。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/229864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档