2010-03-09 14 views
13

Temel olarak, kullanmadan önce bir değişkende saklamak zorunda kalmadan özel bir çıkarıcı oluşturabilirim.Aspiratörler, bir kasa ekstresinin gövdesinde (veya çıkarıcının kullanılabileceği herhangi bir yerde) parametrelerle özelleştirilebilir mi?

Bu, onu nasıl kullanacağımın gerçek bir örneği değil, normal ifade veya kurgu gibi başka bir dize kalıbı durumunda daha fazla kullanılır, ancak umarım, aradığımı açıklar: sadece tek bir özel çıkarıcı yaparken

def someExtractorBuilder(arg:Boolean) = new { 
    def unapply(s:String):Option[String] = if(arg) Some(s) else None 
} 

//I would like to be able to use something like this 
val {someExtractorBuilder(true)}(result) = "test" 
"test" match {case {someExtractorBuilder(true)}(result) => result } 

//instead I would have to do this: 
val customExtractor = someExtractorBuilder(true) 
val customExtractor(result) = "test" 
"test" match {case customExtractor(result) => result} 

çok fark yaratmaz, ama bir case ifadesi için presi büyük bir liste oluşturmaya olsaydı, bu tüm ayırarak şeyler daha zor okumak için yapabilir çıkarıcılar kullanımlarından.

Cevabın bunu yapamaz hayır bekliyoruz ama önce etrafında sormak düşündüm: D

+0

Ve yaptınız mı? scala> val {someExtractorBuilder (true)} (sonuç) = "test" :: 1: Hata: –

+0

ben denemek yaptım, bir sözdizimi hatası alınan basit desen val yasadışı bir başlangıç ​​{someExtractorBuilder (true)} (sonuç) = "test" ^ –

+0

Nihayetinde ne yapmaya çalışıyorsunuz? Bunu yapmanın daha iyi bir yolu var, çok fazla çıkarıcı yapmaktan daha iyi. –

cevap

2

Hayır.

8.1.7 Çıkarıcı Desenler

An extractor pattern x (p 1 , . . . , p n) where n ≥ 0 is of the same syntactic form as a constructor pattern. However, instead of a case class, the stable identifier x denotes an object which has a member method named unapply or unapplySeq that matches the pattern.

7

Parametreleme presi serin olurdu, ama şu anda bunları uygulamak için gerekli kaynaklara sahip değildir.

+1

Bu tür sorulara göz kulak olduğun için teşekkürler :-) – Lutz

1

biri bu gibi örtülü parametreler kullanılarak belirli ölçüde presi, özelleştirebilir:

object SomeExtractorBuilder { 
    def unapply(s: String)(implicit arg: Boolean): Option[String] = if (arg) Some(s) else None 
} 

implicit val arg: Boolean = true 
"x" match { 
    case SomeExtractorBuilder(result) => 
    result 
} 

Ne yazık ki bu, match numaralı belgede farklı varyantlar kullanmak istediğinizde kullanılamaz, case ifadeleri aynı kapsamda. Yine de, bazen yararlı olabilir.

İlgili konular