请对照任何错误的术语;我对斯卡拉来说比较新。我会尽力澄清:)如何通过apply()将同变量可变参数传递给具有相同类型的同变量可变参数的函数
我想设置一个函数[T <:Closeable,R],使用参数T *,函数(T *)=> R,然后调用T *可变参数,因为它是参数。这可能是更清晰的代码:
import java.io.Closeable
object Loans {
/**
* works fine, yay!
* Eg: using(new FileWriter(file)) { fw => ...use fw... }
*/
def using[T <: Closeable, R](c: T)(action: T => R): R = {
try {
action(c)
} finally {
if (null != c) c.close
}
}
/**
* Won't compile:
* type mismatch;
* found: closeables.type (with underlying type T*)
* required: T possible cause: missing arguments for method or constructor
*
* Intended usage is:
*
* usingva(new FileWriter(f), new OtherCloseable()) { ... }
*/
def usingva[T <: Closeable, R](closeables: T*)(action: (T*) => R): Unit = {
try {
action.apply(closeables)
} finally {
//...close everything...
}
}
}
不幸的是,usingva版本不编译,我在稍微亏损为如何最好地实现可变参数贷款结构。
任何和所有的建议非常感谢,ty。
OK; action(可关闭:_ *)和action.apply(可关闭:_ *)都可以编译。这可能是一个愚蠢的问题,但有没有办法将单个项目变为变量?也就是说,这是有效的:'usingva(new FileWriter(file),new FileWriter(file)){fw => ...}'但我更喜欢能够沿'usingva(new FileWriter (文件),新的FileWriter(文件)){fw1,fw2 => ...}。也就是说,为了让每个变量都可以在自己的变量中关闭,而不是使用FileWriter *获得一个变量? – S42 2011-03-08 19:46:08
@ S42:请参阅我的编辑 – 2011-03-08 20:29:29
ty更新;实际上创建2或3个“使用”函数可能会很好,但是知道如何编写通用函数(使用1/2/3/...函数可能委托给它)最有帮助。 – S42 2011-03-08 21:22:28