Scala制御構造と関数
0.ポイント if式有値 ブロックにも値があり、その最後の式の値 です.セミコロン(ほとんどの場合)は、必要な ではありません. voidタイプはUnit 関数定義でreturn を使用することを避ける関数定義式から漏れないように注意= 異常な動作はJavaまたはC++とほぼ同じで、catch文で「モードマッチング」を使用するのとは異なります. Scala検査異常なし 1.条件式
式
3.ブロック式と代入
{}ブロックには一連の式が含まれており、その結果も式です.ブロック内の最後の式の値がブロックの値です.
Scalaでは、割り当てアクション自体に値はありません.その値はUnitタイプで、割り当て文の終了ブロックなどです.
その値はUnitタイプです.
5.サイクル
ループを途中で終了:1.Boolean型の制御変数2を使用する.ネストされた関数を使用する-関数からreturn 3.Breaksオブジェクトのbreakメソッドの使用
6.高級forサイクルとfor導出式
forループのループがyieldで開始されると、ループはセットを構築し、反復するたびにセットの値を生成します.
7.関数
関数の定義:関数名を指定するには、パラメータを入力し、値タイプを返します.関数ボディの戻りタイプは、関数が再帰的である場合に指定されます.Scalaコンパイラは=記号の右側の式のタイプから戻りタイプを推定することができる.
8.デフォルトパラメータと名前付きパラメータ
パラメータleftとrightにはデフォルト値[和]が付いています.
9.変長パラメータ
再帰定義:
10.プロセス
関数体が{}に含まれているが、前の=番号がない場合、戻りタイプはUnitです.このような関数をプロセス(procedure)と呼ぶ.
Unit戻りタイプを明示的に定義することもできます.
11.怠け者
最初に値を取得したときに初期化されます
lazy val words = scala.io.Source.fromFile(“/usr/share/dict/words”).mkString
12.異常
throw new IllegalArgumentException(「x should not be negative」)throw式には特別なタイプのNothingがあります.これはif/elseで役に立ちます.ブランチのタイプがNothingの場合、if/else式のタイプは別のブランチのタイプです.次のようになります.
例外を取得する構文は、パターンマッチングの構文を使用します.
より一般的な異常は、より具体的な異常の後にあるべきである.try/catch文は異常を処理し、try/finally文は異常が処理されていない場合に何らかの動作を実行します.
if (x > 0) 1 else -1
val s = if(x > 0) 1 else -1
Java C++:s = x > 0 ? 1 : -1
式
if(x>0) 1 else -1
のタイプはIntであり、2つの分岐のタイプはすべてIntであるためである.if(x>0) "positive" else -1
のタイプは、2つのブランチタイプの共通スーパータイプである.この例では、1つのタイプがjavaである.lang.String、もう一つのタイプはIntで、それらの共通スーパータイプはAnyと呼ばれています.else部分欠落:if(x>0)1 Scalaでは、各式に何らかの値があるはずです.この問題の解決策はUnitクラスを導入し,()と書くことである.if(x>0)1はif(x>0)1 else()()()と同等であり、UnitをJavaまたはC++のvoidとする.3.ブロック式と代入
{}ブロックには一連の式が含まれており、その結果も式です.ブロック内の最後の式の値がブロックの値です.
val distance = {
val dx = x-x0;
val dy = y - y0;
sqrt(dx * dx + dy * dy)
}
Scalaでは、割り当てアクション自体に値はありません.その値はUnitタイプで、割り当て文の終了ブロックなどです.
{ r = r * n; n -= 1 }
その値はUnitタイプです.
x = y =1 #
y = 1 (), x=()
Java C++ , , 。
5.サイクル
while(n > 0){
r = r * n
n -= 1
}
for(i <- 1 to n)
r = r * i
val s = "Hello"
var sum = 0
for(i <- 0 until s.length) //i s.length-1
sum += s(i)
var sum = 0
for(ch <- "Hello") sum +=ch
ループを途中で終了:1.Boolean型の制御変数2を使用する.ネストされた関数を使用する-関数からreturn 3.Breaksオブジェクトのbreakメソッドの使用
6.高級forサイクルとfor導出式
for(i <- 1 to 3;j<- -1 to 3) print ((10 * i + j) + " ") // 11 12 13 21 22 23 31 32 33
for(i <- 1 to 3;j<- 1 to 3 if i != j){
print ((10*i +j) + " ")
} //12 13 21 23 31 32 //if
for(i <- 1 to 3;from = 4 - i;j <- from to 3){
print((10 * i + j) + " ")
} // 13 22 23 31 32 33
forループのループがyieldで開始されると、ループはセットを構築し、反復するたびにセットの値を生成します.
for(i <- 1 to 10) yield i % 3
// Vector(1,2,0,1,2,0,1,2,0,1)
for 。
for(c <- "Hello";i <- 0 to 1) yield (c+i).toChar
// "HIeflmlmop"
for(c <- 0 to 1;c <- "Hello") yield (c+i).toChar
//Vector('H','e','l','l','o','I','f','m','m','p')
7.関数
関数の定義:関数名を指定するには、パラメータを入力し、値タイプを返します.関数ボディの戻りタイプは、関数が再帰的である場合に指定されます.Scalaコンパイラは=記号の右側の式のタイプから戻りタイプを推定することができる.
def abs(x:Double) = if (x >= 0) x else -x
def fac(n:Int) = {
var r =1
for (i <- 1 to n) r = r * i
r
}
//
def fac(n:Int):Int = if(n <= 0) 1 else n * fac(n-1)
// ,Scala n*fac(n-1) Int。
8.デフォルトパラメータと名前付きパラメータ
def decorate(str:String, left:String="[", right:String = "]") = left + str + right
パラメータleftとrightにはデフォルト値[和]が付いています.
decorate("Hello") => "[Hello]"
decorate("Hello","<<<",">>>")=>"<<<Hello>>>"
9.変長パラメータ
def sum(args:Int*)={
var result = 0
for (arg <- args) result += arg
result
}
val s = sum(1,4,9,16,25) // Seq , for 。
val s = sum(1 to 5) //
val s = sum(1 to 5:_*)// 1 to 5
再帰定義:
def recursiveSum(args:Int*):Int = {
if (args.length == 0) 0
else args.head+recursiveSum(args.tail:_*)
}
head ,tail , Seq, _* 。
10.プロセス
関数体が{}に含まれているが、前の=番号がない場合、戻りタイプはUnitです.このような関数をプロセス(procedure)と呼ぶ.
def box(s:String){//
var border = "-" * s.length + "--
"
println(border + "|" + s + "|
" + border)
}
Unit戻りタイプを明示的に定義することもできます.
def box (s:String):Unit = {
...
}
11.怠け者
最初に値を取得したときに初期化されます
lazy val words = scala.io.Source.fromFile(“/usr/share/dict/words”).mkString
12.異常
throw new IllegalArgumentException(「x should not be negative」)throw式には特別なタイプのNothingがあります.これはif/elseで役に立ちます.ブランチのタイプがNothingの場合、if/else式のタイプは別のブランチのタイプです.次のようになります.
if( x >= 0){
sqrt(x)
}else throw new IllegalArgumentException("x should not be negative")
// Double, Nothing, ,if/else Double。
例外を取得する構文は、パターンマッチングの構文を使用します.
try{
process(new URL("http://horstmann.com/fred-tiny.gif"))
}catch{
case _: MalformedURLException => println("Bad URL:" + url)
case ex:IOException => ex.printStackTrace()
}
より一般的な異常は、より具体的な異常の後にあるべきである.try/catch文は異常を処理し、try/finally文は異常が処理されていない場合に何らかの動作を実行します.