gpt4 book ai didi

scala - Scala 能否约束对象图,以便只有与上下文相关的对象可见?

转载 作者:行者123 更新时间:2023-12-04 21:48:50 25 4
gpt4 key购买 nike

有没有办法使用 Scala 的类型系统来简洁地指定完整对象图的上下文相关子图?

DCI 认为您通常有一个相当复杂的对象图,但在任何一个用例中,您通常只想使用子图。您有一个 Foo有一个 Bar和一个 Bat ,但是当您处于用例 1 中时,您只关心 Bar在用例 2 中,只有 Bat .

例如,假设您有这个结构,而 Role1 用例需要 Foo->Bar->Baz->Bin和 Role2 用例需要 Foo->Bat->Baz->Buz :

class Foo{
val bar = new Bar() //Only relevant to Role 1
val bat = new Bat() //Only relevant to Role 2
}

class Bar {
val baz = new Baz()
}

class Bat {
val baz = new Baz()
}

//Relevant to both Role 1 and 2 (via Bar or Bat)
class Baz {
val bin = new Bin() //Only relevant to Role 1
val buz = new Buz() //Only relevant to Role 2
}

class Bin{}
class Buz{}

中很容易看到如何限制访问单类通过使用特征:
trait FooInRole1 { def bar : Bar }  //Define accessor in trait
s/Foo/Foo extends FooInRole1/ //Change Foo's declaration to implement trait
val f : FooInRole1 = new Foo //LHS is i'face, RHS is implementation
//f.bat <--Compile error Irrelevant field is not available. \o/

但是您必须为与用例相关的每个对象重复此模式。 (例如,您需要一个 BazInRole1 来访问 bin 和一个 BazInRole2 来访问 biz )

我的问题是是否有某种方法可以避免编写所有这些容易出错、命名空间拥挤的特征。例如,我可以想象这样的代码(不编译):
class Foo[T] {
T match {
case r1 : Role1 => def bar : Bar[T]
case r2 : Role2 => def bat : Bat[T]
case _ => //Nothing
}
}

val fInRole1 = new Foo[Role1] //Provides Foo->Bar->Baz->Bin
val fInRole2 = new Foo[Role2] //Provides Foo->Bat->Baz->Buz

似乎 Scala 的类型系统具有足够的表现力来做这样的事情,但我无法弄清楚。

最佳答案

不是很简洁,成员都在,就是没办法用,但也许朝这个方向走就可以了?

class Foo[R] {
def bar(implicit ev: R <:< Role1) = new Bar[R] //Only relevant to Role 1
def bat(implicit ev: R <:< Role2) = new Bat[R] //Only relevant to Role 2
}

关于scala - Scala 能否约束对象图,以便只有与上下文相关的对象可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9405940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com