gpt4 book ai didi

Scala 应用无参数

转载 作者:行者123 更新时间:2023-12-03 20:35:48 25 4
gpt4 key购买 nike

我想创建一个在请求时生成随机事物的程序,例如下面示例中的字母。我已经定义了一个带有伴随对象的抽象类来返回子类之一。

  abstract class Letter

class LetterA extends Letter {
override def toString = "A"
}
class LetterB extends Letter {
override def toString = "B"
}
class LetterC extends Letter {
override def toString = "C"
}

object Letter {
def apply = RNG.d(3) match {
case 1 => new LetterA
case 2 => new LetterB
case 3 => new LetterC
}
override def toString = "Random Letter"
}

梦想是我将能够使用 Letter获取 A、B 或 C 类型的随机字母。但使用此代码,它只会给我字母对象。 Letter.apply给我 A、B 或 C,但很丑。

如果我更改 apply函数为 apply()然后事情会好一点,因为我可以使用 Letter()得到我的随机字母之一,但是 Letter仍然给我对象。

我能做些什么来为 Letter 分配一些东西吗?实际上解析为 LetterA 之一, LetterBLetterC ?

最佳答案

您的问题的答案是否定的,您无法区分 Letter.type 和 Letter.apply,因此您需要一种解决方法。

我建议你使用 Type-Class 模式,它比向伴随对象添加随机生成的应用方法更具可扩展性

  trait RandomGenerator[T] {
def gen: T
}

implicit object RandomLetter extends RandomGenerator[Letter] {

private val rnd = new Random()

def gen = (rnd.nextInt(3) + 1) match {
case 1 => new LetterA
case 2 => new LetterB
case 3 => new LetterC
}
}

def random[T: RandomGenerator]: T =
implicitly[RandomGenerator[T]].gen


println(random[Letter])
println(random[Letter])
println(random[Letter])

关于Scala 应用无参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28748370/

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