tl;
我试图编写一些尽可能通用、尽可能可行的代码,以便实体能够与相同类型或不同类型的其他实体通信,从而允许接收方回复发送方。
Details :
T的情况下,能够在两个相同类型的Entity[T, TMsg]实例之间发送消息T和Entity[U, UMsg]的情况下,能够在不同类型的Entity[T, TMsg]和D17之间发送消息Person示例,能够接收可以执行所有这些操作的字符串关于代码的Concerns :
The代码
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")发布于 2019-10-04 14:22:50
首先,这里有一件小事:
def (me: Me) send[Receiver, OutMsg] (receiver: Receiver, msg: OutMsg) (given Entity[Receiver, OutMsg], Entity[Me, InMsg]): Unit第二个given参数实际上是多余的--它与this实际上是相同的类型,对于上下文参数,不应该有任何其他实例。
实际上,send在Person中的实现显示了您可以有一个默认的impl:
def (me: Me) send[Receiver, OutMsg] (receiver: Receiver, msg: OutMsg) (given Entity[Receiver, OutMsg]): Unit =
receiver.receive(me, msg)(given this)接下来,一些更微妙的事情:
def (me: Me) receive[Sender, ReplyMsg] (sender: Sender, msg: InMsg) (given Entity[Sender, ReplyMsg]): Unit不管是谁实现了这一点,都必须支持任何ReplyMsg,因此不能创建一个(不通过抛出或空值破坏类型系统)。尝试以一种发送返回的方式实现它--您将无法调用使用普通代码编译的send。如果需要的话,可以使用现有要素简化签名:
def (me: Me) receive[Sender] (sender: Sender, msg: InMsg) (given Entity[Sender, ?]): Unit但我认为不是,因为你想回复一些事情。您必须想出一种方法来使其工作--最简单的方法是有3个参数-- Entity[Me, In, Out]并接受具有Me[Other, Out, In]的东西。
https://codereview.stackexchange.com/questions/229864
复制相似问题