回答編集履歴
3
Perl5にも//はあった。
answer
CHANGED
@@ -1,26 +1,100 @@
|
|
1
|
+
明示しない限り、原則ショートサーキット(1番目を返す場合は、2番目は**評価されない**)です。
|
2
|
+
|
3
|
+
`"0"`の扱いがPerl 5とPrel 6で異なります。
|
4
|
+
```Perl
|
5
|
+
# $b が 偽 なら
|
6
|
+
# Perl 5 では 0, "0", "", (), undef の五つのみ
|
7
|
+
# "0" が Perl 5 では偽になるが、Perl 6 では真になる。
|
8
|
+
# Perl 6 では Bool 型への変換で False になるオブジェクト
|
9
|
+
# False, 0, "", [], {}, Any, Nil, etc..
|
10
|
+
# 任意の型で何が偽であるかを定義できるため、無数に存在し得る。
|
11
|
+
$a = $b || $c;
|
12
|
+
# $b が 未定義なら
|
13
|
+
# defined($b) が偽かどうかで判断する。
|
14
|
+
# Perl 5 では undef かどうかになる。
|
15
|
+
# Perl 6 では Any や Int などになり、Mu や Nil 等も未定義の一つに含まれる。
|
16
|
+
# Perl 5 + use strict や Perl の場合、未宣言はエラーになる。
|
17
|
+
$a = $b // $c;
|
18
|
+
```
|
19
|
+
|
20
|
+
未定義かどうかを判断することはできないようです。
|
21
|
+
```Python
|
22
|
+
# b が 偽 なら
|
23
|
+
# __bool__() が False になるオブジェクト
|
24
|
+
# False, 0, "", (), [], {}, None, etc...
|
25
|
+
# 任意の型で何が偽であるかを定義できるため、無数に存在し得る。
|
26
|
+
# 未定義はエラーになる。
|
27
|
+
a = b or c
|
28
|
+
```
|
29
|
+
|
30
|
+
PHP 7から`??`が追加されました。
|
1
31
|
```PHP
|
2
|
-
//
|
32
|
+
// $b が 偽 なら
|
33
|
+
// boolean への変換で FALSE になるオブジェクト
|
34
|
+
// 0, 0.0, "", "0", [], NULL, 空のSimpleXMLElement
|
35
|
+
$a = $b ?: $c;
|
3
|
-
// $b が
|
36
|
+
// $b が 未定義 なら
|
37
|
+
// PHP 7 からの機能
|
38
|
+
// 未定義な変数は NULL であり、NULL かどうかの判断になる。
|
4
39
|
$a = $b ?? $c;
|
5
40
|
```
|
41
|
+
|
42
|
+
変数の種類によって未定義の変数がどうなるかが異なります。
|
6
|
-
```
|
43
|
+
```Ruby
|
7
|
-
#
|
44
|
+
# b が 偽 なら
|
8
|
-
# $b が 未定義(Any) なら
|
9
|
-
|
45
|
+
# 偽は nil, false の二つのみ
|
46
|
+
# グローバル変数、インスタンス変数、クラス変数が未定義の場合、
|
47
|
+
# nil が定義されたものと見なされるため、未定義の場合という条件に使用できる。
|
48
|
+
# ローカル変数や定数が未定義の場合は、エラーになる。
|
49
|
+
a = b || c
|
50
|
+
# しかし、||= の場合は、前段階の処理で定義済みとされるため、エラーにならない。
|
51
|
+
a || = b
|
52
|
+
# 上は下の糖衣構文
|
53
|
+
a = a || b
|
54
|
+
# 処理として、a が未定義の場合、始めに a が定義されたものと見なされ、
|
55
|
+
# a には nil が入っているとし、偽であるから、b が a に代入される。
|
10
56
|
```
|
57
|
+
|
58
|
+
`NaN`も偽になります。
|
59
|
+
```JavaScript
|
60
|
+
// b が 偽 なら
|
61
|
+
// 偽は undefined, null, false, +0, -0, NaN, ''
|
62
|
+
// 未定義は undefined が入るが、未宣言はエラーになる。
|
63
|
+
a = b || c;
|
64
|
+
```
|
65
|
+
|
66
|
+
JavaScriptと違って未定義(未宣言)の場合も簡単に確認できるようになります。
|
11
67
|
```CoffeeScript
|
68
|
+
# b が 偽 なら
|
69
|
+
# JavaScript の || と同じになるし、|| と書くこともできる。
|
70
|
+
a = b or c
|
12
|
-
# b が null または undefined なら
|
71
|
+
# b が 未定義 または null または undefined なら
|
72
|
+
# typeof を使用するため、エラーにならずに未定義か判断できる。
|
13
73
|
a = b ? c
|
14
74
|
```
|
75
|
+
|
76
|
+
`int?`などNullable型にすればプリミティブ型にも使えます。
|
15
77
|
```C#
|
16
78
|
// Nullable型: b が null なら
|
17
79
|
a = b ?? c;
|
18
80
|
```
|
81
|
+
|
82
|
+
関数型言語はMabye型のようなものであれば、同じようにできます。`<|>`は構文ではなく、中置演算子という**関数**の一種ですが、Haskellは遅延評価であるため、ショートサーキットになります。
|
19
83
|
```Haskell
|
20
84
|
--- Maybe型: b が Nothing なら
|
21
85
|
a = b <|> c
|
22
86
|
```
|
87
|
+
|
88
|
+
もうひとつ関数型の例。Noneはnullとは異なる概念です。構文ではなく関数で構成されており、Scalaは正格評価であるため、**ショートサーキットではありません**。
|
23
89
|
```Scala
|
90
|
+
// b が null なら
|
91
|
+
a = Option(b).getOrElse(c);
|
24
92
|
// Option型: b が None なら
|
25
93
|
a = b.orElse(c)
|
94
|
+
```
|
95
|
+
|
96
|
+
Java 8にはOptionalというのがあるらしいです。構文ではなく関数で構成されており、Javaは正格評価であるため、**ショートサーキットではありません**。
|
97
|
+
```Java
|
98
|
+
// b が null なら ※ Java 8 から
|
99
|
+
a = java.util.Optinoal.ofNullable(b).orElse(c);
|
26
100
|
```
|
2
Nullable・・・
answer
CHANGED
@@ -13,7 +13,7 @@
|
|
13
13
|
a = b ? c
|
14
14
|
```
|
15
15
|
```C#
|
16
|
-
//
|
16
|
+
// Nullable型: b が null なら
|
17
17
|
a = b ?? c;
|
18
18
|
```
|
19
19
|
```Haskell
|
1
C#、Haskell、Sacalaを追加
answer
CHANGED
@@ -11,4 +11,16 @@
|
|
11
11
|
```CoffeeScript
|
12
12
|
# b が null または undefined なら
|
13
13
|
a = b ? c
|
14
|
+
```
|
15
|
+
```C#
|
16
|
+
// Nullabe型: b が null なら
|
17
|
+
a = b ?? c;
|
18
|
+
```
|
19
|
+
```Haskell
|
20
|
+
--- Maybe型: b が Nothing なら
|
21
|
+
a = b <|> c
|
22
|
+
```
|
23
|
+
```Scala
|
24
|
+
// Option型: b が None なら
|
25
|
+
a = b.orElse(c)
|
14
26
|
```
|