замените значение предыдущим значением в векторе, если предыдущее значение > значение

Вот трюк. Позволяет открыть REPL и определить класс:

scala> case class Foo(i: Int)
defined class Foo

и простую функцию, которая работает с этим классом:

scala> def fooToInt(foo: Foo) = foo.i
fooToInt: (foo: Foo)Int

переопределить класс:

scala> case class Foo(i: Int)
defined class Foo

и создать экземпляр:

scala> val foo = Foo(1)
foo: Foo = Foo(1)

Все, что осталось, - вызвать fooToInt:

scala> fooToInt(foo)
<console>:34: error: type mismatch;
 found   : Foo(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC)
 required: Foo(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC)
          fooToInt(foo)

Он выглядит знакомым? Еще один трюк, чтобы лучше понять, что происходит:

scala> case class Foo(i: Int)
defined class Foo

scala> val foo = Foo(1)
foo: Foo = Foo(1)

scala> case class Foo(i: Int)
defined class Foo

scala> def fooToInt(foo: Foo) = foo.i
<console>:31: error: reference to Foo is ambiguous;
it is imported twice in the same scope by
import INSTANCE.Foo
and import INSTANCE.Foo
         def fooToInt(foo: Foo) = foo.i

. Короче говоря, это ожидаемое, хотя и слегка запутанное поведение, которое возникает из неоднозначных определений, существующих в той же области.

Если вы не хотите периодически :reset REPL state, вы должны отслеживать созданные вами сущности и, если изменения типов определений, убедитесь, что неопределенные определения не сохраняются (переписывайте вещи, если необходимо), прежде чем продолжить.

0
задан Helbisch 5 April 2019 в 14:38
поделиться