相关疑难解决方法(0)

什么`:_*`(冒号下划线星)在Scala中做什么?

我从这个问题得到以下代码:

def addChild(n: Node, newChild: Node) = n match {
  case Elem(prefix, label, attribs, scope, child @ _*) => Elem(prefix, label, attribs, scope, child ++ newChild : _*)
  case _ => error("Can only add children to elements!")
}
Run Code Online (Sandbox Code Playgroud)

除此之外,其中的所有内容都非常清晰: child ++ newChild : _*

它有什么作用?

我明白有Seq[Node]与另一个连接Node,然后呢?怎么: _*办?

scala pattern-matching

186
推荐指数
4
解决办法
4万
查看次数

Scala:将Seq传递给var-args函数

给定一个带有可变数量参数的函数,例如

def foo(os: String*) =
  println(os.toList)
Run Code Online (Sandbox Code Playgroud)

如何将一系列参数传递给函数?我想写:

val args = Seq("hi", "there")
foo(args)
Run Code Online (Sandbox Code Playgroud)

显然,这不起作用.

scala

62
推荐指数
1
解决办法
2万
查看次数

将List的元素作为参数传递给具有可变参数的函数

我有一个函数叫做or例如,定义为;

or(filters: FilterDefinition*)
Run Code Online (Sandbox Code Playgroud)

然后我有一个清单:

List(X, Y, Z)
Run Code Online (Sandbox Code Playgroud)

我现在需要做的是调用or

or(func(X), func(Y), func(Z))
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,列表的长度可能会发生变化.

在Scala中执行此操作的最佳方法是什么?

scala function

21
推荐指数
1
解决办法
2万
查看次数

如何将List(String,String)转换为ListMap [String,String]?

我有一个类型列表,List(String,String)我想将其转换为地图.当我使用toMap方法时,我发现它没有保留List中的数据顺序.但是我的目标是通过保持数据的顺序与List相同,将列表转换为Map.我学会了ListMap保留插入顺序(但它是不可变的)所以我可以使用带有map函数的LinkedHashMap顺序插入数据,LinkedHashMap但这意味着我需要遍历所有痛苦的元素.任何人都可以建议我一个更好的方法吗?谢谢

scala scala-collections

9
推荐指数
1
解决办法
1911
查看次数

如何使用Scala 2.8将String*scala vararg传递给java方法

我想从scala调用以下java方法:

protected final FilterKeyBindingBuilder filter(String urlPattern, String... morePatterns) {
    return filtersModuleBuilder.filter(Lists.newArrayList(urlPattern, morePatterns));
}
Run Code Online (Sandbox Code Playgroud)

我的scala来电看起来像这样

def test(url: String, urls: String*) {
  filter(url, urls: _*).through(classOf[MyTestWhateverFilter]) 
}
Run Code Online (Sandbox Code Playgroud)

但是,编译时执行代码会产生异常:

java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Ljava.lang.String;
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

def test(url: String, urls: String*) {
  filter(url, urls.map(_.asInstanceOf[java.lang.String]) :_*).through(classOf[MyTestWhateverFilter]) 
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,例外是:

java.lang.ClassCastException: scala.collection.mutable.ArrayBuffer cannot be cast to [Ljava.lang.String;
Run Code Online (Sandbox Code Playgroud)

我认为在2.8中,Array [String]作为String []数组传递给java,并且不需要额外的拆箱.

有任何想法吗?

提前致谢!

编辑:

如何复制它:

import com.google.inject.servlet.ServletModule

trait ScalaServletModule extends ServletModule{
  def test(s: String,strs: String*) = {
    println(strs.getClass)
    println(super.filter(s,strs:_*))
  }
}
object Test {
  def main(args: Array[String]) …
Run Code Online (Sandbox Code Playgroud)

scala

5
推荐指数
1
解决办法
6732
查看次数