代码之家  ›  专栏  ›  技术社区  ›  David Crawshaw

scala不一致类型签名:range.tolist和range.toarray

  •  1
  • David Crawshaw  · 技术社区  · 16 年前

    我只是把下面的Java转换成斯卡拉:

    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 trait不接受类型参数,而我需要编写 toArray[Char] . 为什么?这是Java互操作性的问题,还是图书馆的不一致性? 托利斯特 来自 Iterable toArray 来自 Collection ?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Jonathan Graehl    16 年前

    可以连接两个不同类型的列表;结果是它们最不常见祖先的列表:

    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中,range总是给你int。

        2
  •  0
  •   Daniel C. Sobral    16 年前

    我无法再现你提到的问题:

    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, +, /)
    
    推荐文章