前提
タイトルが曖昧でごめんなさい。
ちょっと日本語での説明が思いつかなかったのでJavaScriptのコードで説明させてください。
JavaScript
1//引数argはSymbolもしくは任意の文字列 2function myFunc(arg) { 3 if (typeof arg === "symbol") { 4 //Symbolを使った処理 5 } else if (Number.isInteger(+arg)) { 6 let i = +arg; 7 //引数の文字列を整数に変換した変数iを使った処理 8 } else { 9 //引数が整数に変換できない場合、文字列として処理 10 } 11}
上のコードの真ん中のelse ifブロックで、条件判定のときに単項プラス演算子で引数を数値型に変換しているのですが、ブロック内の処理でも引数を整数にしたものが必要になるので再度単項プラス演算子で変換をしています。
ここで、同じ変換を二回もしているのが無駄だなあと感じました。
そうかといって、
JavaScript
1function myFunc(arg) { 2 let i = +arg; 3 if (typeof arg === "symbol") { 4//(後略)
のように冒頭で変換しておくようにすると、引数がSymbolだった場合は変換できずエラーになります。
Symbolを避けて、
JavaScript
1function myFunc(arg) { 2 if (typeof arg === "symbol") { 3 //Symbolを使った処理 4 } else { 5 let i = +arg; 6 if (Number.isInteger(i)) { 7 //引数を整数に変換した変数iを使った処理 8 } else { 9 //引数が整数に変換できない場合、文字列として処理 10 } 11 } 12}
のようにするとエラーも変換の二度手間も省けるのですが、
「内側のelseではiは使わないから、iのスコープは内側のifだけでいいんだけどなあ」と細かいことが気になってしまいました。
実現したいこと
こういった場合に、
- 型変換は一回だけ行う。
- 変換した変数のスコープは、実際に使うブロック(一番上のコードでは真ん中のelse ifブロック)に抑える。
という条件を満たしたコードは書けるでしょうか。
こうすれば書けるよ!という方法があれば教えていただきたいです。
また、そんなコードは書けないということならその旨を教えていただけると嬉しいです。
そもそも関数myFuncの設計自体が無茶という点には目をつぶっていただけると幸いです。できないならできないということで理解しますので…
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/19 08:32
2021/02/19 08:37
2021/02/19 08:41
2021/02/19 08:45
2021/02/19 09:18