1. ホーム
  2. scala

[解決済み] パターンマッチと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を使うことでコードの明確さが大きく向上するのであれば、どうぞ(ただし、パフォーマンスが重要であることが分かっていて、その違いを比較したいような稀なケースは除きます)。