2017-02-22 8 views
0

私はScalaを1年近く使っていますが、今のところ私が実際に理解していないコードを見つけることがあります。今回はこれです。私は、 "一般的なパラメータ型のスカラーメソッド"に関する文書を調べてみましたが、私はまだ混乱しています。一般的なパラメータ型のスカラメソッド

def defaultCall[T](featureName : String) (block : => Option[T])(implicit name: String, list:Seq[String]) : Option[T] = 
{ 
    val value = block match { 
    case Some(n) => n match { 
     case i : Integer => /*-------Call another method----*/ 
     case s : String => /*--------Call another method----*/ 
     } 
     case _ => None 
} 

方法は、以下に示すコードを使用して呼び出されます。

var exValue = Some(10) 
val intialization = defaultCall[Integer]("StringName"){exValue} 

私は上記のコードでは理解していない何がdefaultCall方式における「ケース」ステートメントです。

exValueに値があり、空でない場合、コードは期待通りに機能します。しかし、私がexValueをNoneに変更した場合、私のコードは "case _ = None"の状態になります。私はここで行われた試合がIntegerかStringのどちらかである "変数"に対して行われているので、なぜこれが起こるのか分かりません。これは「キャッチ」のいくつかのインスタンスではありませんすべて[T]、ここであなたはどれを渡していない場合、第2のケースに一致することをされてはどうなり

+0

は、あなたが '' VARのexValue =一部(10)を意味するものではありません。助け

block match { case Some(n: Int) => // do stuff case Some(n: String) => // do stuff case _ => // Will match on any other case } 

希望:あなたができる最初の試合で型チェックを達成するために? –

+0

ただ修正しました。それを指摘していただきありがとうございます:) – Goldengirl

+0

最初に 'block'とマッチします。 'block'が' None'ならば、なぜ 'case _ = None'に行きませんか? – Gal

答えて

4

:なしという

block match { 
    case Some(n) => // Will match when you pass an instance of Some[T] 
    case _  => // Will match on any other case 
} 

注意とOptionから継承する2つの異なるのクラスもあります。

また、変数の一致は最初の一致が成功した場合にのみ行われ、そうでない場合は実行されません。

関連する問題