Ölçek numaralandırmalarını anlama


122

Scala sayım sınıflarını anlamadığımı söylemeliyim. Örneği belgelerden kopyalayıp yapıştırabilirim, ancak neler olduğu hakkında hiçbir fikrim yok.

object WeekDay extends Enumeration {
  type WeekDay = Value
  val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
  • Ne anlama geliyor type WeekDay = Valueve bunu neden yazmam gerekiyor?
  • Neden val Mon = Value? Bu ne anlama geliyor?
  • Neden WeekDay nesneyi içeri aktarmam gerekiyor? Ve,
  • Ben yazarken val day = WeekDay.Mon, neden yazın olduğu WeekDay.Value, yazın değil WeekDay?

2
Scala Numaralandırma ve alternatifler hakkında küçük bir genel bakış yazdım, yararlı bulabilirsiniz: pedrorijo.com/blog/scala-enums/
pedrorijo91

Mühürlü özellikler mükemmel bir alternatif sunar - stackoverflow.com/questions/11203268/what-is-a-sealed-trait
Joey Baruch

Yanıtlar:


150

Enumerationözellik türüdür üyesi vardır Valuenumaralandırma tek tek öğeleri (aslında bir iç sınıfı, ama fark burada önemli değil) temsil eden.

Böylece object WeekDaybu tip üyeyi miras alır. Satır type WeekDay = Valueyalnızca bir tür takma adıdır . Yararlıdır, çünkü onu başka bir yere aktardıktan sonra import WeekDay._, bu türü kullanabilirsiniz, örneğin:

def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)

Bunun yerine, minimal bir sürüm şu şekilde olacaktır:

object WeekDay extends Enumeration {
  val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}

ve yok etmek zorunda içeriğini almak object WeekDay, ama sonra türünü kullanmak gerekir WeekDay.Valueve bireysel üyeleri nitelemek. Böylece örnek olur

def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)

İkinci soru kelimesinin anlamı ile ilgili val Mon, ... = Value. Uygulamasına bakmazsanız, bu gerçekten çok kafa karıştırıcı Enumeration. Bu bir tipin görevi değil! Bunun yerine bir korunmuş aradığını aynı adı yöntemi , Valuetür bir somut örneğini verir, Value.

O kadar yazabilir olur val a, b, c = fooScala, ve her değer için a, bve cyöntem footekrar tekrar çağrılır. Enumerationbu numarayı, her bir değerin ayrı olması için dahili bir sayacı artırmak için kullanır.

Scala API belgelerini Enumerationaçıp üzerine tıklarsanız, Visibility: Allo yöntemin göründüğünü göreceksiniz.


2
Teşekkürler, bu çok kafa karıştırıcı ama bence doğru. Bunun yerine kapalı vaka sınıfları kullanacağım,% 100 daha kolay görünüyor.
Karel Bílek

2
Ben de şahsen kapalı vaka sınıflarını tercih ediyorum. Biraz daha ayrıntılı, ancak değişken dahili sayaçlarla daha az hokus-pokus vb. Scala 2.10 ile numaralandırmaların (Java'nın aksine bir dil yapısı değil, sadece bir kütüphane çözümüdür) makrolar kullanılarak nasıl daha iyi yazılabileceği konusunda bazı fikirler vardır.
0__

@ 0__ Scala'daki numaralandırmayı değiştirmek için mühürlenmiş sınıfı neden ve nasıl kullandığınızı sorabilir miyim? Scala'nın Numaralandırmasında bir sorun mu var?
x1a0

Ya Enum değerlerinin kendilerinin üyeleri varsa? Örneğin, haftanın her günü için açılış saatlerini nasıl tanımlarsınız: Pzt (8,20), ..., Paz (0,0)?
simou

1
@simou o zaman gerçekten mühürlü bir özellik ve gerçek alt sınıflar kullanmalısınız. Yine de bu senaryoya "sıralama" demezdim. Yazsanız iyi Open(Mon, 8, 20)olur ve günler düz bir sıralama olarak kalır.
0__
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.