Скажет, у нас есть эти вложенные классы и конкретизация A
:Удаления путь-зависимость от проверки типа в Scala
class A {
case object B
case class C(c: Int)
}
val a1 = new A()
Теперь я могу проверить, что a1.B
является экземпляром a1.B.type
, но как я могу проверить, что тип из a1.B
является экземпляром любогоA#B.type
, потому что компилятор не примет этот синтаксис.
a1.B.isInstanceOf[a1.B.type]
res: Boolean = true
a1.B.isInstanceOf[A#B.type]
<console>:1: error: ']' expected but '.' found.
a1.B.isInstanceOf[A#B.type]
^
Для класса случае это, кажется, работает без проблем:
a1.C(0).isInstanceOf[a1.C]
res: Boolean = true
a1.C(0).isInstanceOf[A#C]
res: Boolean = true
последующий вопрос: Когда у меня есть
val a1 = new A()
val a2 = new A()
Есть функция, которая делает проверку равенства без принимая во внимание зависимость от пути? Например. при сравнении a1.B
и a2.B
. Например:
a1.B =#= a2.B
true
a1.C(0) =#= a2.C(0)
true
a1.C(0) =#= a2.C(1)
false
Edit: Для уточнения: Просто введение общей чертой для B
не достаточно, так как я хочу, чтобы держать пари в состоянии различать случае объекты:
class A {
trait BB
case object B1 extends BB
case object B2 extends BB
}
val a1 = new A
val a2 = new A
a1.B1 =#= a2.B1 // should be true
a1.B2 =#= a2.B2 // should be true
a1.B1 =#= a1.B2 // should be false
a1.B1 =#= a2.B2 // should be false
Теперь .hashCode
(или .##
) метод кажется, чтобы решить эту проблему:
a1.B1.## == a2.B1.## // true
a1.B1.## == a2.B2.## // false
но, возможно, Ther e - более элегантное решение (я бы также хотел использовать a1.B1
в сопоставлении с образцом).
Вы ищете тест времени выполнения (то есть пост стирания)? –
Я решил свою проблему, переместив «случайный объект» из внешнего класса, поэтому теперь это скорее общий вопрос. Я полагаю, что для проверки равенства значений времени выполнения можно обойтись, сравнивая «hashCode», если нет лучшего способа. – Debilski
Вы хотите, чтобы проверка проверялась или должна была быть 'a1.C (0) == a2.C (0)'? Если это нужно использовать 'final case class ' –