3

Scala には名前付き引数とデフォルト引数と呼ばれる機能が含まれていると聞きましたが、そのようなパラメーターが何をするのか、どのように使用するのかわかりません。

誰かがその使用法を説明できますか?

4

2 に答える 2

5

Scala のいくつかの特殊関数呼び出し型

名前付き引数:

名前付き引数を使用すると、引数を別の順序で関数に渡すことができます。次に例を示します。

def speed(distance: Float, time: Float): Float = distance / time

そして、次のように使用できます。

speed(distance = 100, time = 10)

また

speed(time = 10, distance = 100)

デフォルトの引数:

Scala では、関数パラメーターのデフォルト値を指定できます。例えば:

def printTime(out: java.io.PrintStream = Console.out) =
    out.println("time = "+ System.currentTimeMillis())

次に、次のような出力ストリームを指定せずに printTime を呼び出すことができます。

printTime()

繰り返される引数:

Scala では、関数の最後のパラメーターが繰り返される可能性があることを示すことができます。例えば:

def echo(args: String*) =
   for (arg <- args)
     println(arg)

次に、次のように使用できます。

echo()
echo("one")
echo("hello", "world!")
于 2013-05-06T04:06:41.093 に答える
1

デフォルト引数は、他のプログラミング言語が通常メソッドのオーバーロードで解決する問題を解決します。方法がある場合

def addNumbers(a: Int, b: Int, c: Int, d: Int) = a+b+c+d

複数のパラメーターを受け取る場合、オーバーロードされたメソッドにいくつかのデフォルト値を設定して、すべてのパラメーターを埋めたくない場合に使いやすい API を提供すると便利です。

def addNumbers(a: Int, b: Int, c: Int) = addNumbers(a, b, c, 0)
def addNumbers(a: Int, b: Int) = addNumbers(a, b, 0, 0)

デフォルトの引数を使用すると、そのようなメソッドをオーバーロードする必要がなくなりました。

def addNumbers(a: Int, b: Int, c: Int = 0, d: Int = 0) = a+b+c+d

指定されていない場合、コンパイラは特定の既定の引数を使用してメソッドを自動的に呼び出します。

scala> addNumbers(1, 2, 3)
res2: Int = 6

デフォルト引数の便利な場所は、コンストラクターです。書きやすくなりました

class A(i: Int, s: String = "")

よりも

class A(i: Int, s: String) {
  def this(i: Int) = this(i, "")
}

反対側の名前付き引数は、メソッド呼び出しの可読性を向上させることができます:

def compute(xs: List[Int], executeInParallel: Boolean) = ???

compute(xs, executeInParallel = true)だけよりも読みやすいcompute(xs, true)

順序に関係なく、いつでもパラメーターの名前を指定できます。compute(executeInParallel = true, xs = xs)と同じ意味ですcompute(xs, true)。多くの場合、コンパイラは、パラメーターの順序が変更されたときに、どのパラメーターをどの位置に配置する必要があるかというヒントを必要とします。


名前付き引数とデフォルト引数の両方を使用できるユース ケースは、コンパイラによって自動的に生成されるケース クラスのコピー メソッドにあります。

scala> case class Person(name: String, age: Int)
defined class Person

scala> val p = Person("Ruben", 43)
p: Person = Person(Ruben,43)

scala> val oneYearOlder = p.copy(age = p.age+1)
oneYearOlder: Person = Person(Ruben,44)

名前付き引数は Scala で定義されたメソッドに対してのみ機能することに注意してください。Java で定義されたメソッドのパラメーターは、その名前で呼び出すことはできません。

さらに、名前付き引数は関数リテラルでは機能しません:

scala> val f = (i: Int) => i
f: Int => Int = <function1>

scala> f(i = 1)
<console>:9: error: not found: value i
              f(i = 1)
                ^

この機能の詳細については、docs.scala-lang.orgを参照してください。

于 2013-05-06T02:01:17.790 に答える