我想在一个库中定义一个trait,其中上下文参数的类型由库的调用者用户定义。例如,它看起来像这样:
////////////////////////
// library
////////////////////////
trait Animal:
// goal: the type of the context we pass to `make_sound` is defined by the implementor
def make_sound()(using ctx: ???): Unit
def do_something(animal: Animal) = {
animal.make_sound()
}
////////////////////////
// user code
////////////////////////
trait CatMakeSoundContext:
def get_claw_length(): Int
class Cat extends Animal:
// FAILS because this doesn't have the same signature as in `Animal`
override def make_sound()(using ctx: CatMakeSoundContext) = {
if ctx.get_claw_length() > 2 {
println("scratch!")
} else {
println("meow")
}
}
class MyCatMakeSoundContext extends CatMakeSoundContext {
override def get_claw_length(): Int = 2
}
def call_example() = {
val cat: Cat = ...;
val claw_context = MyCatMakeSoundContext()
// somehow set up the `claw_context` with a `given` clause
// to be used by `animal.make_sound()`
// call `do_something()`, which will end up using `claw_context`
// as the value for the implicit `ctx` in `make_sound()`
do_something(cat)
}
在这个例子中,我很可能使用了错误的语言特性。有没有可能以这样或那样的方式实现类似于我在这里描述的东西?我怀疑泛型可能有用,但我无法弄清楚。
1条答案
按热度按时间oyjwcjzk1#
您可以尝试使上下文成为类型成员
也可以将上下文设置为类型参数
此外,还可以将
Animal
设置为类型类