【问题标题】:Kotlin Return ExpressionKotlin 返回表达式
【发布时间】:2020-11-05 11:05:51
【问题描述】:

我用谷歌搜索过这个并在这里搜索,但我碰壁了。

我有一个返回 Int 的函数。它告诉我我需要向整个函数添加另一个返回表达式,但我无法弄清楚它需要在哪里正确完成,我尝试了一些变体,包括添加我在 if 语句中使用的相同返回但之前在其余代码中引发错误的结束标记

我这样调用函数;

var ans = GetQuestion(1)


fun GetQuestion(cat:Int): Int {
val btn1 = findViewById(R.id.button1) as Button
val btn2 = findViewById(R.id.button2) as Button
            val btn3 = findViewById(R.id.button3) as Button
            val btn4 = findViewById(R.id.button4) as Button

            btn1.setVisibility(View.VISIBLE)
            btn2.setVisibility(View.VISIBLE)
            btn3.setVisibility(View.VISIBLE)
            btn4.setVisibility(View.VISIBLE)

            val initialimageview = findViewById(R.id.imageview_Qresponse) as ImageView
            initialimageview.setBackgroundResource(R.drawable.question_2);

            val viewQ = findViewById(R.id.textview_question) as TextView
            if (cat==1) { // Multiplication
                var a = rand(5,80)
                var b = rand(2,50)
                val ans = a * b
                var opType = " X "
                viewQ.text = ("" + a + " " + opType + " " + b + "?");
                val listOfAns = mutableListOf(ans,ans-a,ans-b,ans+a)
                listOfAns.shuffle()
                btn1.text=("" + listOfAns.elementAt(0))
                btn2.text=("" + listOfAns.elementAt(1))
                btn3.text=("" + listOfAns.elementAt(2))
                btn4.text=("" + listOfAns.elementAt(3))
                return ans
                listOfAns.clear()
            }
            if (cat==2) { // Addition
                var a = rand(5,250)
                var b = rand(2,140)
                val ans = a + b
                var opType = " + "
                viewQ.text = ("" + a + " " + opType + " " + b + "?");
                val listOfAns = mutableListOf(ans,ans+rand(2,4),ans+rand(5,10),ans-rand(2,10))
                listOfAns.shuffle()
                btn1.text=("" + listOfAns.elementAt(0))
                btn2.text=("" + listOfAns.elementAt(1))
                btn3.text=("" + listOfAns.elementAt(2))
                btn4.text=("" + listOfAns.elementAt(3))
                return ans
                listOfAns.clear()
            }
            if (cat==3) { // Subtraction
                var a = rand(80,150)
                var b = rand(2,79)
                var ans = a - b
                var opType = " - "
                viewQ.text = ("" + a + " " + opType + " " + b + "?");
                val listOfAns = mutableListOf(ans,ans+rand(2,5),ans+rand(6,10),ans-rand(2,10))
                listOfAns.shuffle()
                btn1.text=("" + listOfAns.elementAt(0))
                btn2.text=("" + listOfAns.elementAt(1))
                btn3.text=("" + listOfAns.elementAt(2))
                btn4.text=("" + listOfAns.elementAt(3))
                return ans
                listOfAns.clear()
            }
            if (cat==4) { // Division
                var safedivision = rand(3,16)
                var b = rand(2,20)
                var a = b * safedivision
                var ans = a / b
                var opType = " / "
                viewQ.text = ("" + a + " " + opType + " " + b + "?");
                val listOfAns = mutableListOf(ans,ans+rand(2,5),ans+rand(6,10),ans-rand(2,10))
                listOfAns.shuffle()
                btn1.text=("" + listOfAns.elementAt(0))
                btn2.text=("" + listOfAns.elementAt(1))
                btn3.text=("" + listOfAns.elementAt(2))
                btn4.text=("" + listOfAns.elementAt(3))
                return ans
                listOfAns.clear()
            }
  }

作为旁注,我不确定在编写 var ans = GetQuestion(1) 时是否必须使用 var of val 但是这两种方法都会引发相同的返回错误,因此我可以稍后根据需要进行修改

【问题讨论】:

  • 如果cat 既不是 1 也不是 2 也不是 3 也不是 4 怎么办?在这种情况下,该函数没有任何返回值。如果你知道这永远不会发生,你可以在最后加上一个断言,或者抛出一个异常。另请注意,return 之后块中的任何代码都不会运行,因此listOfAns.clear() 将永远不会被执行。
  • 我建议使用'when',然后你可以使用:return when() ...
  • 感谢两位的帮助

标签: android kotlin


【解决方案1】:

您可以将变量 ans 保留在函数顶部,如下所示 -

 var ans = 0

并将所有 if 条件中的 val ans 替换为 ans。在最后一个 } 之前 添加返回语句

return ans

【讨论】:

  • 谢谢,我一直在维护 var
  • 我提高了您的回复,因为它确实很有帮助,但我不得不接受之前的回复作为已接受的答案,因为最终这是我最终采取的路线,但非常感谢您的帮助跨度>
  • 没问题,非常感谢您的好意。
【解决方案2】:

如果你的函数体没有return关键字,那么if-else两边必须有return,例如:

fun dummyFunc(Int a):Int{
    if (a > 0){
        return 5
    }else{
        return -5
    }
}

在这种情况下,您无需在代码末尾添加另一个返回。但是在您的代码中,您没有 else 块,因此您要么像 Priyanka Rajput 的上述答案那样做,要么您将添加 else 语句。毕竟,您的代码在 if 块中重用了代码,您可以提取它们并在您编写的所有 ifs 之后添加:

fun GetQuestion(cat:Int): Int {
    val btn1 = findViewById(R.id.button1) as Button
    val btn2 = findViewById(R.id.button2) as Button
    val btn3 = findViewById(R.id.button3) as Button
    val btn4 = findViewById(R.id.button4) as Button

    btn1.setVisibility(View.VISIBLE)
    btn2.setVisibility(View.VISIBLE)
    btn3.setVisibility(View.VISIBLE)
    btn4.setVisibility(View.VISIBLE)

    val initialimageview = findViewById(R.id.imageview_Qresponse) as ImageView
    initialimageview.setBackgroundResource(R.drawable.question_2);

    val viewQ = findViewById(R.id.textview_question) as TextView
    
    var a = 0
    var b = 0
    var ans = 0
    var opType = ""
    var viewQText = ""
    var listOfAns = mutableListOf()

    if (cat==1) { // Multiplication
        var a = rand(5,80)
        var b = rand(2,50)
        val ans = a * b
        var opType = " X "
        viewQText = ("" + a + " " + opType + " " + b + "?");
        val listOfAns = mutableListOf(ans,ans-a,ans-b,ans+a)
    }
        if (cat==2) { // Addition
            a = rand(5,250)
            b = rand(2,140)
            ans = a + b
            opType = " + "
            viewQText = ("" + a + " " + opType + " " + b + "?");
            listOfAns = mutableListOf(ans,ans+rand(2,4),ans+rand(5,10),ans-rand(2,10))
         }
        if (cat==3) { // Subtraction
            a = rand(80,150)
            b = rand(2,79)
            ans = a - b
            opType = " - "
            viewQText = ("" + a + " " + opType + " " + b + "?");
            listOfAns = mutableListOf(ans,ans+rand(2,5),ans+rand(6,10),ans-rand(2,10))
            }
        if (cat==4) { // Division
            safedivision = rand(3,16)
            b = rand(2,20)
            a = b * safedivision
            ans = a / b
            opType = " / "
            viewQText = ("" + a + " " + opType + " " + b + "?");
            listOfAns = mutableListOf(ans,ans+rand(2,5),ans+rand(6,10),ans-rand(2,10))
        }



                viewQ.text = viewQText
                
                listOfAns.shuffle()
                btn1.text=("" + listOfAns.elementAt(0))
                btn2.text=("" + listOfAns.elementAt(1))
                btn3.text=("" + listOfAns.elementAt(2))
                btn4.text=("" + listOfAns.elementAt(3))
                return ans
                listOfAns.clear()
  }

在执行此操作时,我意识到您有很多样式和编码问题。首先,你不能过多地调用findViewById 方法,它很昂贵。您必须将您的Views 声明为全局变量并在您的onCreate 方法中初始化它们。其次,你不使用listOfAns,也许你有其他计划,你以后会使用,我不知道,但我知道的是,你的代码运行到return关键字的那一行,这意味着listofAns.clear() 不会被执行。如果你使用 when 而不是 if-else 会更好

【讨论】:

  • 感谢您的回复和额外的提示。我已经全局声明了这些视图,然后现在只在创建时初始化。我还按照建议重组了 if 语句,以便不需要重复的 item s 写一次。由于我还定期激活和停用按钮,因此我为此创建了一个函数以最大程度地减少代码重复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 2014-08-06
相关资源
最近更新 更多