Scala

Koziołek

     1 Scala - język obiektowy
          1.1 Traits
          1.2 Object
     2 Scala - język funkcyjny
          2.3 Pattern matching

# Podstawowe informacje

Scala[#]_ jest językiem obiektowo-funkcyjnym stworzonym pod kierownictwem Martina Odersky'ego na Politechnice w Lozannie w 2001 roku. Pierwsza stabilna wersja języka ukazała się w roku 2004, a wersja druga w 2006. Obecnie język jest dostępny w wersji 2.9( podwersja .0.1 ukazała się w maju 2011) . Scala jest dostępna na platformę JVM, KVM CLDC oraz .NET (w tej 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ć 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. Ponad to 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, jak w Javie, tylko z pojedynczej nadklasy. 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, może być implementowany przez klasy, można 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. Ponad to object jest jedyną opcją na dostarczenie głównej metody programu (w javie 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 są tworzone portale Guardian [#]
oraz DSL Scalar służący do obsługi Cloud Coumputingu[#]_

.. [#] http://www.scala-lang.org/
.. [#] http://liftweb.net/
.. [#] http://www.infoq.com/articles/guardian_scala
.. [#] http://www.jroller.com/nivano[...]ducing_scalar_scala_based_dsl

0 komentarzy