出るみたいです。

原書買わずに待てば良かった。。。

Programming in Scalaで勉強

配列に値を設定してfor文で出力

var greetings = new Array[String](3)
greetings(0) = "Hello"
greetings(1) = "Good Morning"
greetings(2) = "Good Evening"
greetings(3) = "Good Afternoon"

for(i <- 0 to 3){
prnitln(greeting(i)
}


こんな書き方もできる。
var greetings = Array("Hello","Good Morning","Good Afternoon","Good Afternoon")
for(i <- 0 to 3){
prnitln(greeting(i))
}

Programming in Scalaで勉強

引数を2つ渡し、大きい方の値を返却するメソッドmaxを定義する。

public int max(int a, int b){
if(a > b){
return a;
} else {
return b;
}
}

上記のjavaで書いたメソッドをそのままscalaで書き換えると
def max(a:Int, b:Int):Int = {
if(a > b){
return a;
} else {
return b;
}
}
になる。

scalaではメソッドはdefで始まる。
javaでは戻り値、メソッド名、引数の順番だが、scalaではメソッド名、引数、戻り値の順番になる。
また、javaの引数は型、仮引数の順番だが、scalaでは仮引数、型の順番になる。


scalaではセミコロンを省略できるので
def max(a:Int, b:Int):Int = {
if(a > b){
return a
} else {
return b
}
}
と書いてもよい。

また、returnも省略できるので
def max(a:Int, b:Int):Int = {
if(a > b){
a
} else {
b
}
}
と書ける。

ついでにカッコも省略して
def max(a:Int, b:Int):Int = {
if(a > b)
a
else
b
}
}

Programming in Scalaで勉強

Scalaには2種類の変数(valとvar)がある。
valはjavaのfinal変数と同じ。
varはjavaのfinalでない変数と同じ。

var greeting = "Hello"
greeting = "bey"
はOKだが

val greeting = "Hello"
greeting = "Bey"
はエラーとなる。

PrepareInterceptorはActionで実際に呼び出されるメソッドの前処理用のメソッドを呼び出す。使用するためにはActionクラスでPreparableを継承する。

前処理用のメソッドとして以下のメソッドが順番に呼び出される(1,2はメソッドが存在する場合のみ、また2は1のメソッドが存在したら呼び出されない。)

  1. prepare{メソッド名}()
  2. prepareDo(メソッド名}()
  3. prepare()

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;

public class ProperSample extends ActionSupport implements Preparable{

public void prepareHoge() throws Exception {
System.out.println("prepareHoge()")
}

public void prepareDoHoge() throws Exception {
System.out.println("prepareHoge()")
}

public void prepare() throws Exception {
System.out.println("prepare")
}

public String hoge() throws Exception{

return SUCCESS;
}
}

例えば、上記のようなクラスが存在しhoge()メソッドが呼び出されるURLが叩かれたとすると、
まずprepareHoge()がよばれ、次にprepare()がよばれる。(prepareHoge()が存在するのでprepareDoHoge()は呼び出されない。)その後に、他に積まれているインターセプターがあればそれを実行し、その後hoge()メソッドが呼ばれる。

デフォルトではprepare()は必ず呼び出される。これを止めたい(要するにprepare{メソッド名}()またはprepareDo{メソッド名}()だけを呼び出したい)場合はalwaysInvokePrepareフィールドを"false"にする。で、これを行うためには以下のような記述をする。

<interceptor-ref name="prepare">
<param name="alwaysInvokePrepare">false</param>
</interceptor-ref>

PrepareInterceptorはstruts-default.xmlで宣言されているinterceptor-stackにはすべて組み込まれている。よって、struts-default.xmlで宣言されているいずれかを使用する場合はstruts.xmlにPrepareInterceptorを使用するための定義を書く必要はない。