1. ホーム
  2. scala

[解決済み] Scalaのリターン

2022-03-17 23:39:11

質問

私はscalaの初心者のプログラマーですが、奇妙な動作に遭遇しました。

def balanceMain(elem: List[Char]): Boolean =
  {
    if (elem.isEmpty)
      if (count == 0)
        true;
      else false;

    if (elem.head == '(')
      balanceMain(elem.tail, open, count + 1);....

上記のように、基本的には elem.isEmptycount == 0 . そうでなければ、falseを返したい。

さて、上記で、scalaではreturn文を追加する必要はないと読みました。そこで、私は return 上記のように しかし、これはブール値を返しません。もし、returnステートメントを return true .完全に動作します。なぜでしょうか?

また、なぜscalaでreturn文があるのはバッドプラクティスだと考えられているのでしょうか?

どのように解決するのですか?

を省略すればいいというような単純なものではありません。 return キーワードを使用します。 Scalaでは、もし return の場合、最後の式が戻り値とみなされます。 したがって、最後の式が返したいものであれば return キーワードを使用します。 しかし、もしあなたが返したいものが ではなく という最後の式がある場合、Scala を返したかったことがわからなくなります。 .

一例です。

def f() = {
  if (something)
    "A"
  else
    "B"
}

ここでは、関数の最後の式である f はStringとして評価されるif/else式です。 明示的な return がマークされている場合、Scala はこの if/else 式の結果である String を返したかったのだと推測します。

では、次に の後に は、if/else 式です。

def f() = {
  if (something)
    "A"
  else
    "B"

  if (somethingElse)
    1
  else
    2
}

さて、最後の式はIntとして評価されるif/else式である。 したがって f はIntになります。 もし本当に文字列を返して欲しかったら、困ったことにScalaには ノーアイディア というのは、私たちの意図するところです。 したがって、Stringを変数に格納して2番目のif/else式の後で返すか、Stringの部分が最後になるように順序を変更することで修正する必要があります。

最後に return のようなネストされたif-else式でも、キーワードを使用することができます。

def f() = {
  if(somethingFirst) {
    if (something)      // Last expression of `if` returns a String
     "A"
    else
     "B"
  }
  else {
    if (somethingElse)
      1
    else
      2

    "C"                // Last expression of `else` returns a String
  }

}