我是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
答案 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中使用内置函数来执行此操作!