Scala'da bir değişkeni nasıl kullanırım?


199

Türü Graphicsolan bir değişken göz önüne alındığında , bunu Graphics2DScala'da nasıl kullanırım?

Yanıtlar:


282

Tercih edilen teknik, desen eşleşmesini kullanmaktır. Bu, söz konusu değerin verilen türden olmadığı durumu ele almanızı sağlar :

g match {
  case g2: Graphics2D => g2
  case _ => throw new ClassCastException
}

Bu blok, asInstanceOf[Graphics2D]yöntemin anlambilimini , ancak daha fazla esneklikle çoğaltır . Örneğin, çeşitli koşullar için farklı dallar sağlayabilir, aynı anda birden fazla koşullu yayın gerçekleştirebilirsiniz. Son olarak, tümünü yakalama alanına gerçekten bir istisna atmanız gerekmez, ayrıca geri dönebilirsiniz null(veya tercihen None) veya olmadan çalışan bir yedek dal girebilirsiniz Graphics2D.

Kısacası, bu gerçekten gitmenin yolu. Sözdizimsel olarak biraz daha hantal asInstanceOf, ancak eklenen esneklik neredeyse her zaman buna değer.


19
+1 çünkü ilginç, ancak bu senaryo için biraz fazla. değil mi?
Eugene Yokota

Ben zaten eşleşti ancak döküm değeri referans kaybetti: <code> temel maç {case MyConcrete (değer) => base.asInstanceOf [MyConcrete] .something (value)} </code>, bir almanın yolu var mı? base ', "case MyConcrete (value)" tarafından gerçekleştirilen "appapp" çağrısından yararlanarak "value" değerini çıkarmak isteseniz bile MyConcrete'e mi dökülür?
ithkuil

4
base match { case base @ MyConcrete(value) => base.something(value) } Şunu deneyin: Açıkçası, gölgeleme baseisteğe bağlıdır. Farklı bir değişken adını da kolayca kullanabilirsiniz.
Daniel Spiewak

Ne alamadım bu desen eşleşen bir değişken içine döküm sonucu nasıl elde? java'da olduğu gibi String = a = (String) b; scala eşdeğeri ne olurdu?
James McMahon

@JamesMcMahonval gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
Kevin Meredith

224
g.asInstanceOf[Graphics2D];

36
Scala'ya asInstanceOfalıştıktan sonra, statik tip sisteme sahip olma amacını yitirdiği ve yucky hissettiği için kullanmamayı öğrendim .
Eugene Yokota

26
Ne yazık ki, bu Swing kullanırken yaygın bir işlemdir. Özel boyama işlemleri için, 'genel void paintComponent (Graphics g)' yöntemini geçersiz kılmanız gerekir. Graphics parametresi aslında bir Graphics2D örneğidir, ancak bir döküm gerekir. Örüntü eşleme sürümü, muhtemelen garanti edilenden daha ayrıntılıdır. Unutmayın: Şaşırtıcı hiperverbosite ve prolixity'den kesinlikle kaçın!
hohonuuli

7
@hohonuuli Bence bu özel durumda oyuncu iyi, ama scala-swingbileşenler kullanıyorsanız, paintComponent parametresi zaten Graphics2D olduğundan döküm gerekmiyor
Luigi Plinge

2
Neden bu kadar uzun? Neden "asInstanceOf ne zaman sadece" gibi "veya" asof "anahtar kelime veya yöntem olabilir? Ya da neden sadece bir seçenek olarak C ++ ve Java yolunu benimsemediler çünkü bu geleneksel ve bununla ilgili büyük bir sorun yok?
LEMUEL ADANE

16
@LemuelAdane Oyuncu kadrolarını hiç kullanmanız bir kod kokusudur, onları kolaylaştırmak mantıklı değildir.
Daenyth
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.