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

あなたは2つの非常に異なることをしています。初め:

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。その場合、関数は破棄されます。

2番:

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

まず、に置き換えることができ、同じように機能しますvalVal vs def は問題ではありませんdef

そのため、drawSolidLine型が is notUnitであるため、同じ関数を返します。ただし、今回はパラメータをとらないため、 には(2.5, new Color("Black"),new Point(2,4), new Point(3,1))渡されません。drawSolidLineしたがって、それらは返される関数に渡され、目的の効果が生じます。

于 2013-02-23T05:13:24.837 に答える