0

我一直在尝试部分应用功能,并且发生了这样的事情。假设我们有这样的代码:

class Color(name:String) {
override def toString = name
}

class Point(x: Int, y:Int) {
override def toString:String = "("+x +"," + y + ")"
 }

class Linestyle(name: String) {
override def toString = name
 }

def drawLine(width:Double, color: Color, style: Linestyle, a:Point, b: Point): Unit = {
println("Draw " + width + " " + color + " " + style + " " + " line from point: " + a +  " to point " + b)
}

当我尝试以这种方式创建仅采用 4 个参数的 drawSolidLine 函数时:

def drawSolidLine (c: Color, a:Point, b: Point):Unit =
drawLine(1.0, _:Color, new Linestyle("SOLID"), _:Point, _:Point)

并尝试调用它

drawSolidLine(2.5, new Color("Black"),new Point(2,4), new Point(3,1))

我没有编译器错误,但调用没有返回任何内容。

另一方面,当我以这种方式创建 drawSolidLine 时:

val drawSolidLine = drawLine(_:Double, _:Color, new Linestyle("SOLID"),
                            _:Point, _:Point)

并在之前调用它,我有所需的输出:

Draw 1.0 Black SOLID  line from point: (2,4) to point (3,1)

我错过了什么?

4

1 回答 1

3

你正在做两件非常不同的事情。第一的:

def drawSolidLine (c: Color, a:Point, b: Point):Unit =
  drawLine(1.0, _:Color, new Linestyle("SOLID"), _:Point, _:Point)

首先,请注意您传递的任何参数都没有被使用。表达式drawLine(1.0, _:Color, new Linestyle("SOLID"), _:Point, :Point)是一个函数,它不依赖于传递的参数,并且被返回,除了你的返回类型是Unit. 在这种情况下,该功能被丢弃。

第二:

val drawSolidLine = drawLine(_:Double, _:Color, new Linestyle("SOLID"),
                             _:Point, _:Point)

首先,您可以替换valdef,它的工作方式相同。Val vs def 不是问题

因此,drawSolidLine将,因为它的类型不是Unit,返回相同的函数。然而,这一次(2.5, new Color("Black"),new Point(2,4), new Point(3,1))没有被传递给drawSolidLine,因为它没有参数。因此它们将被传递给正在返回的函数,从而产生所需的效果。

于 2013-02-23T05:13:24.837 回答