我在Scala Interpreter上执行此操作 - REPL,我试图将元组的值(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)
}
}
答案 0 :(得分:4)
此代码存在许多问题。我会专注于两件事。
通过模式匹配进行变量初始化
this
在此示例中,创建并初始化了4个不同的变量val (a, b, c, d) = if (someCondition) doThis()
else doThat()
,a
,b
和c
。如果等于d
的右侧返回4元组,编译器会识别出它们分组为4元组并使模式匹配。所以这只有在 =
和doThis()
返回相同的内容时才有效,即具有相同类型模式的4元组。
无选项
的一部分如果变量可能是doThat()
,那么该变量的类型为None
,其中Option[X]
是变量的类型,如果不是 {{1} }。
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]]
。