Scalaの研究ノート(VI):関数

1.最も一般的な方法は、オブジェクトのメンバー関数として定義され、そのような機能が呼び出されるメソッド

 

2.ローカル関数またはローカル関数 - 関数定義の他の機能に

ローカル関数とローカル変数のスコープのスコープ

関数のローカル関数のパラメータを訪問するネストされた関数の一般的な使用であります

インポートscala.io.Source 
オブジェクトロングライン{ 
  DEF processFile(ファイル名:文字列、幅:INT){ 
    DEF processLine(行:列){ 
     場合(line.length> 幅)
       のprintln(ファイル名 + ":" + line.trim)
   } 
    ヴァルソース = Source.fromFile(ファイル名)
     のための - (ライン< source.getLines())
      processLine(ライン)
   } 
}

 

3. Nameパラメータ - 指定したパラメータ名

通常の状況下では、一回の着信関数のパラメータと関数定義の引数リスト。

スカラ> DEF速度(距離:フロート、時間:フロート):フロート=距離/ 時間の
速度(距離:フロート、時間:FLOAT)フロート
スカラ>速度(100,10 
RES0:フロート= 10.0

名前付きパラメータは任意の順序で渡されたパラメータを可能に

スカラ>速度(時間= 10、距離= 100 
RES1:フロート= 10.0

 

4.デフォルトパラメータ

スカラそれによって関数が呼び出される可能、指定されたパラメータのデフォルト値を可能にする機能を定義するパラメータを指定し、デフォルト値を使用しなくてもよいです。

デフォルトパラメータは、名前付きパラメータを使用して通常、

スカラ> DEF printTime(アウト:に、java.io.PrintStream = Console.out、除数ます。int = 1)= 
     | out.printlnを( "時間=" +にSystem.currentTimeMillis()/ 除数)
printTime:(アウト:に、java.io.PrintStream、除数:INT)ユニット
Scalaは> 時間()印刷
時間を= 1383220409463 
スカラ>時間を印刷(除数= 1000 )、
時間= 1383220422

 

5.可変引数

Scalaは1つのパラメータは、それによって機能を呼び出すために、可変引数リストを使用して、関数の呼び出し元を可能にする関数を定義する最後の反復(可変長パラメータ)を指定することができ

Scalaの「*」を使用すると、パラメータは、パラメータの繰り返しであることを示しています

例えば:

デフエコー(引数:文字列*)= 
  について(引数<-args)のprintln(引数)
(「ここ」)エコー
エコー(「ここ」、「そこ」)

型可変長パラメータはアレイであります

アレイの実際の実施形態の種類に文字列* [文字列]、この関数に渡された直接配列型パラメータ場合は、コンパイラは文句であろう

 

これを避けるために、あなたは変数の後に追加することができます_ *

このシンボルは、パラメータを渡すために渡された配列の各要素に対して個別Scalaのコンパイラに指示します

 

6.関数のパラメータ

DEF filesMatching(クエリ:文字列マッチャ:(文字列、文字列)=>ブール)= { 
    ため(ファイル< - filesHere、もし整合(file.getName、クエリ))
      収率ファイル
}

第二パラメータ整合本明細書filesMatching関数は関数であり、これは、任意の型String [二つのパラメータ、及びタイプブール関数の戻り値を】一致します

したがって、上述した機能は、共通の一例として機能することができます。

DEF filesEnding(クエリ:文字列)= 
   filesMatching(クエリ、_.endsWith(_))
DEF filesContaining(クエリ:文字列)= 
   filesMatching(クエリ、_.contains(_))

 

拡張:

クロージャの使用は、上記のコードをさらに簡略化することができます

オブジェクトFileMatcher { 
  プライベートデフfilesHere =(新java.io.Fileの( "" ))LISTFILES。

  filesMatching DEF:(マッチャ(文字列)=>ブール)= { 
    (ファイル<用- filesHere;もしマッチャ(file.getName) ) 収率ファイル } 
 DEF filesEnding:(クエリ文字列)=  。filesMatching(_ endsWith(クエリ))
 filesContaining DEF(クエリ:String)を= 。filesMatching(_(クエリを含む))filesRegex DEF(クエリ:文字列)= filesMatching(_。マッチ(クエリ))}

 

7.末尾再帰

最後の行がある場合、関数は末尾再帰と呼ばれ、この再帰を置くために、自分自身を呼び出します

Scalaのコンパイラは最適化を行います、尾再帰を検出し、ひいては代わりにループを使用することができます

 

、この最適化をキャンセルするnotailcalls例外がスローされた場合、その後、末尾再帰呼び出しスタックは、マルチレイヤ表示されます:あなたはscalacコンパイラパラメータ-gを追加することができます

 

8.関数リテラル

書かれた匿名関数リテラル

(X:INT)=> X +1

=>記号上記の例では、シンボルの左から右に何か何かにその機能の変換シンボルを示し

 

あなたは、他の変数に割り当てられた別の関数または値への転送などの例を使用することができます:

VaRの増加=(X:INT)=> X +1 
増加する( 10)

 

多くのライブラリと次のように、このようなフィルタforeachの方法または方法のようなパラメータの関数として、スカラを可能にします。

args.foreach((X:INT)=>のprintln(X))
ヴァル数=リスト(-1、-12、5、0、-5、1 
numbers.filter(X => X> 0)

 

注:リテラル関数(X:INT)=> X + 1 Scalaは、内部機能1のパラメータとオブジェクト・クラスとして表さ

N FunctionN関数は、パラメータなしFunction0代表引数を関数を表します

 

関数定義は、複数のステートメントを必要とする場合、{}を使用することができる、など。

VaRの増加=(X:INT)=> { 
  のprintln( "私達" 
  のprintln( "ある" 
  のprintln( "ここ" 
  X + 1 
}

 

短い関数リテラルをフォーマット

パラメータは、コンパイラはScalaのパラメータ・タイプを推測することができ、関数定義の中で一度だけ表示された場合にScalaは、代わりに、1つのまたは複数のパラメータの「プレースホルダ」またはアンダースコア(「_」)を許可しました

ヴァル数=リスト(-11、-10、 - 5、0、5、10 
numbers.filter(_ > 0)

 

次のコードのパラメータは_のタイプを指定する必要があります

ヴァルF =(_:INT)+ (_:INT)
F( 1,2)

 

9.一部のアプリケーション機能

スカラ座では、関数を呼び出す際に、必要なパラメータを渡して、関数は、パラメータに「適用」することです。

アプリケーション機能手段の一部:関数を呼び出すときは、これに新しい機能を作成し、機能に必要なすべてのパラメータを指定していないが、この新しい機能は、元の関数の部分的なアプリケーション機能と呼ばれています

DEF合計=(_:INT)+(_:INT)+(_:INT)

これらのコードに応じて、固定された第一及び第三のパラメータ

スカラ>ヴァルB =合計(1、_:INT、3 
B:のInt =>のInt = <関数1> 
スカラ > B(2 
RES1:のInt = 6

その第一及び第三のパラメータの合計によって適用されるタイプの機能1変数B(パラメータの関数)。

コールB(2)は、実際には(1,2,3)の和と呼ばれています。

 

実際には、いくつかのケースでは、あなたはリスト全体の代わりに「_」を使用することができます

numbers.foreach(のprintln _)

 

Scalaで、アプリケーション機能の定義された部分であれば、すべてのパラメータを省略することができ、アンダースコア「_」が省略されています

numbers.foreach(のprintln)

 

10.「カリー化」

技術は、パラメータリストの複数を使用して変換の関数としてパラメータのリストの本来の機能を使用することができ、「カレー」を使用してください

スカラ> DEF plainOldSum(X:INT、Y:INT)= X + Y 
plainOldSum:(X:INT、Y:INT)のInt
スカラ> plainOldSum(1,2 
RES0ます。int = 3

変換:二つのリストにパラメータパラメータリスト、パラメータを含む各リスト

スカラ> DEF curriedSum(X:INT)(Y:INT)= X + Y 
curriedSum:(X:INT)(Y:INT)のInt

次のようにこの関数は2つの引数リスト、コールを取ります。

スカラ> curriedSum(1)(2 
RES0ます。int = 3

curriedSumを呼び出すとき(1)(2)の場合、実際には、2つの通常の関数コールを順次、関数型の第1の呼パラメータと戻り値Xは、第2の呼の関数値は、パラメータyを返さ

 

スカラ>ヴァルonePlus = curriedSum(1 )_ 
onePlusます。int =>のInt = <関数1>

二番目のパラメータリストのプレースホルダとして、アンダースコア(「_」)

スカラ> onePlus(2 
RES2:のInt = 3

 

11。

)Scalaで、唯一つのパラメータの関数ではなく({}を使用することができる場合

Scalaの>のprintln( "こんにちは、世界" 
こんにちは、世界
スカラ> printlnを{ "こんにちは、世界" } 
こんにちは、世界

 

関数は、2つのパラメータを使用している場合、(){}で置換することができません

デフwithPrintWriter(ファイル:ファイル、OP:のPrintWriter => 単位){ 
  valのライター = 新しいPrintWriterの(ファイル)
   のtry { 
    OP(作家)
  } 最後に{ 
    writer.close()
  } 
}

 

あなたが再定義された機能を「カリー化」を使用する場合でも、そのようなAの可能性があります

輸入scala.io._
 インポートjava.io._ 
デフwithPrintWriter(ファイル:ファイル)(OP:PrintWriterの => 単位){ 
  valのライター = 新しいPrintWriterの(ファイル)
   のtry { 
    OP(作家)
  } 最後に{ 
    writer.close()
  } 
}

コール:

ヴァルファイル= 新しいファイル( "date.txt" 
withPrintWriter(ファイル){ 
  ライター => writer.println(新しいjava.util.Date)
 }

組み込みながら文法コード上に書き込まなど、場合Scalaで類似しています

もし(X> Y){ 
  X + = 1 
}

 

12.操作が最適化のために繰り返されます

スカラ> DEF倍(OP:ダブル=>ダブル、X:ダブル)= OP(OP(x))を
二回:(OP:ダブル =>ダブル、X:ダブル)ダブル
Scalaの>を2回(_ + 1、5 
RES0:ダブル = 7.0

 

名前13.パラメータ

 

おすすめ

転載: www.cnblogs.com/studyLog-share/p/4788310.html