Ö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.