作为Scala(2.9.1)的新手,我有一个List[Event]并希望将其复制到一个Queue[Event],但是下面的语法产生了一个Queue[List[Event]]代替:
val eventQueue = Queue(events)
Run Code Online (Sandbox Code Playgroud)
出于某种原因,以下工作:
val eventQueue = Queue(events : _*)
Run Code Online (Sandbox Code Playgroud)
但我想了解它的作用,以及它的工作原理?我已经看过Queue.apply函数的签名了:
def apply[A](elems: A*)
Run Code Online (Sandbox Code Playgroud)
我理解为什么第一次尝试不起作用,但第二次尝试的含义是什么?什么是:,_*在这种情况下,为什么apply功能只是采取Iterable[A]?
这应该很简单.如何将函数应用于Scala中的元组?即:
scala> def f (i : Int, j : Int) = i + j
f: (Int,Int)Int
scala> val p = (3,4)
p: (Int, Int) = (3,4)
scala> f p
:6: error: missing arguments for method f in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
f p
^
scala> f _ p
:6: error: value p is not a member of (Int, Int) => Int
f _ p
^
scala … 在Python中,我们有星号(或"*"或"unpack")运算符,它允许我们解压缩列表以方便用于传递位置参数.例如:
range(3, 6)
args = [3, 6]
# invokes range(3, 6)
range(*args)
Run Code Online (Sandbox Code Playgroud)
在这个特定的例子中,它不会节省太多的输入,因为range只需要两个参数.但你可以想象,如果有更多的参数range,或者args是从输入源读取,从另一个函数返回等等,那么这可能会派上用场.
在Scala中,我找不到相应的东西.请考虑在Scala交互式会话中运行以下命令:
case class ThreeValues(one: String, two: String, three: String)
//works fine
val x = ThreeValues("1","2","3")
val argList = List("one","two","three")
//also works
val y = ThreeValues(argList(0), argList(1), argList(2))
//doesn't work, obviously
val z = ThreeValues(*argList)
Run Code Online (Sandbox Code Playgroud)
除了使用的方法之外,还有更简洁的方法val y吗?
我想知道最好的方法是什么.
val foo = Some("a")
val bar = Some(2)
def baz(a: String, b: Int) = if((b % 2) == 0) Some(a+","+b) else None
(x zip y) flatMap baz //does not compile of course
(x zip y) flatMap { x => baz(x._1, x._2) } //ugly
Run Code Online (Sandbox Code Playgroud)
我认为Odersky等人.在这个例子中,他们还有另一个技巧来降低噪音.
所以问题是如何在这里打击杂乱,假设你不允许改变baz(例如def baz(a: (String Int)))的实现.
我有一个带有两个参数的Scala类,另一个参数构造函数.对于一个参数构造函数,我调用一个方法来获取两个元素的元组,并尝试使用元组作为需要两个参数的构造函数的参数.这是一个例子:
def vals(v:Int) = {
// computation
(v,v) // returns two element tuple
}
class A(a:Int, b:Int) {
def this(v:Int) = {
this(vals(v))
}
}
object Main extends App {
val a = new A(10)
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到类型不匹配错误.我在scala tuple解压缩中找到了一个解决方案,该解决方案适用于函数调用,但不适用于构造函数.
def foo(x: Int, y: Int) = x * y
def getParams = {
(1,2) //where a & b are Int
}
object Main extends App {
println((foo _).tupled(getParams))
println(Function.tupled(foo _)(getParams))
}
Run Code Online (Sandbox Code Playgroud)
怎么能解决这个问题?