summaryrefslogtreecommitdiffhomepage
path: root/scala.html.markdown
diff options
context:
space:
mode:
authorGeorge Petrov <petrovg@gmail.com>2013-07-29 18:33:03 +0100
committerGeorge Petrov <petrovg@gmail.com>2013-07-29 18:33:03 +0100
commita6ec23d414ba495b26a4028f9a6795d18a02cdac (patch)
tree16ec3acec19c2b4431591a7efea1df202d661f75 /scala.html.markdown
parent3f2922d87a1c947eb6e20551846fd1b307984680 (diff)
Added loops, iterators and regex
Diffstat (limited to 'scala.html.markdown')
-rw-r--r--scala.html.markdown56
1 files changed, 54 insertions, 2 deletions
diff --git a/scala.html.markdown b/scala.html.markdown
index a1396b4d..8bcbc27f 100644
--- a/scala.html.markdown
+++ b/scala.html.markdown
@@ -93,6 +93,7 @@ s(1)
// Tuples
+
// Combinators
s.map(sq)
@@ -114,6 +115,37 @@ for { n <- nSquared2 if n < 10 } yield n
for { n <- s; nSquared = n * n if nSquared < 10} yield nSquared
+/* NB Those were not for loops. The semantics of a for loop is 'repeat', whereas a for-comprehension
+ defines a relationship between two sets of data. Research this further */
+
+
+
+// Loops and iteration
+
+1 to 5
+val r = 1 to 5
+r.foreach( println )
+
+r foreach println
+// NB: Scala is quite lenien when it comes to dots and brackets - study the rules separately. This
+// helps write DSLs and APIs that read like English
+
+(5 to 1 by -1) foreach ( println )
+
+var i = 0
+while (i < 10) { println("i " + i); i+=1 }
+
+while (i < 10) { println("i " + i); i+=1 } // Yes, again. What happened? Why?
+
+i // Show the value of i. Note that while is a loop in the classical sense - it executes
+ // sequentially while changing the loop variable. while is very fast, faster that Java
+ // loops, but using the combinators and comprehensions above is easier to understand
+ // and parallelize
+
+// Tail recursion is an idiomatic way of doing things in Scala. Recursive functions need an
+// explicit return type, the compile can't infer it. Here it's Unit.
+def showNumbersInRange(a:Int, b:Int):Unit = { print(a); if (a < b) showNumbersInRange(a+1, b) }
+
// Conditionals
@@ -128,11 +160,13 @@ if (x == 11) println ("yeah") else println("nope")
println(if (x == 10) "yeah" else "nope")
val text = if (x == 10) "yeah" else "nope"
-
+var i = 0
+while (i < 10) { println("i " + i); i+=1 }
// Object oriented features
+
// Case classes
case class Person(name:String, phoneNumber:String)
@@ -141,6 +175,7 @@ Person("George", "1234") == Person("Kate", "1236")
+
// Pattern matching
val me = Person("George", "1234")
@@ -163,7 +198,14 @@ kate match { case Person("Kate", _) => "Girl"; case Person("George", _) => "Boy"
// Regular expressions
-// TODO
+val email = "(.*)@(.*)".r // The suffix .r invokes method r on String, which makes it a Regex
+
+val email(user, domain) = "henry@zkpr.com"
+
+"mrbean@pyahoo.com" match {
+ case email(name, domain) => "I know your name, " + name
+}
+
// Strings
@@ -178,6 +220,16 @@ println(s"We have $n apples")
val a = Array(11, 9, 6)
println(s"My second daughter is ${a(2-1)} years old")
+// Some characters need to be 'escaped', e.g. a double quote inside a string:
+val a = "They stood outside the \"Rose and Crown\""
+
+// Triple double-quotes allow for strings to span multiple rows and contain funny characters
+val html = """<form id="daform">
+ <p>Press belo', Joe</p>
+ | <input type="submit">
+ </form>"""
+
+
// Input and output