【发布时间】:2017-05-15 02:37:42
【问题描述】:
假设我有以下:
class Deck[+T] {
class Card(value: T)
class Pile(val cards: List[Card]) {
val deck = Deck.this
def shuffle(shuffler: Shuffler): shuffler.shuffle(this)
}
}
trait Shuffler {
def shuffle[T](pile: Deck[T]#Pile): pile.type
}
object Shuffler {
def randomShuffler(r: Random): Shuffler = new Shuffler {
override def shuffle[T](pile: Deck[T]#Pile): pile.deck.Pile = {
new pile.deck.Pile(r.shuffle(pile.cards))
}
}
}
在Pile 中没有val deck 声明是否可以做同样的事情?另外,如果没有shuffle() 中的T 声明,是否可以做同样的事情?
我一直在玩诸如 pile: x.Pile forSome {val x: Deck[_]} 之类的东西,但由于打字问题,它们似乎无法编译(阅读:我没有完全理解其中的语义),并且我试图避免重写 Shuffler例如,改为使用原始列表(无论如何,我该如何表达?List[Deck[T]#Card] 并不完全存在,因为我想要来自同一个 Deck 的 Cards 列表)。
【问题讨论】:
-
我可能不明白你在这里要做什么,但是
Card和Pile的定义存在于Deck之外是否有意义?如果他们需要使用与Deck相同的类型,您始终可以参数化Card[T] -
class Deck[+T](val cards: Set[Card[T]]); class Card[T](value: T) -
Pile和Card是Deck的内部类的部分原因是为了强制执行Cards 仅与单个Deck实例相关联的事实。 (也就是说,将Deck视为一个封装了Cards 的对象。) -
对于
List的事情,List[deck.Card] forSome { val deck: Deck[_] }有效吗? (forSome在List之外,因此所有元素中只有一个Deck。)
标签: scala inner-classes