Category: ‘Scala’

Playframework 事始め その2

2013年8月13日 Posted by PURGE

まあ、どこのPlay2を説明しているサイトも記述してあるが、下記コマンドにてアプリが起動する。

$ play run
Getting org.scala-sbt sbt_2.9.1 0.11.3 ...
:: retrieving :: org.scala-sbt#boot-app
	confs: [default]
	37 artifacts copied, 0 already retrieved (7245kB/949ms)
[info] Loading project definition from /Users/northvan/Works/eclipse/PlayTest/project
[info] Set current project to PlayTest (in build file:/Users/northvan/Works/eclipse/PlayTest/)

[info] Updating {file:/Users/northvan/Works/eclipse/PlayTest/}PlayTest...
[info] Done updating.                                                                  
--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on port 9000...

(Server started, use Ctrl+D to stop and go back to the console...)

[info] Compiling 5 Scala sources and 1 Java source to /Users/northvan/Works/eclipse/PlayTest/target/scala-2.9.1/classes...
[info] play - Application started (Dev)

railsと似た良い感じ。ただコンパイルが走っているからか、railsと比較して少し起動は遅く感じる。

playframeworkのサイトリニューアル

2013年2月6日 Posted by PURGE

play 2.0.4で、play run すると下記のエラー。

 a module is not authorized to depend on itself

原因はわかりませんが、play 2.1.0をインストールし直すことで解決。

ちなみに、playのサイトがリニューアルしました。ダウンロードしている最中にサイトが変わった。

どうでも良いことですが・・・。

Effective Scala

2013年2月5日 Posted by PURGE

Scalaについての、言語の規約等について無知であるが、下記のようなサイトを発見した。

Effective Scala

これにならうと、getter/setterには、あえてget/setは付けないらしい。

但し、Javaの癖で中々規約に慣れるのは難しい。

ScalaでTrait

2013年2月4日 Posted by PURGE

traitとは、Javaでいうinterfaceのようなものらしい。

Mmmal.scala

package com.whoocus

trait Mammal {

}

extendsキーワードで継承するらしい。

package com.whoocus

class Animal (name: String) extends Mammal{

}

Scalaでのクラス継承

2013年2月4日 Posted by PURGE

Scalaでクラスの継承の実験。
良くある Animalクラスを継承したDogクラスを作成してみる。

Animal.scala

package com.whoocus

class Animal (name: String){

  var _name:String = name
   
  def getName:String = {
    this._name
  }
  
  def setName(name:String) = {
    this._name = name
  }
}

Dog.scala

package com.whoocus

class Dog(name :String) extends Animal(name) {
	var name :String = "No name!!"
}

Main.scala

package com.whoocus

object Main {

  def main(args: Array[String]): Unit = {
    var dog = new Dog("ポチ")
    
    println("こんにちは。 " + dog._name + "さん!!!")
    println("こんにちは。 " + dog.name + "さん!!!")
    
  }
}

出力結果

こんにちは。 ポチさん!!!
こんにちは。 No name!!さん!!!

どうやら親クラスのコンストラクタが呼ばれ、Dogクラスとの関係が分かる。
但し、dog.nameのところでIDEによるエラーが検出されているのが気になります。

Scalaでオブジェクトを作成してみる その3

2013年2月4日 Posted by PURGE

どうやら、コンストラクタ引数に var を付けると、privateフィールド(クラスメンバー)を作成してくれ、しかも getter/setterを作成してくれるみたい。

Main.scala

package com.whoocus

object Main {

  def main(args: Array[String]): Unit = {
    var bird = new Bird("ハヤブサ")
    
    println("こんにちは。 " + bird.name + "さん!!!")
    
  }
}

Bird.scala

package com.whoocus

class Bird (var name :String){

}

便利なのかどうなのか?

ちなみに、getter/setterメソッドは、publicメソッドらしいので、値を変更もできるようだ。
Main.scala

package com.whoocus

object Main {

  def main(args: Array[String]): Unit = {
    var bird = new Bird("ハヤブサ")
    
    println("こんにちは。 " + bird.name + "さん!!!")

    bird.name = "Falcon"
    println("こんにちは。 " + bird.name + "さん!!!")
    
  }
}

出力結果

こんにちは。 ハヤブサさん!!!
こんにちは。 Falconさん!!!

ちなみに、コンストラクタ変数を private宣言すると、private変数となり、getter/setterメソッドは作成されないようだ。

class Bird (var name :String, private var call :String){
}

エラーでメソッドは呼べません。

    println("返事は、" + bird.call + "!!!")

Scalaでオブジェクトを作成してみる その2

2013年2月1日 Posted by PURGE

今度は、privateメソッドを作成してコールしてみた。
IDE(eclipse)上では、特にエラーにはなっていなかった。

Main.scala

package com.whoocus

object Main {

  def main(args: Array[String]): Unit = {
    var animal = new Animal("ライオン")
    
    println("こんにちは。 " + animal.wisperName + "さん!!!")
    
  }
}

Animal.scala

package com.whoocus

class Animal (name: String){

  var _name:String = name

  private def wisperName = {
    "I don't wanna say my name is " + _name
  }
  
  def getName:String = {
    this._name
  }
  
  def setName(name:String) = {
    this._name = name
  }
}

さすがに、実行時エラーとなりました。

Scalaでオブジェクトを作成してみる その1

2013年2月1日 Posted by PURGE

Javaプログラムでは定番の動物クラスを作ってみようと思う。
実際、scalaのプログラミングで、このような記述の仕方が推奨されているかどうかは知りません。
とりあえずの勉強のために、Java方式で、getter/setterを記述してみました。

Main.scala

package com.whoocus

object Main {

  def main(args: Array[String]): Unit = {
    var animal = new Animal("ライオン")
    
    println("こんにちは。 " + animal.getName + "さん!!!")
    
  }
}

Animal.scala

package com.whoocus

class Animal (name: String){

  var _name:String = name
  
  def getName:String = {
    this._name
  }
  
  def setName(name:String) = {
    this._name = name
  }
}

まずは、出力はこんな感じです。

こんにちは。 ライオンさん!!!

scala関数の引数の渡し方

2013年1月28日 Posted by PURGE

最初は分かり難い関数の引数についての覚え書き。

object Hello {

  def main(args:Array[String]):Unit = {
	println("Hello hoge。");	  
  
	hello()
	helloWithName1("hogehoge")
	helloWithName2("hogehogehoge")
  }
  
  //
  def hello():Unit = println("Hello hoge。")

  //
  def helloWithName1(name:String):Unit = {
    println("Hello " + name )
  }

  //
  def helloWithName2(name:String):Unit = println("Hello " + name )
  
}

出力は以下。

Hello hoge。
Hello hoge。
Hello hogehoge
Hello hogehogehoge

Playframework 初めてのcontroller

2013年1月2日 Posted by PURGE

お手本通りのcontroller作成。
間違いで、objectをclassと記述してしまって、ちょっとハマった。

HelloController.scala

package controllers

import play.api.mvc.Action
import play.api.mvc.Controller

object HelloController extends Controller {
  def index = Action{
    Ok(<p>Hello Purgeさん</p>).as(HTML)
  }

}

routesファイル

GET     /hello                      controllers.HelloController.index

日本語も難なく表示した。
今度は、viewファイルを使用してみる。views以下に配置。

HelloController.scala

package controllers

import play.api.mvc.Action
import play.api.mvc.Controller

object HelloController extends Controller {
  def index = Action{
    //Ok(<p>Hello Purgeさん</p>).as(HTML)
    Ok(views.html.hello())
  }

}

hello.scala.html

<html>
	<head>
		<title>Hello Scala!!</title>
	</head>
	<body>
		<p>こんにちは。Purgeさん!!!!</p>
	</body>
</html>

最初は、controllerから、viewを指定するの記述方法に迷った。とりあえずはこれで動作した。

こんどは、パラメータを受け取ってみる。

HelloController.scala

package controllers

import play.api.mvc.Action
import play.api.mvc.Controller

object HelloController extends Controller {
  def index = Action{request =>
    val params: Map[String, Seq[String]] = request.queryString
    val name = params("name").head
    Ok(views.html.hello(name))
  }
}

パラメータが見つからないとエラーとなるようなので、あえて下記のようにリクエストにパラメータを付加してみる。

http://localhost:9000/hello?name=ほげ

hello.scala.html

@(name: String)
<html>
	<head>
		<title>Hello Scala!!</title>
	</head>
	<body>
		<p>こんにちは。@name さん!!!!</p>
	</body>
</html>

パラメータを受けて、名前が表示された。