【问题标题】:missing parameter type for expanded function for primitive to char conversion原始到字符转换的扩展函数缺少参数类型
【发布时间】:2015-08-15 22:38:03
【问题描述】:

我知道堆栈溢出上有类似的问题。

但是,如果在某些地方可以提供以下任何简单的解释,那就太好了。

val arr1 = Array.tabulate(5)( (_+65) )

编译正常。

val arr2 = Array.tabulate(5)( (_+65).toChar )

是编译时错误。

另外,我想知道如何使用 -Ytyper-debug,如 @som-snytt 中所述 Scala: missing parameter type

【问题讨论】:

    标签: scala types parameters


    【解决方案1】:

    编译器编译时:

    Array.tabulate(5)( (_+65) )
    

    它将等于:

    Array.tabulate(5)(x => (x + 65 ) )
    

    但对于:

    Array.tabulate(5)( (_+65).toChar )
    

    它将被扩展为一个匿名函数:

    Array.tabulate(5)( (x => x + 65).toChar )
    

    编译器会丢失函数体中x的上下文。

    您可以使用scala -Ytyper-debug查看详情:

    类型调试输出:

    ((x$1) => x$1.$plus(65)).toChar
    

    【讨论】:

    • @checgpohi : 除了 val arr = Array.tabulate( 5 )( ( i: Int ) => { ( i + 65 ).toChar } ) 之外,还有其他使用 toChar 的快捷方式吗? >
    • 可以定义一个函数def f(x: Int) = (x + 65).toChar,使用Array.tabulate(5).map(f(_))进行计算
    • 有点难看,但可能:Array.tabulate[Char](5)(_.+(65).toChar)
    • un,你为什么不喜欢这个Array.tabulate(5)(x => (x + 65 ).toChar)?它更干净,更具可读性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多