2016-10-18 12 views
0

Scalaでは可変変数の使用を避けることをお勧めします。Scalaで可変なローカル変数を避けるには?

"Scalaのプログラミング、第2版"、52ページ: "Scalaでは、命令的なスタイルでプログラムすることができますが、より機能的なスタイルを採用することを奨励します。"そして後で "Scalaはvalに向かうことを奨励します。手元にある最高のツールを手に入れることができます」

どのように(変数に焦点を当てた)Scalaでは、この不可欠構築物は、エレガントな作ります:

var count = 0 
val foo = getRequest() 
if(foo.isJsonObject){ 
    count = doSomething(foo) 
} 
if(count>0){ 
    specialCall() 
} else{ 
    defaultCall() 
} 

何構築物またはパターン、あなたは機能的なスタイルに不可欠なスタイルであなたのコードを変換するために使用しますか? Optionクラスやその他の構文を使用していますか?

+0

ここで使用するパターンは、_expression orientation._です。したがって、通常、制御フロー操作( 'if'、' try'、 'match')は結果の値として評価される式としては考えられませんが、Scalaやその他同じような言語です。 – Yawar

答えて

4

ないあなたは十分なコンテキストを与えているかどうかわからが、何について:

val foo = getRequest() 
val count = if (foo.isJsonObject) doSomething(foo) else 0 
if (count > 0) { 
    specialCall() 
} else { 
    defaultCall() 
} 

通常、一般的にはScalaのAPI(コレクション、OptionTryFuture、など)とその操作(mapflatMapfilterfoldなど)を使用すると、ほとんどの必須の構造を非常に簡潔に表現できます。 ale64bit答え@

+0

私はそれがエレガントで簡潔なので、これが好きです。 – djondal

2

は結構ですが、あなたはこれを行うには多くの方法がありますが短い

val foo = getRequest() 
if (foo.isJsonObject && doSomething(foo)>0) 
    specialCall() 
else 
    defaultCall() 
1

をそれを表現することができます。

val count = Try(getRequest).filter(_.isJsonObject).map(doSomething).getOrElse(0) 

if (count > 0) { 
    specialCall() 
} else { 
    defaultCall() 
} 

if-else条件(パターンマッチングによる)を回避することもできますが、コードの可読性が低下する可能性があります。

関連する問題