2017-02-22 9 views
0

Я работаю с Scala почти год, но время от времени я сталкиваюсь с куском кода, который я действительно не понимаю. На этот раз это он. Я пробовал искать документы по «методам scala с общим типом параметров», но я все еще смущен.Методы Scala с общим параметром типа

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». Я не понимаю, почему это происходит, так как совпадение здесь происходит против «переменной», которая будет либо целым, либо строкой.

+0

Не значит 'уаг exValue = Некоторые из них (10)'? –

+0

Просто скорректировал это. Спасибо за то, что указали :) – Goldengirl

+0

Вы сначала играете против 'block'. Если 'block' является' None', почему он не будет обращаться к 'case _ = None'? – Gal

ответ

4

Что здесь происходит, что когда вы не передать None он будет соответствовать на втором случае, который «ловит» все, что не является экземпляром Some [T]:

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

Обратите внимание, что None и Некоторые из них являются двумя различными классами, которые наследуются от опции.

Кроме того, совпадение переменных выполняется только в том случае, если первое совпадение выполнено успешно, в противном случае - нет. Для достижения проверки типа в первом матче вы могли бы сделать:

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

Надежда, что помогает

Смежные вопросы