Как вернуть строку для понимания в Scala? - PullRequest
0 голосов
/ 04 июня 2010

Предупреждение Scala для новичков:

В основном я пытаюсь сделать что-то вроде этого: где я сопоставляю шаблон и возвращаю строку.

scala> def processList(list: List[String], m: String): String={list foreach (x=> m match{
 | case "test" => "we got test"                                                      
 | case "test1"=> "we got test1"})}                                                  

: 10: ошибка: несоответствие типов; найдено: блок требуется: строка def processList (список: List [String], m: String): String = {список foreach (x => m match {

)

Я знаю, что могу установить var и вернуть его после for comp ... но это не похоже на способ Scala.

Ответы [ 4 ]

9 голосов
/ 04 июня 2010

Мне не совсем ясно, что именно вы пытаетесь сделать. Вы просто хотите проверить, присутствует ли определенный элемент в списке? Или вы хотите вернуть список строк с некоторым преобразованием? Последнее, например, можно записать так:


scala> def processList(l: List[String]): List[String] = l map {s => s match {
       case "test" => "we got test"
       case "test1" => "we got test1"
       case _ => "we got something else"
     }
 }
scala> processList(List("test", "test1", "test2", "test3"))
res: List[String] = List(we got test, we got test1, we got something else, we got something else)

А для первого вы могли бы написать что-то вроде:


scala> def exists(l: List[String], m: String): String = {
    if (l exists (s => s == m))
    m + " exists"
    else 
    m + " does not exist"
}
exists: (l: List[String],m: String)String

scala> val l = List("test1", "test2", "test3")
l: List[java.lang.String] = List(test1, test2, test3)

scala> exists(l, "test1")
res0: String = test1 exists

scala> exists(l, "test2")
res1: String = test2 exists

scala> exists(l, "test8")
res2: String = test8 does not exist

В любом случае: метод foreach в List перебирает каждый элемент списка, применяя данную функцию к каждому элементу. Он в основном используется для побочных эффектов, таких как печать чего-либо на консоль или запись в файл. Функция, переданная методу foreach, должна возвращать тип Unit, который похож на void в Java. Поэтому вы не можете вернуть ни одной строки из него.

3 голосов
/ 04 июня 2010

Вам нужно использовать map, а не foreach.И тогда вы можете либо вернуть список строк (так же, как вы написали, за исключением того, что возвращаемый тип равен List[String]), или вы можете соединить их вместе, используя .mkString(" ") (который будет ставить пробелы между ними).

1 голос
/ 05 июня 2010
def processList(list: List[String], m: String): String= {
  list foreach (x=> m match {
    case "test" => return "we got test"                                                      
    case "test1"=> return "we got test1"
  })
  error("oops")
}
0 голосов
/ 05 июня 2010

Чтобы вернуть один результат на лету - возможно, путем объединения отдельных результатов, вы можете использовать (INIT /: COLLECTION) (_ OPERATION _), например:

val li = List ("test", "test", "test1", "test")

("" /: li) ((x, y) => x + { y match {
     case "test"  => "we got test\n"       
     case "test1" => "we got test 1\n" } } )

res74: java.lang.String = мы получили тест мы получили тест мы получили тест 1 мы получили тест

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...