2016-10-31 9 views
1

私はScalaの初心者ですから、if-else関数でNoneを返さなければなりません。しかし、私は常に、このエラーが発生します。返す方法パラメータがdoubleの場合は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

あなたの関数はどこにありますか? – pamu

+0

@pamu更新を見てください – nsbr11

答えて

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 
} 

説明パターンマッチングを使用することができます。何の価値がNoneを用いて撮影されていないと、いくつかの値の場合はSome(value)を使用してモデル化されたスカラ座で

を。 Optionは、スーパータイプなしおよび一部です。したがって、型の変数に直接代入することができます。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を返す文字が含まれている場合。戻り値の型はtoIntです。[Int]

+0

「DoubleとStringの型の値を比較すると「==」は常にfalseになります」という警告が表示されました – nsbr11

+0

@ nsbr11がパターンマッチングのソリューションを追加しました – pamu

+0

オハイオ州で働いていますか?ありがとうございました! – nsbr11

関連する問題