Я хорошо объясню это на примере. предположим, что мы имеем следующий союз:
union A{
int x;
short y[2];
};
Я полагаю, что sizeof(int)
дает 4, а sizeof(short)
дает 2. когда вы пишете union A a = {10}
, чтобы создать новый var типа A вставьте в него значение 10.
ваша память должна выглядеть так: (помните, что все члены союза получают одно и то же местоположение)
| x | | y[0] | y[1] | ----------------------------------------- a-> |0000 0000|0000 0000|0000 0000|0000 1010| -----------------------------------------
, как вы могли видеть, значение ax равно 10, значение ay 1 равно 10, а значение ay [0] равно 0.
теперь, что хорошо, если я это сделаю?
a.y[0] = 37;
наша память будет выглядеть так:
| x | | y[0] | y[1] | ----------------------------------------- a-> |0000 0000|0010 0101|0000 0000|0000 1010| -----------------------------------------
это превратит значение ax в 2424842 (в десятичном виде).
теперь, если ваш союз имеет float или double, ваша карта памяти будет скорее беспорядочной, потому что вы храните точные числа. более подробную информацию вы можете получить в здесь .
Вот трюк. Позволяет открыть 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, вы должны отслеживать созданные вами сущности и, если изменения типов определений, убедитесь, что неопределенные определения не сохраняются (переписывайте вещи, если необходимо), прежде чем продолжить.