相关疑难解决方法(0)

什么是param:_*在Scala中意味着什么?

作为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]

syntax scala scala-collections

72
推荐指数
3
解决办法
2万
查看次数

如何将函数应用于元组?

这应该很简单.如何将函数应用于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 …

scala

44
推荐指数
3
解决办法
2万
查看次数

是否有一个Scala等效的Python列表解包(又名"*")运算符?

在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吗?

python scala argument-passing

22
推荐指数
3
解决办法
9500
查看次数

使用元组作为参数列表调用方法

我想知道最好的方法是什么.

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)))的实现.

syntax scala tuples

10
推荐指数
1
解决办法
3194
查看次数

Scala元组为构造函数解包

我有一个带有两个参数的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)

怎么能解决这个问题?

parameters constructor scala

3
推荐指数
1
解决办法
1339
查看次数