2、Scalaの制御構造と機能

1.条件式

if/else式のScala val s = if (x>0) 1 else -1この式は次と同等です:if(x>0) s = 1 else s = -1
Scalaでは、各式に型があります。
if (x>0) 1 else -1タイプはInt
式のタイプです②2つのタイプのパブリックブランチスーパータイプを混合します。たとえばif (x>0) "positive" else 1、そのタイプIntjava.lang.String共通のスーパータイプAny
③else部分が欠落している場合は、Unit代わりにクラスになります。たとえば、とif (x>0) 1同等、プレースホルダーとして理解if (x>o) 1 else ()できます。()「有用な値がない」の場合。

2.ステートメントの終了

①Useの;分離同じ行に複数の文を書く。
②When長い文を書いて、2行に分割は。必ず文の最後として使用することはできませんシンボルと最初の行が終了することを確認してください。例えば、合計でステートメント、行が+終了します。

3.ブロックの表現と割り当て

①ロジック​​ブランチやソウルリングに複数のアクションを配置する必要がある場合は、ブロックステートメントを使用できます{语句序列}ブロックの最後の式の値はブロックの値です。この機能では、値を初期化するために複数の手順が必要です。状況は非常に便利です。

val distance = {
    
    val dx = x-x0; val dy = y - y0; sqrt(dx * dx + dy * dy)}

このブロックの値は、最後の平方根の結果です。

②Scalaでは、代入アクション自体には値がなく、その値はUnit型であり、代入文で終わるブロックの値はUnit型です。例:{ r = r*n; n-=1}値のタイプはUnitです。
したがって、代入ステートメントをつなぎ合わせることができません。たとえばxの値をxにx = y = 1割り当てることy = 1Unit無意味に思えます。

4.入力と出力

①出力
文字列補間:
print (f"Hello, $name! In six months, you'll be ${age + 0.5}%7.2f years old.%n")
その中で:フォーマットされた文字列f文字で始まり、$先頭から始まる式は対応する変数に置き換えることができます。f補間器を使用すると、printfタイプセーフであるためメソッドを使用するよりも優れています。文字列補間器には3つのタイプがありますが、詳細には展開されていません。
入力このメソッドを
使用しscala.io.StdInreadLine、コンソールから入力行を読み取ることができます数字、ブール値、または文字を読みたい場合は、それを使用してくださいreadInt,readDouble,readBytes,readShort,readLong,readFloat,readBoolean,readCharそれらの中でのreadLine違いは、プロンプト文字列としてパラメータを受け取ることですStdIn.readLine("your name:")

5.ループ

while使用方法は他の言語と
変わらないfor違いが大きい:for (i <- 表达式)

for(i<- 1 to 10)
	r=r*i

var sum = 0
for(ch<-"hello")
	sum+=ch

③Scalaは、ループを終了するためのbreakおよびcontinueステートメントを提供していません。次の方法を使用できます。

  • ブール制御変数を使用する
  • 入れ子関数を使用する-関数に戻ることができます
  • Breaksオブジェクトでbreakメソッドを使用します
import scala.util.control.Breaks._
breakable{
    
    
	for(`````){
    
    
		if(````)break;//退出breakable块
		····
	}
}
但不建议使用这种机制,比较慢

6.高度なforループ

することができる变量<-表达式発電機の複数の形態で提供さ、それらはセミコロンで区切られ

for(i<-1 to 3; j<-1 to 3)
	·····
相当于双重循环,i为外循环,j为内循环

すべてのジェネレーターはガードを持参できます(ifの前にセミコロンがないことに注意してください)

for(i<-1 to 3; j<-1 to 3 if i!=j)
过滤掉i==j的情况

定義を使用することもできます

for(i<-1 to 3;from 4-i; j<-from to 3)

注:
forループの本体がでyield始まる場合、ループはセットを作成し、各反復でセットに値が生成されます。

for(i<-1 to 10) yield i%3
将交出一个vector(120120·····)

セミコロンの代わりに改行文字を使用できます

7.機能

def abs(x:Double) = if(x>=0) x else -x

上記の例に示すように、関数の名前、パラメーター、関数の本体を指定する必要があり、すべてのパラメーターの型を指定する必要があります。
関数が再帰的でない限り、必要ありません。戻り値のタイプを指定します。Scalaコンパイラーは、=の右辺の式から戻り値の型を推測できます。ただし、再帰関数の場合は、戻り値の型を指定する必要があります。

def fac(n:Int) :Int = if(n<=0) 1 else n*fac(n-1)

8.デフォルトパラメータと名前付きパラメータ

デフォルト値は他の言語と大差ありません。
パラメータを指定するときにパラメータ名を指定できます。

decorate(left = "<<<",str = "Hello",right = ">>>")

パラメータ名が指定されているため、パラメータの順序がパラメータリストと矛盾する可能性があります

9.可変長パラメーター

可変長パラメータリストを受け入れることができる関数を実装する

def sum(args :Int*){
    
    
	var result = 0
	for (arg<-args) result +=arg
	result
}

関数のパラメーターは任意の数です

val s = sum(1,4,5,6,6,6,6)

関数はタイプSeqのパラメーターを取得します

すでに値シーケンスがある場合、値シーケンスを関数に直接渡すことはできません。sum関数が呼び出されたときに渡されるパラメーターが単一のパラメーターである場合、パラメーターは整数範囲ではなく単一の整数である必要があります。val s = sum( 1 to 5) //是错误的正しい書き込み方法はval s = sum(1 to 5:_*)_*パラメーターのシーケンスに変換するために使用されます。

**注:**たとえばPrint Stream,Printf,MessageFormat.format可変長パラメーターを使用してJavaメソッドを呼び出し、パラメーターの型がObjectの場合、基本型を手動で変換する必要があります。

val str = MessageFormat.format("The answer to {0} is {1}",
"everything",42.asInstanceOf[AnyRef])

10.プロセス

戻り値のない関数には特別な表現方法があります。関数本体が{}で囲まれているが、前に=がない場合、戻り値の型はUnitであり、関数はプロセスと呼ばれます。 。

def box(s :String){
    
    
····
}

11.怠惰な価値

ときにval宣言されlazy、それが初期化され、我々はそれに価値を初めてまで遅延されます。

lazy介于val和def之间,val是被定义时就取值,而def是每次调用时取值
lazy val words = scala.io.Source.fromFile("").mkString

12.異常

Scalaには「チェックされた」例外はなく、関数やメソッドが何らかの例外をスローする可能性があることを宣言する必要はありません。よくわからないので詳しくは書きません。

おすすめ

転載: blog.csdn.net/Cxf2018/article/details/109406540