/ / Scala niejawny zakres parametru - scala, błędy kompilatora

Niejawny zakres parametru Scala - scala, błędy kompilatora

Spędziłem cały ranek czytając, jak implikuje to zakres Scali, w tym bardzo doskonałą odpowiedź tutaj: Gdzie Scala szuka implicitów?

Ale niestety nadal jestem zdezorientowany. Pozwól, że podam przykład tego, co próbuję zrobić:

object Widget {
implicit val xyz: Widget = new Widget("xyz")
}
class Widget(val name: String) {
override def toString = name
}
class Example {
def foo(s: String)(implicit w: Widget): Unit = {
println(s"Got $s with $w")
}
def bar {
foo("abc")  // Compiler error at this line
}
}

object implicit_test {
val x = new Example()
x.bar
}

Spodziewam się więc czegoś takiego Got abc with xyz. Zamiast tego powiedziano mi could not find implicit value for parameter w: Widget. Dziwnie, jeśli poruszę Widget klasa i obiekt, a także Example klasa wewnątrz temu implicit_test obiekt, to działa.

Wyjaśnij mi jeszcze raz, jeśli tak, jak dokładnie Scala identyfikuje domyślną wartość, której należy użyć!

Odpowiedzi:

4 dla odpowiedzi № 1

Twój kod powinien działać i działa dla mnie.

Czy przypadkiem wpisałeś to w REPL? Jeśli tak, to coś specjalnego dotyczy obiektów towarzyszących. W scali obiekt towarzyszący musi znajdować się w tym samym pliku co jego klasa (w przeciwnym razie kod jest prawidłowy, ale nie jest to „obiekt towarzyszący”, tylko obiekt o tej samej nazwie i nie będący częścią niejawnego zakresu). W REPL nie ma plików, ale klasa i jej obiekt towarzyszący muszą być zdefiniowane w tym samym czasie. Aby to zrobić, musisz wprowadzić je w trybie wklejania.

Rodzaj :paste, następnie wklej (lub po prostu wpisz) przynajmniej obiekt Widget i Widżet klasy (możesz wkleić resztę do kodu w tym samym czasie, ale nie jest to konieczne), a następnie CTRL-D. To powinno działać.