Scala

Koziołek

     1 Podstawowe informacje
     2 Cechy szczególne
          2.1 Scala – język obiektowy
               2.1.1 Traits
               2.1.2 Object
          2.2 Scala – język funkcyjny
               2.2.3 Pattern matching
     3 Powiązania
     4 Zobacz też

Podstawowe informacje

Scala jest obiektowo-funkcyjnym językiem programowania, stworzonym pod kierownictwem Martina Odersky'ego na Politechnice w Lozannie w 2001 roku. Jego pierwsza stabilna wersja ukazała się w roku 2004, a wersja druga w 2006. Obecnie język jest dostępny w wersji 2.12.8; obsługiwane platformy: JVM, KVM CLDC oraz .NET (w tej ostatniej wersji może być nieaktualna).

Scala jest typowana statycznie, ale kompilator potrafi wnioskować typy, jeżeli nie są podane explicite.

Cechy szczególne

Scala wyróżnia się prostotą składni i jest stosunkowo łatwym do nauki językiem. Łączy w sobie cechy języków obiektowych oraz funkcyjnych. Programy w tym języku mogą być zarówno uruchamiane jako skrypty, jak i skompilowane do bytecodu JVM i uruchamiane jak zwykłe programy w Javie.

Scala – język obiektowy

Scala jako język obiektowy wyróżnia się brakiem typów prymitywnych, znanych z Javy. Ponadto wszystko jest traktowane jako obiekt (można zatem np. przeciążać operatory, które są traktowane jak metody). W języku tym dziedziczenie jest możliwe tylko z pojedynczej nadklasy (tak jak w Javie). Jednocześnie nie ma interfejsów; w ich miejsce wprowadzono tzn. Traits. Język udostępnia też specjalne klasy – object, które są traktowane jak Singletony.

Traits

Trait jest charakterystyczną konstrukcją występującą w Scali. W najprostszym ujęciu jest to odpowiednik javowego interfejsu. Tak jak interfejs, definiuje tylko listę dostępnych metod i może być implementowany przez klasy; można też implementować wiele traitsów w ramach jednej klasy. Jednocześnie – w przeciwieństwie do interfejsu – trait może dostarczyć implementacji metod i zachowywać się jak mixin.

Przykładowy trait Ordered dostarcza metod pozwalających na porównywanie obiektów:

trait Ordered[A]{
   def compare(that: A): Int

  def <  (that: A): Boolean = (this compare that) <  0
  def >  (that: A): Boolean = (this compare that) >  0
  def <= (that: A): Boolean = (this compare that) <= 0
  def >= (that: A): Boolean = (this compare that) >= 0
  def compareTo(that: A): Int = compare(that)

}

class Name(first:String, last:String) extends Ordered[Name] {

  val firstName = first

  val lastName=last

  def compare(that: Name): Int = { 
   if (lastName.compareTo(that.lastName) == 0 ){
     return firstName.compareTo(that.firstName)

   }else{
     return lastName.compareTo(that.lastName)
   }
   0 
  }
  override def toString :String = {
    return firstName+" " +lastName
  }
}

Object

Jak już zostało wspomniane, object jest to tak naprawdę Singleton, a cechę tę gwarantuje składnia języka oraz kompilator. Ponadto object jest jedyną opcją na dostarczenie głównej metody programu (w Javie jest to metoda main):

object Main {

  def main(args: Array[String]): Unit = {

    val a: Name = new Name("Adam", "Kowalski");
    val b: Name = new Name("Bartek", "Kowalski");
    val c: Name = new Name("Cezary", "Kowalski");
    val names: List[Name] = List(a, c, b);
   print( names.sort(_ < _)) ;
  }

}

Scala – język funkcyjny

Scala pozwala też na wykorzystanie paradygmatu programowania funkcyjnego. W znacznym uproszczeniu oznacza to, że programista definiuje, co chce uzyskać – a sposób, w jaki zostanie wykonane polecenie, jest przeniesiony do biblioteki języka.

// sumowanie wszystkich elementów listy
List(1,3,4,2).foldLeft(0)(_ + _)
// iloczyn wszystkich elementów listy
List(1,3,4,2).foldLeft(1)(_ * _)

Pattern matching

Jest to cecha języka, która pozwala na wykonywanie kodu w zależności od określonych kryteriów. Cecha ta jest doskonale widoczna w przypadku bloków try/catch, które w Scali wyglądają następująco:

   try { 
      // ... 
   } catch {
     case ioe: IOException => ... // more specific cases first !
     case e: Exception => ...
   }

W ten sam sposób można uwarunkować kod:

     names.foreach(_.firstName match {
      case "Adam" => println("Moje imie jest biblijne") 
      case "Bartek" => println("Moje imie to zdrobnienie, ale od którego?")
      case _ => println("Co ja tutaj robię?")
    })

Powiązania

  • W Scali powstał framework webowy Lift.
  • W Scali tworzone są portale The Guardian oraz DSL Scalar służący do obsługi cloud coumputing

Zobacz też

0 komentarzy