2015-08-10 5 views
3

Я прочитал The Neophyte's Guide to Scala Part 5: The Option Type, и он предложил, чтобы он соответствовал параметрам. Я внедрил его предложение здесь:Scala Pattern Matching on Option

s3Bucket match { 
    case Some(bucket) => 
    bucket.putObject(partOfKey + key + file.getName, file) 
    true 
    case None => 
    false 
} 

Но у меня есть некоторые вопросы о том, как это работает. А именно, поскольку s3Bucket имеет тип Option[Bucket], как case Some(bucket) развернуть s3Bucket в bucket? Что именно происходит под капотом?

+1

вы должны также прочитать о экстракторах в своей серии статей. Это статья номер один http://danielwestheide.com/blog/2012/11/21/the-neophytes-guide-to-scala-part-1-extractors.html – maks

+0

@maks спасибо! Я прочитал учебник Scala, чтобы узнать Scala, поэтому я фактически не просматривал статьи, я просто рассматриваю их как ссылку. Я прочитаю их сейчас. – jstnchng

ответ

6

Короткий ответ: экстракторы.

Что такое экстрактор? Я не буду вдаваться в подробности здесь, но - вкратце - экстрактор - это метод, способный деструктурировать экземпляр типа, извлекая из него значение.

В Скале любом A, что обеспечивает unapply метод с этой подписью

def unapply(object: A): Option[B] 

может быть использован в сопоставлении с образцом, где он будет извлекать значение типа B, если спички успешно.

Здесь есть много ресурсов, которые вы можете прочитать об этом механизме. Хорошим является это blog post от Daniel Westheide.

Возвращаясь к вашему вопросу, Some и None и обеспечивают unapply метод в силу того, что тематические классы (которые автоматически распространяются Product), поэтому они могут быть использованы в сопоставлении с образцом.

схематичный реализация будет идти довольно много, как:

object Some { 
    def unapply[A](a: Some[A]) = Some(a.get) 
} 

object None { 
    def unapply(object: None) = None 
}