diff --git a/scala.html.markdown b/scala.html.markdown new file mode 100644 index 00000000..e8cde611 --- /dev/null +++ b/scala.html.markdown @@ -0,0 +1,178 @@ +--- +language: scala +author: Dominic Bou-Samra +author_url: http://dbousamra.github.com +filename: learnscala.scala +--- + +Scala is a + +```scala + +/////////////////////////////////////// +// Basic syntax +/////////////////////////////////////// + +// Single line comments start with two forward slashes +/* +Multi line comments look like this. +*/ + +// Import packages +import scala.collection.immutable.List +// Import all "sub packages" +import scala.collection.immutable._ +// Import multiple classes in one statement +import scala.collection.immutable.{List, Map} +// Rename an import using '=>' +import scala.collection.immutable{ List => ImmutableList } +// Import all classes, except some. The following excludes Map and Set: +import scala.collection.immutable.{Map => _, Set => _, _} + +// Your programs entry point is defined in an scala file using an object, with a single method, main: +object Application { + def main(args: Array[String]): Unit = { + // stuff goes here. + } +} + +// Printing, and forcing a new line on the next print +println("Hello world!") +// Printing, without forcing a new line on next print +print("Hello world") + +// Declaring values is done using either var or val +// val declarations are immutable, whereas var's are mutable. Immutablility is a good thing. +val x = 10 // x is now 10 +x = 20 // error: reassignment to val +var x = 10 +x = 20 // x is now 20 + +/////////////////////////////////////// +// Types +/////////////////////////////////////// + +// Almost all types are objects. + +// You have numbers +3 //3 + +// Math is as per usual +1 + 1 // 2 +2 - 1 // 1 +5 * 3 // 15 +6 / 2 // 3 + +// Boolean values +true +false + +// Boolean operations +!true // false +!false // true +true == false // false +10 > 5 // true + +// Strings and characters +"Scala strings are surrounded by double quotes" // +'a' // A Scala Char +'Single quote strings don't exist' // Error +"Strings have the usual Java methods defined on them".length +"They also have some extra Scala methods.".reverse // See scala.collection.immutable.StringOps + +/////////////////////////////////////// +// Basic control constructs +/////////////////////////////////////// + +// if statements (else statements are optional) +if (10 > 5) println("10 is greater than 5") +// an else +if (x > 5) println("x is greater than 5") +else println("No it's not.") + +// Iteration + +// A while loop +while (x < 10) { + println("x is still less then 10") + x += 1 +} + +// A do while loop +do { + println("x is still less then 10"); + x += 1 +} while (x < 10) + +// A for loop +for (x <- 0 until 10) { + println(x) +} + +// Any object implementing the map/filter/flatMap methods allows the use of a for loop: +val aListOfNumbers: List[Int] = List(1, 2, 3) +for (x <- aListOfNumbers) { + println(x) +} + +// Pattern matching (see respective section) +x match { + case 5 => println("x is 5") + case 10 => println("x is 10") + case _ => println("default case") +} + +/////////////////////////////////////// +// Functions, methods and classes +/////////////////////////////////////// + +// Scala has classes + +// classname is Dog +class Dog { + //A method called bark, returning a String + def bark: String = { + // the body of the method + "Woof, woof!" + } +} + +// They can contain nearly any other construct, including other classes, functions, methods, objects, case classes, traits etc. + +/////////////////////////////////////// +// Higher-order functions +/////////////////////////////////////// + +// Scala allows methods and functions to return, or take as parameters, other functions or methods. + +val add10: Int => Int = _ + 10 // A function taking an Int and returning an Int +List(1, 2, 3) map add10 // List(11, 12, 13) - add10 is applied to each element + +// Anonymous functions can be used instead of named functions: +List(1, 2, 3) map (x => x + 10) + +// And the underscore symbol, can be used if there is just one argument to the anonymous function. It gets bound as the variable +List(1, 2, 3) map (_ + 10) + +TODO // If the anonymous block AND the function you are applying both take one argument, you can even omit the underscore +List("Dom", "Bob", "Natalia") foreach println + + +// Scala collections have rich higher-order functions defined on them. Some examples: + +// The map function takes a function/method, and applies it to each element in the structure +List(1, 2, 3) map (number => number.toString) + +// The filter function takes a predicate (a function from A -> Boolean) and selects all elements which satisfy the predicate +List(1, 2, 3) filter (_ > 2) // List(3) +List( + Person(name = "Dom", age = 23), + Person(name = "Bob", age = 30) +).filter(_.age > 25) // List(Person("Bob", 30)) + + +// Scala a foreach method defined on certain collections that takes a type returning Unit (a void method) +aListOfNumbers foreach (x => println(x)) +aListOfNumbers foreach println + +