def f(c: String) = {
val array = ("google.com|yahoo.com|gmail.com|mail.com").split("\\|")
for (i <- array) {
if (c.contains(i)) {
println("comparing " + c + " with " + i)
i
}
}
"N/A"
}
我对上述函数的意图是,如果N/A
不包含数组的任何元素,它将返回c
。并且,如果是,它将返回数组中的元素。因此,如果c="www.google.com/1234"
,理想情况下函数将返回google.com
,如果c="bloomberg.com/example"
,则函数将返回N/A
。
但当我println(f("www.google.com/1234"))
时,我得到N/A
。
谁能告诉我我做错了什么。
答案 0 :(得分:2)
您的函数始终返回N/A
,因为它是其定义中的最后一个值。最后留下一个值就像在Scala中一样,就像写return "N/A"
一样。但即使最后没有N/A
,你的功能也不会返回你想要的东西,因为:
for { ... }
,类型为Unit
println
,它与返回值不一样让我们先写一个试图找到匹配的函数:
def findMatch(c: String): Option[String] = {
val array = "google.com|yahoo.com|gmail.com|mail.com".split('|')
array.find(c.contains)
}
请注意,返回类型为Option[String]
,来自对find
method的调用。现在,您可以使用它来打印结果(如果它在那里)或N/A
否则:
def f(c: String): Unit = {
println(findMatch(c).getOrElse("N/A"))
}
答案 1 :(得分:0)
虽然laughedelics解决方案看起来很好,但另一个解决方案也是可行的:
def f (c: String) : List[String] = {
val array = ("google.com|yahoo.com|gmail.com|mail.com").split("\\|")
val list = (for (i <- array
if (c.contains(i))) yield {
println("comparing " + c + " with " + i)
i
}).toList
if (list.isEmpty) List ("N/A") else list
}
它在迭代时打印并返回一个匹配列表,或者返回一个字符串为“N / A”的List,实际上,在大多数情况下,这应该会产生恰好一个String的List,而不是更少或更多,但根据输入,可能有多个匹配。
scala> f ("www.google.com/1234")
comparing www.google.com/1234 with google.com
res61: List[String] = List(google.com)
scala> f ("www.göögle.com/1234")
res62: List[String] = List(N/A)
scala> f ("www.google.com/1234?param:subject='mail.com'")
comparing www.google.com/1234?param:subject='mail.com' with google.com
comparing www.google.com/1234?param:subject='mail.com' with mail.com
res63: List[String] = List(google.com, mail.com)
您的方法的主要区别在于使用yield,从for-construct返回一些东西。