Несоответствующие типу Scala сигнатуры: Range.toList и Range.toArray - PullRequest
1 голос
/ 19 сентября 2009

Я только что преобразовал следующую Java в Scala:

char[] map = new char[64];
int i=0;
for (char c='A'; c<='Z'; c++) map[i++] = c;
for (char c='a'; c<='z'; c++) map[i++] = c;
for (char c='0'; c<='9'; c++) map[i++] = c;
map[i++] = '+';
map[i++] = '/';

Моей первой попыткой был массив:

val map1 = (
  ('A' to 'Z') ++ ('a' to 'z') ++ ('0' to '9')
).toArray[Char] ++ Array('+', '/');

Это работает! Чуть больше чтения, и я понял, что Array является изменяемым типом, в то время как List является неизменяемым, поэтому я изменил его на:

val map1 = (
  ('A' to 'Z') ++ ('a' to 'z') ++ ('0' to '9')
).toList ++ List('+', '/');

Код становится немного более читабельным: черта toList не принимает аргумент типа, тогда как мне нужно было написать toArray[Char]. Зачем? Это вопрос совместимости Java или несогласованность библиотек, с toList из Iterable и toArray из Collection?

Ответы [ 2 ]

2 голосов
/ 19 сентября 2009

Вы можете объединить два списка разных типов; В результате получается список их наименьшего общего предка:

scala> val l1=List(1)
l1: List[Int] = List(1)

scala> val la=List('a')
la: List[Char] = List(a)

scala> l1++la
res4: List[AnyVal] = List(1, a)

Вы должны использовать ('a' to 'z') вместо ('a' until 'z'+1).

В Scala 2.8 .toArray работает нормально - но это, вероятно, потому, что Range (to и until) является общим:

scala> 'a' to 'z'
res3: scala.collection.generic.VectorView[Char,Vector[Char]] = RichChar(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z)

Я подозреваю, что в 2.7.x диапазон всегда дает целые числа.

0 голосов
/ 19 сентября 2009

Я не могу воспроизвести упомянутую вами проблему:

Welcome to Scala version 2.7.4.final (Java HotSpot(TM) Client VM, Java 1.6.0_16).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val map1 = ( ('A' to 'Z') ++ ('a' to 'z') ++ ('0' to '9') ).toArray ++ Array('+', '/')
map1: Array[Char] = Array(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e, f
, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, /)

scala> val map1 = (
     |   ('A' to 'Z') ++ ('a' to 'z') ++ ('0' to '9')
     | ).toArray ++ Array('+', '/');
map1: Array[Char] = Array(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e, f
, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, /)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...