Это может произойти из-за выравнивания байта и дополнения так, чтобы структура вышла к четному числу байтов (или слова) на Вашей платформе. Например, в C на Linux, следующих 3 структурах:
#include "stdio.h"
struct oneInt {
int x;
};
struct twoInts {
int x;
int y;
};
struct someBits {
int x:2;
int y:6;
};
int main (int argc, char** argv) {
printf("oneInt=%zu\n",sizeof(struct oneInt));
printf("twoInts=%zu\n",sizeof(struct twoInts));
printf("someBits=%zu\n",sizeof(struct someBits));
return 0;
}
Имеют участников, кто размеры (в байтах), 4 байта (32 бита), 8 байтов (2x 32 бита) и 1 байт (2+6 битов) соответственно. Вышеупомянутая программа (на Linux с помощью gcc) печатает размеры как 4, 8, и 4 - где последняя структура дополняется так, чтобы это было отдельное слово (4 байта на 8 битов на моей платформе на 32 бита).
oneInt=4
twoInts=8
someBits=4
Непонятно, о чем вы просите - какой вы ожидаете от семантики множественного yield. Одна вещь, однако, заключается в том, что вы, вероятно, никогда не захотите использовать индексы для навигации по списку - каждый вызов t (i) - это O (i) для выполнения.
Итак, вот одна возможность, о которой вы могли бы просить
scala> val l = List(1,2,3); val t = List(-1,-2,-3)
l: List[Int] = List(1, 2, 3)
t: List[Int] = List(-1, -2, -3)
scala> val pairs = l zip t
pairs: List[(Int, Int)] = List((1,-1), (2,-2), (3,-3))
И вот еще одна возможность, о которой вы могли бы спросить
scala> val crossProduct = for (x <- l; y <- t) yield (x,y)
crossProduct: List[(Int, Int)] = List((1,-1), (1,-2), (1,-3), (2,-1), (2,-2), (2,-3), (3,-1), (3,-2), (3,-3))
Последний вариант - это просто синтаксический сахар для
scala> val crossProduct2 = l flatMap {x => t map {y => (x,y)}}
crossProduct2: List[(Int, Int)] = List((1,-1), (1,-2), (1,-3), (2,-1), (2,-2), (2,-3), (3,-1), (3,-2), (3,-3))
Третий вариант - вы хотите чередовать их
scala> val interleaved = for ((x,y) <- l zip t; r <- List(x,y)) yield r
interleaved: List[Int] = List(1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 9, -9, 10, -10)
Это синтаксический сахар для
scala> val interleaved2 = l zip t flatMap {case (x,y) => List(x,y)}
interleaved2: List[Int] = List(1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 9, -9, 10, -10)
По-видимому, нет. Я получаю ошибку компиляции, когда пытаюсь это сделать.
Похоже для .. yield - это выражение. У вас не может быть двух выходов, поскольку это не является частью выражения.
Если вы хотите получить несколько значений, почему бы не выдать их в виде кортежа или списка?
Например:
for( t <- List(1,2,3); l <- List(-1,-2,-3))
yield (t, l)
Нет, вы не можете использовать несколько предложений yield, но есть обходные пути. Например:
for (i <- 0 to 10;
r <- List(l(i), t(i)))
yield r
Вы, конечно, можете вкладывать for-complation, но это приведет к списку списков элементов, который, я не думаю, вам нужен.
Может быть yield - не лучший вариант? Возможно, здесь можно было бы использовать простое добавление массива.