[解決済み] パターンマッチとif-elseの比較
2023-06-29 17:42:26
質問
私はScalaの初心者です。最近、趣味のアプリを書いていて、多くのケースでif-elseの代わりにパターンマッチングを使おうとしている自分に気づきました。
user.password == enteredPassword match {
case true => println("User is authenticated")
case false => println("Entered password is invalid")
}
の代わりに
if(user.password == enteredPassword)
println("User is authenticated")
else
println("Entered password is invalid")
これらのアプローチは同等なのでしょうか?何らかの理由で、どちらかが他よりも望ましいのでしょうか?
どのように解決するのですか?
class MatchVsIf {
def i(b: Boolean) = if (b) 5 else 4
def m(b: Boolean) = b match { case true => 5; case false => 4 }
}
長くて不格好な2番目のバージョンを使う理由がよくわからない。
scala> :javap -cp MatchVsIf
Compiled from "<console>"
public class MatchVsIf extends java.lang.Object implements scala.ScalaObject{
public int i(boolean);
Code:
0: iload_1
1: ifeq 8
4: iconst_5
5: goto 9
8: iconst_4
9: ireturn
public int m(boolean);
Code:
0: iload_1
1: istore_2
2: iload_2
3: iconst_1
4: if_icmpne 11
7: iconst_5
8: goto 17
11: iload_2
12: iconst_0
13: if_icmpne 18
16: iconst_4
17: ireturn
18: new #14; //class scala/MatchError
21: dup
22: iload_2
23: invokestatic #20; //Method scala/runtime/BoxesRunTime.boxToBoolean:(Z)Ljava/lang/Boolean;
26: invokespecial #24; //Method scala/MatchError."<init>":(Ljava/lang/Object;)V
29: athrow
そして、これはマッチのためのバイトコードも多くなっています。 それは
かなり
それでも効率的ですが (マッチがエラーを投げない限りボクシングは起こりません。ここでは起こりえません)、 コンパクトさとパフォーマンスのために、より好ましくは
if
/
else
. しかし、matchを使うことでコードの明確さが大きく向上するのであれば、どうぞ(ただし、パフォーマンスが重要であることが分かっていて、その違いを比較したいような稀なケースは除きます)。
関連
-
[解決済み] Scalaのパターンマッチングシステムで比較演算子を使う
-
[解決済み] RDDの内容を印刷するには?
-
[解決済み] Scalaのパターンマッチはなぜ変数で機能しないのですか?
-
[解決済み] Scalaのリストを作成するための好ましい方法
-
[解決済み] 単純な case class の順序を定義する簡単な慣用的方法
-
[解決済み] Any、AnyVal、AnyRef、Objectの関係と、Javaコードでのマッピングについて教えてください。
-
[解決済み] scala で複数の case class をマッチングさせる
-
[解決済み] タイプダイナミックの仕組みと使い方を教えてください。
-
[解決済み] Scalaを使用したJoda Timeのクラスブロークンエラー
-
[解決済み] 複数の先物を待つには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] RDDの内容を印刷するには?
-
[解決済み] 依存するメソッドタイプの説得力のある使用例とは?
-
[解決済み] 機能的デザインパターン【終了しました
-
[解決済み] Scalaでサブアレイを取得する正しい方法は何ですか?
-
[解決済み] SBTのrunアクションでアプリケーションを実行するために、JVMの最大ヒープサイズを"-Xmx "で指定する方法は?
-
[解決済み] 関数型プログラミング(特にScalaとScala API)におけるreduceとfoldLeft/foldの違いとは?
-
[解決済み] に似た三項演算子。
-
[解決済み] Scalaで関数を定義する3つの方法の違い
-
[解決済み] scalaのマップを反復処理するには?
-
[解決済み] Map操作におけるタプルのアンパッキング