Scala函数值作为参数
在Scala第三版的编程书中。我对printWriter(新文件(“date.txt”)、a=>a.println(新java.util.date))的代码Scala函数值作为参数,scala,functional-programming,Scala,Functional Programming,在Scala第三版的编程书中。我对printWriter(新文件(“date.txt”)、a=>a.println(新java.util.date))的代码“感到困惑” 我使用scala的术语解释a=>a.println(new java.util.Date)在函数调用中,这是一个函数文本,参数是a,并映射到a.println(new java.util.Date)函数。但是withPrintWriter函数的原型需要两种类型,第一种是文件,它适合新文件(“date.txt”),而另一种是函数值
“感到困惑”
我使用scala的术语解释a=>a.println(new java.util.Date)
在函数调用中,这是一个函数文本,参数是a,并映射到a.println(new java.util.Date)函数。但是withPrintWriter函数的原型需要两种类型,第一种是文件,它适合新文件(“date.txt”),而另一种是函数值,它接受PrintWriter类,返回一个单位(不有趣的结果)。我们传递给第二个参数是a=>a.println(newjava.util.Date)
,a的类型是什么。该函数需要一个as参数,函数体是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 _ => _.println(1))
16 }
17 }
以上代码将产生错误。
scala_test/WithPrintWriter1.scala:15:错误:缺少扩展函数的参数类型((x$2)=>x$2.println(1))
_=>u.println(1))。
占位符为什么会产生错误。这是scala编译器无法推断类型的原因吗?但我们可以将子行字符替换为任何没有类型的字符,如“a”、“b”、“c”等。我很困惑
任何帮助都将不胜感激,谢谢
我尝试了这段代码,它添加了PrintWriter类型。没关系可能可以省略该类型。
而我将a替换为这样的u(u:PrintWriter),这将产生一个错误。
scala_test/WithPrintWriter2.scala:15:错误:缺少扩展函数的参数类型((x$2)=>x$2.println(new java.util.Date())
(u:PrintWriter)=>u.println(new java.util.Date)
这很有趣。
救命啊
。。。实际上是
a: PrintWriter => a.println(new java.util.Date)
编译器推断出了类型,因为它知道withPrintWriter()
方法的第二个参数应该是typePrintWriter=>Unit
,即函数具有PrintWriter
类型的输入,但没有任何意义,Unit
,结果
这不起作用,因为下划线有特殊的含义。要正确使用它,您需要编写:.println(1)
在此上下文中,一个下划线表示:
a=>a
是的,您的答案与我的测试非常吻合。也许(类型)=>。。。模式本身是错误的,scala没有这种书写模式。我说的对吗?下划线在不同的上下文中有稍微不同的含义,但你是对的,(\u:Type)=>\uu
是错误的。这有点像说,“忽略输入参数,然后使用它。”
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: PrintWriter) => a.println(new java.util.Date)
16 )
17 }
18 }
a => a.println(new java.util.Date)
a: PrintWriter => a.println(new java.util.Date)