0

Possible Duplicate:
Can anyone explain how the symbol “=>” is used in Scala

val list = List("abc", "cde", "fg")
list.count (s => s.length == 3)

The above code snippet returns the number of string elements in list whose length is equal to 3. But I'm not able to understand the snippet as I'm having trouble to grasp the usage of the => operator in this context. Any explanation will be realy helpful.

4

3 に答える 3

2

ええ、Scalaはかなり理解しにくいかもしれません。私もそれを正しく理解できないかもしれませんが、私はそれを説明するために最善を尽くします。

このメソッドは、ブール値を返すコードのList.countaをパラメーターとして受け取ります。block

ブロックはコードのほんの一部であり、コードをで囲むなど、さまざまな方法で作成できます。{ }

Scalaのドキュメントでは、これは次のように説明されています

def count (p : (A) => Boolean) : Int

したがって、型の引数を取り、を返すブロックでcountあるパラメータを取りますpABoolean

したがって、この例では:

s => s.length == 3

blockコードのです。ブロックは通常、次の形式に従います

[arguments] => [Code to execute]

したがって、この場合sはブロックへの入力でありs.length == 3、ブール値を返す必要があるコードです。引数は、正しい順序である限り、好きな名前を付けることができます。

コレクションを反復処理するメソッド(たとえば、、、など)を使用する場合、count渡さmapれるeach引数は、反復処理するコレクション内の現在のアイテムになります。

それについてもっと知りたい場合は、私のMartin Odersky(scalaの作成者)が実行しているCourseraコースをチェックしてください。このような詳細については、https ://www.coursera.org/courseで詳しく説明します。 / progfun

于 2012-09-21T12:08:34.637 に答える
1

これはメソッドを定義するだけで、次のように表示することもできます。

def isValid(s:String) = s.length ==3
list.count(isValid)

したがって、count関数を使用するときは、引数としての関数である条件を指定します。

于 2012-09-21T12:04:03.393 に答える
1

(あなたが別の(言い換えた)質問を投稿したのを見ませんでした。これがあなたの最初の質問に答えたものです)

値/名前を渡すだけでなく=>、関数リテラルを定義するために使用されます。これは、関数を定義するために使用される代替構文です。

時間の例。別の関数を取り込む関数があるとしましょう。コレクションはそれらでいっぱいですが、私たちは選びfilterます。filter、コレクション(リストなど)で使用すると、指定した関数がfalseを返す原因となる要素がすべて削除されます。

val people = List("Bill Nye", "Mister Rogers", "Mohandas Karamchand Gandhi", "Jesus", "Superman", "The newspaper guy")
// Let's only grab people who have short names (less than 10 characters)
val shortNamedPeople = people.filter(<a function>)

実際の関数を別の場所(おそらく)から渡すこともできますが、その場所def isShortName(name: String): Booleanに配置する方がよいでしょう。残念ながら、関数リテラルを使用できます。

val shortNamedPeople = people.filter( name => name.length < 10 )

ここで行ったことは、文字列(people型であるためList[String])を受け取り、ブール値を返す関数を作成することです。かなりかっこいいですよね?

この構文は、多くのコンテキストで使用されます。別の関数を取り込む関数を作成するとします。この他の関数は文字列を受け取り、別の文字列を返す必要があります。

def myFunction(f: String => Int): Int = {
  val myString = "Hello!"
  f(myString)
}
// And let's use it. First way:
def anotherFunction(a: String): Int = {
  a.length
}
myFunction(anotherFunction)
// Second way:
myFunction((a: String) => a.length)

それが関数リテラルです。に戻ってby-nameby-value必要になるまでパラメータを強制的に評価しないようにするトリックがあります。古典的な例:

def logger(message: String) = {
  if(loggingActivated) println(message)
}

これは問題ないように見えますが、が呼び出さmessageれたときに実際に評価されます。評価に時間がかかるlogger場合はどうなりますか?messageたとえばlogger(veryLongProcess())、ここで、veryLongProcess()は文字列を返します。おっと?あまり。関数リテラルに関する知識を使用して、veryLongProcess()実際に必要になるまで呼び出されないようにすることができます。

def logger(message: => String) = {
  if(loggingActivated) println(message)
}
logger(veryLongProcess()) // Fixed!

logger現在、パラメータをとらない関数を取り入れています(したがって、=>左側が裸になっています)。以前と同じように使用できますが、現在messageは(で)使用された場合にのみ評価されprintlnます。

于 2012-09-21T12:10:59.680 に答える