【问题标题】:scala# extending loan pattern with type parameter: issuescala# 使用类型参数扩展贷款模式:问题
【发布时间】:2016-07-28 05:55:01
【问题描述】:

尝试使用类型参数扩展贷款模式并获得下一个错误。 看起来只是一个语法错误。 我确实怀疑这是一个柯里化限制?在我的情况下,必须以某种方式提供返回类型。 谢谢!

      import java.io._

     //def withPrintWriter(file: File)( op: PrintWriter => Unit) {      
     def withPrintWriter[T: Numeric](file: File)(implicit count: Numeric[T])( op: PrintWriter => Unit) {        
    import count._
    val writer = new PrintWriter(file)      
    try {           
        for(x <- 0 to count.toInt() )
        {                           
            op(writer)
        }
    } finally {
        writer.close()
    }
}


val file = new File("date.txt")

withPrintWriter[Int]( file )( 5 ){
//withPrintWriter( file ){
    writer => writer.println( new java.util.Date )  
}

错误: c:\Sources\scala\main.scala:101: 错误:'=' 预期但 '(' 找到。 def withPrintWriter[T: Numeric](file: File)(隐式计数: Numeric[T])( 操作:PrintWriter => 单位){ ^ c:\Sources\scala\main.scala:115: 错误:简单表达式的非法开始 val 文件 = 新文件(“date.txt”) ^

【问题讨论】:

  • 带有implicit的参数列表必须是最后一个,使用T : Numeric就不需要隐式参数。 def withPrintWriter[T](file: File)(op: PrintWriter =&gt; Unit)(implicit count: Numeric[T]): Unitdef withPrintWriter[T : Numeric](file: File)(op: PrintWriter =&gt; Unit): Unit(在有趣的正文中使用 val count = implicitly[Numeric[T]]
  • 感谢您的提示。我设法解决了函数签名问题: withPrintWriter[T: Numeric](file: File)( op: PrintWriter => Unit)(implicit count: T) : Unit ;但是在调用此函数时出现问题: val file = new File("date.txt") val count : Int = 5 withPrintWriter[Int]( file )( writer => writer.println( new java.util.Date ) ) ( count ) 错误:没有提供足够的参数! :(
  • implicit count: T 那里没有意义
  • 知道了!它的工作完美!谢谢

标签: scala


【解决方案1】:

乍一看,您的方法 def 似乎在正文(括号)之前缺少=...例如def foo(a: Int): Int = { ... }

【讨论】:

  • 好吧,正如我所见,显然 = 不是必需的。下一个函数签名工作正常: def withPrintWriter[T: Numeric](file: File)( op: PrintWriter => Unit)(count: T) {
  • = 不是必需的,因为def foo() { 自动将返回类型定义为Unit(与def foo(): Unit = { 相同)
  • 好吧,我的错……我没有注意到这是返回 Unit 的事实;如果这具有误导性,我深表歉意!
【解决方案2】:

看起来必须发布我的问题的答案:) 在原始代码中不需要使用隐式!看起来很简单……

    def withPrintWriter[T: Numeric](file: File)(count: T)( op: PrintWriter => Unit) {       
    val writer = new PrintWriter(file)      
    try {           
        for(x <- 0 to count.asInstanceOf[Int] )
        {                           
            op(writer)
        }
    } finally {
        writer.close()
    }
}


val file = new File("date.txt")
val count : Int = 5 

withPrintWriter[Int]{ file }{ count }    
{ 
    writer => writer.println( new java.util.Date ) 
}   

【讨论】:

  • asInstanceOf[T] 不安全,使视图绑定: Numeric 无用。做得更好val limit = implicitly[Numeric[T]].toInt(count); (0 to limit).foreach { _ =&gt; op(writer) }
  • 感谢您的提示,我不知道,这种不安全会导致什么?我怀疑无法进行类型转换崩溃?
  • isInstanceOf 本身就是不安全的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多