随机化列表

don*_*dog -2 scala

我写了一个函数,从一个单词列表中随机选择一个单词.在这里我的代码.但它不能选择一个单词而不能打印.请告诉我我的代码有什么问题.

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)

您正在接受ab作为参数,然后立即隐藏名称以创建变量.那些参数毫无用处.

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方法的末尾.

您还需要更加了解您拥有的变量,它们的来源以及它们的名称信息.

并注意您的语法/布局/格式.程序员在宗教方面的斗争越来越少......

  • 谢谢你写这个答案.我担心不得不这样做. (2认同)

jac*_*aco 5

好吧,为什么不简单地编写类似的东西来随机选择List [String]中的String?

def randomString(liste: List[String]) =
  util.Random.shuffle(liste).head
Run Code Online (Sandbox Code Playgroud)

然后,您可以创建另一个功能以在屏幕上打印结果