Scala函数值作为参数

时间:2018-01-03 03:23:05

标签: scala functional-programming

在Scala编程第3版中。我对代码 ' If found I need the value from Sheet2 that is in Col B of the matching With ThisWorkbook .Sheets("Sheet1").Cells(cell.Row, 2).Value =.Sheets("Sheet2").Cells(Application.Match(cell, r2, 0), 2).Value End With

感到困惑
"WithPrintWriter(new File("date.txt"), a => a.println(new java.util.Date) )}"

我使用scala的术语来解释函数调用中的 1 import java.io._ 2 3 object WithPrintWriter1 { 4 def withPrintWriter(file: File, op: PrintWriter => Unit) { 5 val writer = new PrintWriter(file) 6 try { 7 op(writer) 8 } finally { 9 writer.close() 10 } 11 } 12 def main(args: Array[String]) { 13 withPrintWriter( 14 new File("date.txt"), 15 a => a.println(new java.util.Date) 16 ) 17 } 18 } ,这是一个函数文字,参数是a并映射到a.println(new java.util.Date)函数。但是withPrintWriter函数的原型需要两种类型,第一种是File,它适用于新文件(" date.txt"),而另一种是函数值,它采用PrintWriter类,返回一个单位(不是有趣的结果)。我们传递给第二个参数是a=> a.println(new java.util.Date),它的类型是什么。函数需要一个as参数,函数体是a.println(new java.util.Date)。你觉得它太奇怪了吗? scala编译器如何完成这种代码?

a => a.println(new java.util.Date)

上面的代码会产生错误。 scala_test / WithPrintWriter1.scala:15:错误:缺少扩展函数的参数类型((x $ 2)=> x $ 2.println(1))     _ => _.println(1))。 为什么占位符会产生错误。这是scala编译器无法推断出类型的原因吗?但我们可以将sub_line字符替换为任何字符,例如' a'' b'' c'等等也没有类型。我很困惑。

任何帮助将不胜感激,谢谢。

我尝试了这个代码,它添加了PrintWriter类型。没关系。 也许可以省略类型。

  1 import java.io._
  2 
  3 object WithPrintWriter1 {
  4   def withPrintWriter(file: File, op: PrintWriter => Unit) {
  5     val writer = new PrintWriter(file)
  6     try {
  7       op(writer)
  8     } finally {
  9       writer.close()
 10     }
 11   }
 12   def main(args: Array[String]) {
 13     withPrintWriter(
 14       new File("date.txt"),
 15     _ => _.println(1))
 16   }
 17 }

虽然我用_替换a(_:PrintWriter),这会产生错误。 scala_test / WithPrintWriter2.scala:15:错误:扩展函数缺少参数类型((x $ 2)=> x $ 2.println(new java.util.Date()))       (_:PrintWriter)=> _.println(new java.util.Date) 这太有趣了。 帮助

1 个答案:

答案 0 :(得分:2)

a => a.println(new java.util.Date)

...实际上是......的简写。

a: PrintWriter => a.println(new java.util.Date)

编译器已推断出类型,因为它知道withPrintWriter()方法的第二个参数应该是类型PrintWriter => Unit,即函数类型PrintWriter输入并且没有任何意义,Unit,结果。

这不会起作用,_ => _.println(1),因为下划线具有特殊意义。要正确使用它,您可以写:_.println(1)

在此上下文中,单个下划线是:a => a

的简写