参数为double时如何返回None?

时间:2016-10-31 05:48:57

标签: scala

好的,所以我是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
}

}

1 个答案:

答案 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]