我正在努力让函数curry正常工作。我所拥有的是以下内容:
def method(x: ByteArrayInputStream)
(y: ByteArrayOutputStream)
(z: GZIPOutputStream)
(func: (ByteArrayInputStream, GZIPOutputStream) => Unit) = {
.....
.....
}
现在,当我打电话给它时,我称之为:
method(new ByteArrayInputStream("".getBytes("UTF-8")))
(new ByteArrayOutputStream())
(new GZIPOutputStream(_))
(myFunc(_, _))
我的理解是在第三个参数,即GZIPOutputStream中,当我说_时,它将从第二个参数中选择值。但它抱怨说
Type mismatch, expected: GZIPOutputstream, actual: (OutputStream) => GZIPOutputStream
任何提示?
答案 0 :(得分:0)
我不确定如何做到这一点......但是这里有一个模仿你正在寻找的解决方案
def add(j: Int)(i: Option[Int] = None): Int = j + i.getOrElse(j)
add(5)()
add(5)()返回10并使用j值
答案 1 :(得分:0)
问题出在
(new GZIPOutputStream(_))
正如您的错误所述,您的方法需要一个GZIPOutputstream
,但您正在向其传递一个函数OutputStream
到GZIPOutputStream
下划线一开始有点混乱,但这是告诉scala你故意不将参数传递给GZIPOutputStream
以便它不会抱怨缺少参数的方法。换句话说,您传递函数本身而不是函数的结果。
如何解决这个问题取决于你实际上要做什么。如果您确实要传递GZIPOutputStream
,则需要将_
替换为OutputStream
。
如果您的意图是method
创建一个GZIPOutputStream
给定一个像您要传递的工厂函数,您需要更改z
的声明类型。例如,
(z: (OutputStream) => GZIPOutputStream)
然后在方法正文中,您可以说z(y)
之类的内容来获得GZIPOutputStream
。 (或者将y
替换为其他输出流。)
答案 2 :(得分:0)
我已经设法去了一点,这就是我去过的地方:
val bytePayload = method(new ByteArrayInputStream(s.getBytes("UTF-8")))(new ByteArrayOutputStream())(writeBytes(_,_))
def method(bin: ByteArrayInputStream)
(bos: ByteArrayOutputStream)
(func: (ByteArrayInputStream, GZIPOutputStream) => Unit): Either[String, Array[Byte]] = {
val gzip = new GZIPOutputStream(bos)
try {
func(bin, gzip)
gzip.finish
} catch {
case e: Exception => Left(e.getMessage)
} finally {
bin.close()
bos.close()
gzip.close()
}
Right(bos.toByteArray)
}
虽然我仍然处理例外,但我在某种程度上确信我不会抛弃它们。