[解決済み】Scalaの名前による呼び出しと値による呼び出し、明確化の必要性
2022-04-16 12:29:17
質問
私の理解では、Scalaでは、関数は次のどちらかを呼び出すことができます。
- 値によって、または
- 名前別
例えば、次のような宣言があったとして、その関数がどのように呼び出されるかがわかるでしょうか。
宣言してください。
def f (x:Int, y:Int) = x;
コール
f (1,2)
f (23+55,5)
f (12+3, 44*11)
ルールを教えてください。
解決方法は?
あなたが挙げた例はcall-by-valueを使用しているだけなので、違いを示す新しい、より単純な例を挙げます。
まず、副作用のある関数があるとします。 この関数は何かをプリントアウトして
Int
.
def something() = {
println("calling something")
1 // return value
}
を受け取る関数を2つ定義します。
Int
の引数は、一方がコール・バイ・バリュー方式で引数を取る以外は全く同じものです (
x: Int
)、もう一方は名前による呼び出しスタイル(
x: => Int
).
def callByValue(x: Int) = {
println("x1=" + x)
println("x2=" + x)
}
def callByName(x: => Int) = {
println("x1=" + x)
println("x2=" + x)
}
では、副作用のある関数でそれらを呼び出すとどうなるでしょうか。
scala> callByValue(something())
calling something
x1=1
x2=1
scala> callByName(something())
calling something
x1=1
calling something
x2=1
つまり、call-by-valueバージョンでは、渡された関数呼び出しの副作用(
something()
) は一度だけ発生しました。 しかし、call-by-nameバージョンでは、副作用は2回起こりました。
これは、コール・バイ・バリュー関数が、渡された式の値を計算してから関数を呼び出すためで、そのため 同じ の値が毎回アクセスされる。 その代わり、名前による呼び出し関数 再計算 は、渡された式の値がアクセスされるたびに、その値を変更します。
関連
-
[解決済み] スパークSPLラウンド&ブラウンド
-
[解決済み] Scala: スライド(N,N) vs グループ化(N)
-
[解決済み] scala.Float to java.Float k/v変換でScala MapをJava Mapに変換するにはどうしたらいいですか?
-
[解決済み] MapのmapValuesとtransformの違いについて
-
[解決済み] Scalaのオブジェクトとクラスの違い
-
[解決済み】Scalaの記号演算子にはどんな意味があるの?
-
[解決済み】Scalaのvarとvalの定義の違いは何ですか?
-
[解決済み】Scalaのコンテキストとビューバウンドとは何ですか?
-
[解決済み】ScalaのJavaConvertersとJavaConversionsの違いは何ですか?
-
[解決済み] Scalaの識別子 "implicitly "とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 実行時に変数の型を取得したい
-
[解決済み] Spark - Sparkでパーセンタイルを計算する方法は?
-
[解決済み] A の値をキーとして Seq[A] を Map[Int, A] に変換する方法は?
-
[解決済み] Scalaで定期的に関数を実行する
-
[解決済み] SparkSQL - パーケットファイルを直接読み込む
-
[解決済み】タスクがシリアライズされない:オブジェクトではなくクラスに対してのみクロージャの外で関数を呼び出すとjava.io.NotSerializableExceptionが発生する
-
[解決済み】良いスカラズの紹介【終了しました
-
[解決済み】Scala 2.8における<:<、<%<、=:=の意味と、それらのドキュメントはどこにあるのか?
-
[解決済み] 2つのマップをマージし、同じキーの値を合計するための最良の方法?
-
[解決済み] Scalaで環境変数を読み込む方法