#scala
#scala
Вопрос:
Я не могу изменить значение val в цикле в scala, я пытаюсь написать небольшую функцию, подобную этой
def replicate(s:Any,n:Int):List[Any] = {
val i = 0
var list = s::Nil
for i<-1 to n {
list::=s
}
return list
}
Но использование этой функции возвращает только один элемент в списке (например, когда n = 3)
Как это исправить?
Комментарии:
1. Если это упражнение по изучению функционального программирования, изучите рекурсию.
2. Я удивлен, что вы вообще получаете какие-либо выходные данные, поскольку опубликованный вами код фактически не компилируется. Стоит отметить, что хорошая практика Scala почти никогда не используется
return
(это редко требуется), использованиеvar
s также избегается, и всякий раз, когда вы видите typeAny
, это довольно хороший признак того, что дела идут плохо.3. этот код даже не компилируется…
4.
val
являютсяimmutable
ссылками. Это означает, что вы не можете переназначить aval
.
Ответ №1:
Существует более простой способ выполнить вашу задачу
def replicate(s:Any,n:Int):List[Any] = (1 to n) map (_=> s) toList
Пример:
replicate("omg", 4)
List[Any] = List(omg, omg, omg, omg)
Комментарии:
1. Еще проще:
List.fill(n)(s)
( Стандартная библиотека полна скрытых сокровищ.)
Ответ №2:
def replicate(s:Any,n:Int):List[Any] = {
val i = 0
var list = s::Nil
for (i<-1 to n) {
list::=s
}
return list
}
и я получаю
scala> replicate("lol", 5)
res0: List[Any] = List(lol, lol, lol, lol, lol, lol)