Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何通过apply()将co variant varargs传递给接受相同类型的co variant varargs的函数_Scala - Fatal编程技术网

Scala 如何通过apply()将co variant varargs传递给接受相同类型的co variant varargs的函数

Scala 如何通过apply()将co variant varargs传递给接受相同类型的co variant varargs的函数,scala,Scala,请原谅任何错误的术语;我对Scala比较陌生。如有必要,我将尽力澄清:) 我想设置一个函数[tr],然后用T*varargs作为参数调用该函数。这在代码中可能更清楚: import java.io.Closeable object Loans { /** * works fine, yay! * Eg: using(new FileWriter(file)) { fw => ...use fw... } */ def using[T <

请原谅任何错误的术语;我对Scala比较陌生。如有必要,我将尽力澄清:)

我想设置一个函数[tr],然后用T*varargs作为参数调用该函数。这在代码中可能更清楚:

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...
        }
    }
}    
import java.io.Closeable
实物贷款{
/**
*很好,耶!
*例如:使用(新文件编写器(文件)){fw=>…使用fw…}
*/
使用[TR]的def:R={
试一试{
行动(c)
}最后{
如果(null!=c)c关闭
}
}
/**
*不会编译:
*类型失配;
*找到:closeables.type(具有基础类型T*)
*必需:T可能原因:缺少方法或构造函数的参数
* 
*预期用途为:
* 
*使用va(新的FileWriter(f),新的OtherCloseable()){…}
*/
def使用VA[TR]:单位={
试一试{
动作。应用(可关闭)
}最后{
//…关闭一切。。。
}
}
}    
不幸的是,usingva版本没有编译,对于如何最好地完成varargs贷款结构,我有些不知所措


非常感谢您的任何建议,泰。

您需要将varargs转换为类型系统的Seq(Scala内部所做的)


您需要将varargs转换为类型系统的Seq(Scala内部所做的)


您必须在参数后面放置一个
:*
,告诉编译器这不是一个参数,而是整个参数序列:

action(closeables :_*)

关于评论中的第二个问题进行编辑:对于您的具体问题,最好不要使用varargs,而是将结果
Seq
直接与部分函数结合使用:

def usingva[T <: Closeable, R](closeables: T*)(action: PartialFunction[Seq[T], R]): Unit = {
  try {            
    action(closeables) 
  } 
  finally {
    //...close everything... 
  } 
}

不幸的是,没有办法使这个类型安全(即在编译时检查参数的数量是否与函数匹配)除了使用函数为所有数量的参数创建
,因为scala中的类型级别不支持整数。与元组一样的问题…这就是为什么实际上存在类
Tuple1
Tuple2
,…,
Tuple22
(是的…它们在22处停止)

您必须在参数后面放置一个
:*
,告诉编译器这不是一个参数,而是整个参数序列:

action(closeables :_*)

关于评论中的第二个问题进行编辑:对于您的具体问题,最好不要使用varargs,而是将结果
Seq
直接与部分函数结合使用:

def usingva[T <: Closeable, R](closeables: T*)(action: PartialFunction[Seq[T], R]): Unit = {
  try {            
    action(closeables) 
  } 
  finally {
    //...close everything... 
  } 
}

不幸的是,没有办法使这个类型安全(即在编译时检查参数的数量是否与函数匹配)除了使用
函数为所有数量的参数创建,因为scala在类型级别上没有整数支持。与元组一样的问题…这就是为什么实际上存在类Tuple1,
Tuple2
,…,
Tuple22
(是的…它们在22处停止)

确定;操作(可关闭项:)和操作.apply(closeables:u)都可以编译。这可能是一个愚蠢的问题,但有没有办法将单个项放入变量中?也就是说,这是可行的:
usingva(newfilewriter(file),newfilewriter(file)){fw=>…}
但是我更愿意按照
usingva(newfilewriter(file),newfilewriter(file))的思路做一些事情{fw1,fw2=>…}
。也就是说,在更新时,在自己的变量中获得每个closeable,而不是使用FileWriter*?ty获得一个closeable;实际使用函数创建2或3个
可能很好,但知道如何编写通用变量(使用1/2/3/…函数可能会委托给它)是最有用的。好的;action(closeables:_)和action.apply(closeables:_)都可以编译。这可能是一个愚蠢的问题,但是有没有办法将单个项放入变量中呢?也就是说,这是有效的:
usingva(newfilewriter(file),newfilewriter(file)){fw=>…}
但我更希望能够使用va(newfilewriter(file),newfilewriter(file)){fw1,fw2=>…}做一些类似于
的事情
。也就是说,在更新时,用FileWriter*?ty获取每个变量的可关闭性,而不是获取一个;实际使用
函数创建2个或3个
,这可能很好,但知道如何编写通用变量(使用1/2/3/…函数可能会委托给它)是最有帮助的。Ty;这也很有效。它与在using块中获取单个变量而不是单个变量有共同的问题(
usingva(new FileWriter(file),new FileWriter(file)){fw=>…}
),其中fw现在是一个Seq[T],理想情况下,我希望获得更接近
usingva(new FileWriter(file),new FileWriter(file)){fw1,fw2=>…}
Ty;这同样有效。它与在using块中获取单个变量而不是单个变量有共同的问题(
usingva(new FileWriter(file),new FileWriter(file)){fw=>…}
),其中fw现在是一个Seq[T],理想情况下,我希望更接近于使用va(new FileWriter(file),new FileWriter)(文件){fw1,fw2=>…}