JSer、PHPerです。
初期値を整理するときなどに、
php
1// bが存在しないならcを初期値にする 2a = b? b: c;
というコードを使うと思うのですが、bが二回出てくるのを何とかして、スキっとさせることは可能でしょうか?
bが長ったらしい名前だったりすると結構悲惨です。
もしかすると基本かもしれませんが、よろしくお願いします。
また、Javascript、php以外の言語で、こんなのもあるよ、というのがあれば、そちらも参考のためにお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
php
1$a = $b ?: $c;
javascript
1a = b || c
ruby
1a = b || c
python
1a = b or c
投稿2016/03/09 13:29
編集2016/03/09 13:30総合スコア4516
0
質問文にあるとおり,「変数が存在するかどうか」 の確認ならisset
相当のチェックを行うべきですよね.
php
1$a = isset($b) ? $b : $c;
こんなときは,PHP7から実装されたコイツの出番です.
php
1$a = $b ?? $c;
PHP5では,$_GET
$_POST
$_COOKIE
に対しては一応 filter_input
という救済手段があります.
(PHP7でもfilter_var
は普通に使うかも)
なお,PHP以外の他の言語においては,isset
のようなエラー発生を回避するための仕組みが必要なことは稀です.
JavaScript (strictモード)
- 変数が同じ関数スコープにおいて条件分岐や書かれた場所に関わらず
var
宣言されている場合,
代入されていなくてもundefined
としてエラー無しに参照できる
(現在より下の行に書かれていてもOKになることは「巻き上げ」と呼ばれる) - 変数が同じブロックスコープ内の現在より上の行で
let
宣言されている場合,
代入されていなくてもundefined
としてエラー無しに参照できる
(let
ではvar
と違って巻き上げは起こらない) - プロパティが代入されていない場合,
undefined
としてエラー無しに参照できる
上記に該当しない場合は Reference Error
が発生します.
JavaScriptには変数が参照可能かどうかをエラーの発生なしに確認する手段はありません.
(グローバル変数を除く)
Ruby
- 変数が同じ関数スコープにおいて条件分岐に関わらず現在より上の行で代入する記述がある場合,
代入されていなくてもnil
としてエラー無しに参照できる
(RubyではJavaScriptのvar
のように巻き上げは起こらない)
上記に該当しない場合は Name Error
が発生します.
Rubyでは変数が参照可能かどうかを defined?
で確認出来ます.
(PHPのisset
のように頻繁に使われることはありません)
Pythonはちょっとわかりません,すいません
投稿2016/03/09 13:50
編集2016/03/09 19:32総合スコア5223
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/09 14:00
2016/03/09 14:10
2016/03/09 14:43 編集
2016/03/09 15:59 編集
2016/03/09 19:01
2016/03/09 19:23 編集
2016/03/10 00:26 編集
2016/03/10 04:56
2016/03/10 07:11 編集
2016/03/10 23:06 編集
2016/03/10 21:36 編集
0
明示しない限り、原則ショートサーキット(1番目を返す場合は、2番目は評価されない)です。
"0"
の扱いがPerl 5とPrel 6で異なります。
Perl
1# $b が 偽 なら 2# Perl 5 では 0, "0", "", (), undef の五つのみ 3# "0" が Perl 5 では偽になるが、Perl 6 では真になる。 4# Perl 6 では Bool 型への変換で False になるオブジェクト 5# False, 0, "", [], {}, Any, Nil, etc.. 6# 任意の型で何が偽であるかを定義できるため、無数に存在し得る。 7$a = $b || $c; 8# $b が 未定義なら 9# defined($b) が偽かどうかで判断する。 10# Perl 5 では undef かどうかになる。 11# Perl 6 では Any や Int などになり、Mu や Nil 等も未定義の一つに含まれる。 12# Perl 5 + use strict や Perl の場合、未宣言はエラーになる。 13$a = $b // $c;
未定義かどうかを判断することはできないようです。
Python
1# b が 偽 なら 2# __bool__() が False になるオブジェクト 3# False, 0, "", (), [], {}, None, etc... 4# 任意の型で何が偽であるかを定義できるため、無数に存在し得る。 5# 未定義はエラーになる。 6a = b or c
PHP 7から??
が追加されました。
PHP
1// $b が 偽 なら 2// boolean への変換で FALSE になるオブジェクト 3// 0, 0.0, "", "0", [], NULL, 空のSimpleXMLElement 4$a = $b ?: $c; 5// $b が 未定義 なら 6// PHP 7 からの機能 7// 未定義な変数は NULL であり、NULL かどうかの判断になる。 8$a = $b ?? $c;
変数の種類によって未定義の変数がどうなるかが異なります。
Ruby
1# b が 偽 なら 2# 偽は nil, false の二つのみ 3# グローバル変数、インスタンス変数、クラス変数が未定義の場合、 4# nil が定義されたものと見なされるため、未定義の場合という条件に使用できる。 5# ローカル変数や定数が未定義の場合は、エラーになる。 6a = b || c 7# しかし、||= の場合は、前段階の処理で定義済みとされるため、エラーにならない。 8a || = b 9# 上は下の糖衣構文 10a = a || b 11# 処理として、a が未定義の場合、始めに a が定義されたものと見なされ、 12# a には nil が入っているとし、偽であるから、b が a に代入される。
NaN
も偽になります。
JavaScript
1// b が 偽 なら 2// 偽は undefined, null, false, +0, -0, NaN, '' 3// 未定義は undefined が入るが、未宣言はエラーになる。 4a = b || c;
JavaScriptと違って未定義(未宣言)の場合も簡単に確認できるようになります。
CoffeeScript
1# b が 偽 なら 2# JavaScript の || と同じになるし、|| と書くこともできる。 3a = b or c 4# b が 未定義 または null または undefined なら 5# typeof を使用するため、エラーにならずに未定義か判断できる。 6a = b ? c
int?
などNullable型にすればプリミティブ型にも使えます。
C#
1// Nullable型: b が null なら 2a = b ?? c;
関数型言語はMabye型のようなものであれば、同じようにできます。<|>
は構文ではなく、中置演算子という関数の一種ですが、Haskellは遅延評価であるため、ショートサーキットになります。
Haskell
1--- Maybe型: b が Nothing なら 2a = b <|> c
もうひとつ関数型の例。Noneはnullとは異なる概念です。構文ではなく関数で構成されており、Scalaは正格評価であるため、ショートサーキットではありません。
Scala
1// b が null なら 2a = Option(b).getOrElse(c); 3// Option型: b が None なら 4a = b.orElse(c)
Java 8にはOptionalというのがあるらしいです。構文ではなく関数で構成されており、Javaは正格評価であるため、ショートサーキットではありません。
Java
1// b が null なら ※ Java 8 から 2a = java.util.Optinoal.ofNullable(b).orElse(c);
投稿2016/03/09 14:34
編集2016/03/11 15:25総合スコア21739
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
JavaScript なら ||
を使う方法がありますね。
JavaScript
1var a = b || c;
Re: Takahashi-Ei さん
投稿2016/03/09 13:26
総合スコア18189
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/09 13:49
2016/03/09 13:51
0
縮めてスッキリさせる方法が出尽くした感じなので、あえて便乗させてください。
逆説的ですが
やはり初期値を整理するときなどに、判定しまくりなら三項演算子をつなぎまくると、逆にスッキリって場合もありです。
a = b > 100 ? c : b > 10 ? d : b > 1 ? e : b ? f : a;
インデント頼りで芸がないですが、ifや、Switchより見やすく短いんで。
投稿2016/03/09 14:24
編集2016/03/09 14:29総合スコア105
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/09 14:32 編集
2016/03/09 14:31
2016/03/10 00:16 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/09 13:48
2016/03/10 00:25
2016/03/10 00:52
2016/03/10 02:40
2016/03/10 23:48 編集
2016/03/11 01:04
2016/03/11 11:27
2016/03/11 11:41