我写了一个函数,从一个单词列表中随机选择一个单词.在这里我的代码.但它不能选择一个单词而不能打印.请告诉我我的代码有什么问题.
def long(a: Int, b: Int): String = {
var a = 5
var b = 100
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
}
}
Run Code Online (Sandbox Code Playgroud)
Kev*_*ght 11
这里出现了很多问题,以至于很难知道从哪里开始.一次取一个片段:
def long
Run Code Online (Sandbox Code Playgroud)
真的,一个方法令人难以置信的坏名字!
def long(a: Int, b: Int): String = {
var a = 5
var b = 100
Run Code Online (Sandbox Code Playgroud)
您正在接受a并b作为参数,然后立即隐藏名称以创建变量.那些参数毫无用处.
for (i <- args(1)){
if (i > a && i < b){
...
}
else{
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
这不遵循任何已识别的范围嵌套模式,在块的开始括号之前留出空格也是一种好习惯.更糟糕的是,该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
}
Run Code Online (Sandbox Code Playgroud)
继续前进......
for (i <- args(1))
Run Code Online (Sandbox Code Playgroud)
args(1)它是什么,它来自哪里?它必须是一个选项或某种用于理解的集合,其内容必须与比较相同a且有效.所以我假设返回一个,一个集合似乎不太可能.bi > a && i < bargs(1)Option[Int]
val random_index = rand.nextInt(new_sun .length)
val result = new_sun(random_index)
Run Code Online (Sandbox Code Playgroud)
同样的问题.是什么new_sun和它从何而来.这个名字什么也没告诉我.空间new_sun .length也很奇怪.
for (i <- args(1)) {
if (i > a && i < b) {
Run Code Online (Sandbox Code Playgroud)
写得更好:
for (i <- args(1) if i > a && i < b) {
Run Code Online (Sandbox Code Playgroud)
甚至
args(1) filter (a to b contains _) map { i =>
Run Code Online (Sandbox Code Playgroud)
但遗憾的是,你不能这样做,因为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")
Run Code Online (Sandbox Code Playgroud)
这是检查5 < i < 100,或6 <= i <= 99换句话说.该检查与错误消息不匹配.
var guess = println("_ " * result.length)
Run Code Online (Sandbox Code Playgroud)
println回报Unit.绝对没有理由将此返回值分配给从未使用过的变量.
return i.toString
Run Code Online (Sandbox Code Playgroud)
returnScala中很少需要语句,其中评估的最终表达式将成为返回值.您不能简单地删除该关键字,因为它会与其他问题进行交互并停止您的代码编译.
通常,您希望编写代码,以便if/else块,for-comprehension和其他此类构造不会执行副作用(例如调用println).相反,您应该尝试将这些块计算为a String,然后将此评估的String传递给println方法的末尾.
您还需要更加了解您拥有的变量,它们的来源以及它们的名称信息.
并注意您的语法/布局/格式.程序员在宗教方面的斗争越来越少......
好吧,为什么不简单地编写类似的东西来随机选择List [String]中的String?
def randomString(liste: List[String]) =
util.Random.shuffle(liste).head
Run Code Online (Sandbox Code Playgroud)
然后,您可以创建另一个功能以在屏幕上打印结果