【问题标题】:Scala if-else condition not working on REPLScala if-else 条件不适用于 REPL
【发布时间】:2018-03-11 23:00:38
【问题描述】:

我在 Scala Interpreter - REPL 上执行此操作,我试图将 Tuple(account_df_index, disposition_df_index) 的值设置为 (0,1),但在执行时在 else 的第一行抛出错误堵塞。如果我的理解是正确的,应该分配 (0,1) 并且不能执行 else 块。我哪里错了?

val extra_params = None
val extra_params_map = if (extra_params.equals(None)) {None} else{
    extra_params.toMap}

val (account_df_index, disposition_df_index) = if(extra_params.equals(None)) 
                        {
                        (0,1)
                        } else {
                        if(extra_params_map.contains("dataframe_index_map"){
                        val dataframe_map = 

                        extra_params_map.get("dataframe_index_map")
                        .get.parseJson
                        .convertTo[Map[String, Int]]
                        val account_df_index = dataframe_map.getOrElse("account", 0)
                        val disposition_df_index = dataframe_map.getOrElse("disposition", 1)
                        (account_df_index, disposition_df_index)
                        } else{
                              (0,1)
                              }
                        }   

【问题讨论】:

  • 我尝试过使用无,带有 .equals 的单元检查都抛出相同的问题:错误:值包含不是 Equals 的成员 if (extra_params_map.contains("dataframe_index_map"))
  • 我刚刚尝试缩进它,但它似乎完全损坏无法修复。请确保您阅读了有关Option(特别是None)和Map 的文档,明确声明每个变量的类型,直到您至少对您正在做的事情有一个粗略的计划,并且左侧元组的元数与元组的元数匹配:4>2。并阅读Style guide
  • 一堆未排序的提示: - 不要与equals 比较,== 通常就足够了; - 不要将任何东西与None 进行比较,在选项上使用模式匹配或mapfold
  • 对不起,不匹配,我已经编辑了。我会看看地图,折叠和选项。谢谢。

标签: scala read-eval-print-loop


【解决方案1】:

这段代码有很多问题。我将专注于两件事。

通过模式匹配初始化变量

val (a, b, c, d) = if (someCondition) doThis()
                   else               doThat()

在此示例中,创建并初始化了 4 个不同的变量 abcd。编译器识别出它们分组在一个 4 元组中,如果等于 = 的右侧返回一个 4 元组,则使模式匹配。所以这只适用于 both doThis()doThat() 返回相同的东西,即具有相同类型模式的 4 元组。

None 不是选项的一部分

如果变量可能是None,那么该变量的类型是Option[X],其中X 是变量的类型,如果它不是None

val extra_params_map: Option[Map[Int,Int]] = if (extra_params.isEmpty) None 
                                             else Some(extra_params.toMap)

注意Some()None 的补充,结果类型是Option。在这种情况下,它是 Option[Map[Int,Int]],假设 extra_params.toMap 返回一个 Map[Int,Int]

【讨论】:

  • 感谢您的帮助!所以我猜你可能知道这是否意味着解释器在执行之前编译了这行代码?
  • Scala 是一种编译语言。它在执行之前编译,即使在 REPL 中也是如此。
猜你喜欢
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 2021-12-08
  • 2020-05-22
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 2012-10-24
相关资源
最近更新 更多