Здесь многое пошло не так, так трудно понять, с чего начать. Взятие одного фрагмента за раз:
def long
Действительно, невероятно плохо название метода!
def long(a: Int, b: Int): String = {
var a = 5
var b = 100
Вы берете a
и b
в качестве параметров, а затем немедленно скрываете имена для создания переменных. Эти параметры бесполезны.
for (i <- args(1)){
if (i > a && i < b){
...
}
else{
...
}
...
}
Это не следует никакой распознанной схеме для вложения области, также рекомендуется оставлять пробел перед открывающей скобкой блока. Хуже того, закрывающая скобка для блока for
выровнена, чтобы выглядеть как закрывающая скобка для предложения else
. Это гарантированный способ создания не поддерживаемого кода. Я сторонник так называемого «единого стиля в скобках», в котором ваш код отформатирован так:
for (i <- args(1)) {
if (i > a && i < b) {
val rand = new Random(System.currentTimeMillis())
val random_index = rand.nextInt(new_sun .length)
val result = new_sun(random_index)
var guess = println("_ " * result.length)
} else {
println("You have to input the word with length of 5 < 100")
}
return i.toString
}
Двигаемся дальше ...
for (i <- args(1))
Что такое args(1)
, откуда оно? Это должна быть опция или какая-то коллекция для использования в целях понимания, и ее содержимое должно быть того же типа, что и a
и b
, чтобы сравнение i > a && i < b
было действительным. Поэтому я предполагаю, что args(1)
возвращает Option[Int]
, коллекция кажется маловероятной.
val random_index = rand.nextInt(new_sun .length)
val result = new_sun(random_index)
Тот же вопрос. Что такое new_sun
и откуда оно. Имя мне ничего не говорит. Пространство в new_sun .length
также выглядит очень странно.
for (i <- args(1)) {
if (i > a && i < b) {
лучше написано:
for (i <- args(1) if i > a && i < b) {
или даже
args(1) filter (a to b contains _) map { i =>
Но, к сожалению, вы не можете этого сделать, так как значение i
используется в качестве возвращаемого значения, несмотря на условие защиты.
Что также напоминает мне:
var a = 5
var b = 100
...
if (i > a && i < b) ...
else println("You have to input the word with length of 5 < 100")
Это проверка того, что 5 < i < 100
или 6 <= i <= 99
другими словами. Проверка не соответствует сообщению об ошибке.
var guess = println("_ " * result.length)
println
возвращает Unit
. Нет абсолютно никакой возможной причины присваивать это возвращаемое значение переменной, которая никогда не используется.
return i.toString
return
операторы редко нужны в Scala, где окончательное вычисленное выражение станет возвращаемым значением. Вы не можете просто удалить ключевое слово, так как оно взаимодействует с другими проблемами и остановит компиляцию кода.
Как правило, вы хотите написать свой код так, чтобы блоки if/else
, для-понимания и другие подобные конструкции не вызывали побочных эффектов (таких как вызов println
). Вместо этого вы должны попытаться сделать эти блоки равными String
, а затем передать эту оцененную строку в println
в конце вашего метода.
Вам также нужно гораздо лучше понимать, какие у вас переменные, откуда они берутся и насколько информативны их имена.
и обратите внимание на ваш синтаксис / макет / форматирование. Программисты боролись за религиозные пути меньше ...