Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

ScalaのAdvanced Exampleを写経する(1)-XML Processing

Snippetは終わったので、今回からAdvanced Example。
addressbook.scala | The Scala Programming Language

ScalaXMLリテラル(表現あってる?)として扱える。
文字列にする必要がない。


さらにXMLリテラルの中にScalaコードを直接記述できる。

package sample.snippet

object AddressBook {
  
  case class Person(name: String, age: Int)
  
  /**
   * An AddressBook takes a variable number of Arguments
   * which are accessed as Sequence
   */
  class AddressBook(a: Person*) {
    private val people: List[Person] = a.toList
    
    
    def toXHTML = 
      <table cellpadding="2" cellspaceing="0">
        <tr>
          <th>Last Name</th>
          <th>First Name</th>
        </tr>
        {
          for (val p <- people) yield
            <tr>
              <td> { p.name } </td>
              <td> { p.age.toString } </td>
            </tr>
        }
      </table>;
    
  }
    /**
     * We introduce CSS using raw strings (between triple
     * quotes). Raw strings may contain newlines and special
     * characters (like \) are not interpreted.
     */
    val header = 
      <head>
        <title>
          { "My Address Book" }
        </title>
        <style type="text/css">
          {
            """table { border-right: 1px solid #cccccc; }
               th { background-color: #cccccc; }
               td { border-left: 1px solid #acacac; }
               td { border-bottom; 1px solid #acacac;"""
          }
        </style>
      </head>;
      
    val people = new AddressBook (
      Person("Tom", 20),
      Person("Bob", 22),
      Person("James", 19)
    );
    
    val page = 
      <html>
        { header }
        <body>
          { people toXHTML }
        </body>
      </html>;
      
    def main(args: Array[String]) {
      println(page getClass)
      println(page)
    } 
}

for文とかそのまま書いてるね。
あと、トリプルクォート。改行とか特殊文字(\とか)を含んだ文字列を作れる。
table〜tdまで1つの文字列。


実行結果。

class scala.xml.Elem
<html>
        <head>
        <title>
          My Address Book
        </title>
        <style type="text/css">
          table { border-right: 1px solid #cccccc; }
               th { background-color: #cccccc; }
               td { border-left: 1px solid #acacac; }
               td { border-bottom; 1px solid #acacac;
        </style>
      </head>
        <body>
          <table cellpadding="2" cellspaceing="0">
        <tr>
          <th>Last Name</th>
          <th>First Name</th>
        </tr>
        <tr>
              <td> Tom </td>
              <td> 20 </td>
            </tr><tr>
              <td> Bob </td>
              <td> 22 </td>
            </tr><tr>
              <td> James </td>
              <td> 19 </td>
            </tr>
      </table>
        </body>
      </html>

XMLであるpageはscala.xml.Elemオブジェクトのようだ。