好的,所以我是Scala的初学者,我需要在if-else函数中返回None。但我总会得到这个错误:
<console>:42: error: type mismatch;
found : None.type
required: Double
return None
我有办法解决这个问题吗?
更新:这些是我的代码
def get_grid_parameters(params: Double): Double = {
if (params == "edge_lating") {
return grid_hex_edge_length_latlng
}
else if (params == "grid_bottom_left_lat") {
return grid_bottom_left_lat
}
else if (params == "grid_bottom_left_lng") {
return grid_bottom_left_lng
}
else if (params == "edge_metres") {
return latlng_diff_to_metres(grid_hex_edge_length_latlng)
}
else if (params == "hex_height") {
return 0.002598076211353316
}
else if (params == "increment_lng") {
return 0.002250
}
else if (params == "increment_lat") {
return 0.001299038105676658
}
else {
print("Invalid parameters!")
return None
}
}
答案 0 :(得分:3)
将函数的返回类型更改为Option[Double]
。 Scala中的return
是可选的。 params
应为String
def get_grid_parameters(params: String): Option[Double] = {
if (params == "edge_lating") {
Some(grid_hex_edge_length_latlng)
}
else if (params == "grid_bottom_left_lat") {
Some(grid_bottom_left_lat)
}
else if (params == "grid_bottom_left_lng") {
Some(grid_bottom_left_lng)
}
else if (params == "edge_metres") {
Some(latlng_diff_to_metres(grid_hex_edge_length_latlng))
}
else if (params == "hex_height") {
Some(0.002598076211353316)
}
else if (params == "increment_lng") {
Some(0.002250)
}
else if (params == "increment_lat") {
Some(0.001299038105676658)
}
else {
print("Invalid parameters!")
return None
}
}
你可以使用更清晰的模式匹配
def getGridParams(param: String): Option[Double] = param match {
case "edge_lating" => Some(grid_hex_edge_length_latlng)
case "grid_bottom_left_lat" => Some(grid_bottom_left_lat)
case "grid_bottom_left_lng" => Some(grid_bottom_left_lng)
case "edge_metres" => Some(latlng_diff_to_metres(grid_hex_edge_length_latlng))
case "hex_height" => Some(0.002598076211353316)
case "increment_lng" => Some(0.002250)
case "increment_lat" => Some(0.001299038105676658)
case _ => None
}
<强>解释强>
在Scala中,使用None
不会捕获任何值,而某些值大小写使用Some(value)
建模。 Option
是超类型None和Some。因此,可以将Some和None值直接分配给类型为Option[T]
的变量。
示例:
scala> val a: Option[Int] = None
a: Option[Int] = None
scala> val a: Option[Int] = Some(1)
a: Option[Int] = Some(1)
scala> def toInt(str: String): Option[Int] = {
| if (str.forall(_.isDigit)) Some(str.toInt)
| else None
| }
toInt: (str: String)Option[Int]
scala> toInt("123a")
res0: Option[Int] = None
scala> toInt("123")
res1: Option[Int] = Some(123)
在上面的示例中,如果字符串包含字符,则返回None,否则返回Some(value)。查看toInt
的返回类型,即Option [Int]