【问题标题】:Scala returning object type in if/else statementsScala 在 if/else 语句中返回对象类型
【发布时间】:2016-12-06 21:13:59
【问题描述】:

目前我有一个名为示例的抽象类,三个扩展抽象类的案例类,以及一个返回类型为示例的函数。在函数中,当满足某个条件时,它应该返回一个示例类型,但由于某种原因它说:类型不匹配,找到:单位,需要:示例

我不明白为什么,因为我在每个 if 语句的末尾返回示例类型...

abstract class example
case class type1() extends example
case class type2() extends example
case class type3() extends example

def func(): example = {

if (condition)
return (val x= type1())

else if (condition)
return (val x= type2())

else if (condition)
return (val x= type3())
}

在主函数中,我正在调用 func()

【问题讨论】:

  • 注意:return 在 Scala 中不是这样使用的,通常是not used at all。 Scala 中的 return 与 Java 中的不同!

标签: java scala


【解决方案1】:

返回后括号的类型不是示例。

return (val x= type1())

甚至没有意义:你是说 x 取一个特定的值……然后返回这个事实。因此,如果您删除“val x =”(无论如何都是无用的),您将获得:

return type1()

意思是“通过创建type1类型的新对象返回我刚刚指定的值”。

另外,您应该尊重 Scala 命名约定。特别是,类名必须是驼峰式:

abstract class Example
case class Type1() extends Example
case class Type2() extends Example
case class Type3() extends Example

另外,您多次评估相同的条件,并且没有充分的理由这样做。因此,您应该简化函数的定义方式。此外,您不应使用显式返回。比如:

def func(): example = if (condition) Type1()
                      else Type2()

另外,请注意,在您的原始代码中,type2 和 type3 对象永远不会被实例化,因为 condition 要么总是真,要么总是假。

最后,你的函数有一个副作用,因为它的行为依赖于 condition,而这不是它的参数之一。你不应该那样做。

作为结论,您的源代码应该如下所示:

abstract class Example

case class Type1() extends Example
case class Type2() extends Example
case class Type3() extends Example

def func(condition: Boolean): Example = if(condition) Type1()
                                        else Type2()

【讨论】:

  • 我更新了我的答案,试图按照要求进行详细说明。
  • 如果案例类根本没有值,那么它们应该是案例对象。
【解决方案2】:

你忘了在最后一个“else if”之后实现 else 块。

Scala 方法返回其主体中最后一个表达式的值,并且没有 else 块的条件分支具有 Unit 类型。因此出现错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 2020-01-20
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2016-09-03
    • 2013-09-09
    相关资源
    最近更新 更多