我写了一个函数,从单词列表中随机选择一个单词。在这里我的代码。 但它不能选择一个单词而不能打印。请告诉我我的代码有什么问题。
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
}
}
答案 0 :(得分:11)
这里出现了很多问题,以至于很难知道从哪里开始。一次拍摄一个片段:
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)
,它来自哪里?它必须是一个选项或某种类型的集合,用于for-comprehension,其内容必须与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
Scala中很少需要 return
语句,其中评估的最终表达式将成为返回值。您不能简单地删除该关键字,因为它会与其他问题进行交互并停止您的代码编译。
通常,您希望编写代码,以便if/else
阻止,for-comprehension和其他此类构造不会执行副作用(例如调用println
)。相反,您应该尝试将这些块评估为String
,然后在方法结束时将此评估的字符串传递给println
。
您还需要更多地了解您拥有的变量,它们的来源以及它们的名称信息。
并注意您的语法/布局/格式。程序员在宗教方面的斗争越来越少......
答案 1 :(得分:5)
那么,为什么不简单地编写类似的东西来随机选择List [String]中的String?
def randomString(liste: List[String]) =
util.Random.shuffle(liste).head
然后您可以创建另一个功能来在屏幕上打印结果
答案 2 :(得分:1)
您的println不会尝试打印结果。尝试:
println("result: " + result)
(注意'+'是正确的字符串连接运算符,而不是'*')
每次在内循环中重新创建rand也是不必要和低效的。