scala:列表作为函数的输入和输出

时间:2018-01-12 19:15:14

标签: scala

我是scala的新手。我有一个非常简单的问题。

给出python中的列表

x=[1, 100, "a1", "b1"]

我可以编写一个返回最后两个元素的函数

def f(w):
    if w[0]>=1 and w[1]<=100:
    return ([w[2],w[3]]) 

如何在scala

中执行等效操作
val v= List(1, 100, "a1", "b1")

def g(L:List[Any]): List[String] = {

if( L(0)>=1 &  L(1)<=100 ) {return List(L(2), L(3))}
}

  val w=g(v)

这让我错误

  List[Any] = List(1, 100, a, b)
  Incomplete expression

3 个答案:

答案 0 :(得分:3)

您无法从List[String]获得List[Any]。 (嗯,你可以,但它确实是真的坏事。)

不要,不要创建List[Any]。与Python不同,Scala是一种严格类型的语言,这意味着编译器会密切关注每个变量和每个集合的类型。当编译器失去对List类型的跟踪时,它变为List[Any],并且您已经失去了编译器提供的所有帮助,以帮助编写不会崩溃的程序。

要混合集合中的类型,您可以使用元组。这是编写g()方法的类型安全的Scala方法。

def g(tup: (Int,Int,String,String)): List[String] =
  if (tup._1 >= 1 & tup._2 <= 100) List(tup._3, tup._4)
  else List()

用法:

val v = (1, 100, "a1", "b1")
val w = g(v)  //w: List[String] = List(a1, b1)

答案 1 :(得分:0)

好像你有错字:

if(L(0)>=1 &  L(1<=100)) {return List(L(2), L(3))}

不是这样的吗?

if(L(0)>=1 &  L(1)<=100) {return List(L(2), L(3))}

错误似乎指出那里的额外支架有问题。

答案 2 :(得分:0)

scala> List(1,2,3,4,5).takeRight(2)
res44: List[Int] = List(4, 5)

您可以在Scala中使用内置函数来执行此操作!