回答編集履歴
3
Perl5にも//はあった。
test
CHANGED
@@ -1,30 +1,154 @@
|
|
1
|
+
明示しない限り、原則ショートサーキット(1番目を返す場合は、2番目は**評価されない**)です。
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
`"0"`の扱いがPerl 5とPrel 6で異なります。
|
6
|
+
|
7
|
+
```Perl
|
8
|
+
|
9
|
+
# $b が 偽 なら
|
10
|
+
|
11
|
+
# Perl 5 では 0, "0", "", (), undef の五つのみ
|
12
|
+
|
13
|
+
# "0" が Perl 5 では偽になるが、Perl 6 では真になる。
|
14
|
+
|
15
|
+
# Perl 6 では Bool 型への変換で False になるオブジェクト
|
16
|
+
|
17
|
+
# False, 0, "", [], {}, Any, Nil, etc..
|
18
|
+
|
19
|
+
# 任意の型で何が偽であるかを定義できるため、無数に存在し得る。
|
20
|
+
|
21
|
+
$a = $b || $c;
|
22
|
+
|
23
|
+
# $b が 未定義なら
|
24
|
+
|
25
|
+
# defined($b) が偽かどうかで判断する。
|
26
|
+
|
27
|
+
# Perl 5 では undef かどうかになる。
|
28
|
+
|
29
|
+
# Perl 6 では Any や Int などになり、Mu や Nil 等も未定義の一つに含まれる。
|
30
|
+
|
31
|
+
# Perl 5 + use strict や Perl の場合、未宣言はエラーになる。
|
32
|
+
|
33
|
+
$a = $b // $c;
|
34
|
+
|
35
|
+
```
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
未定義かどうかを判断することはできないようです。
|
40
|
+
|
41
|
+
```Python
|
42
|
+
|
43
|
+
# b が 偽 なら
|
44
|
+
|
45
|
+
# __bool__() が False になるオブジェクト
|
46
|
+
|
47
|
+
# False, 0, "", (), [], {}, None, etc...
|
48
|
+
|
49
|
+
# 任意の型で何が偽であるかを定義できるため、無数に存在し得る。
|
50
|
+
|
51
|
+
# 未定義はエラーになる。
|
52
|
+
|
53
|
+
a = b or c
|
54
|
+
|
55
|
+
```
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
PHP 7から`??`が追加されました。
|
60
|
+
|
1
61
|
```PHP
|
2
62
|
|
3
|
-
//
|
63
|
+
// $b が 偽 なら
|
4
64
|
|
65
|
+
// boolean への変換で FALSE になるオブジェクト
|
66
|
+
|
67
|
+
// 0, 0.0, "", "0", [], NULL, 空のSimpleXMLElement
|
68
|
+
|
69
|
+
$a = $b ?: $c;
|
70
|
+
|
5
|
-
// $b が
|
71
|
+
// $b が 未定義 なら
|
72
|
+
|
73
|
+
// PHP 7 からの機能
|
74
|
+
|
75
|
+
// 未定義な変数は NULL であり、NULL かどうかの判断になる。
|
6
76
|
|
7
77
|
$a = $b ?? $c;
|
8
78
|
|
9
79
|
```
|
10
80
|
|
11
|
-
```Perl
|
12
81
|
|
13
|
-
# Perl 6 から
|
14
82
|
|
15
|
-
|
83
|
+
変数の種類によって未定義の変数がどうなるかが異なります。
|
16
84
|
|
85
|
+
```Ruby
|
86
|
+
|
87
|
+
# b が 偽 なら
|
88
|
+
|
17
|
-
|
89
|
+
# 偽は nil, false の二つのみ
|
90
|
+
|
91
|
+
# グローバル変数、インスタンス変数、クラス変数が未定義の場合、
|
92
|
+
|
93
|
+
# nil が定義されたものと見なされるため、未定義の場合という条件に使用できる。
|
94
|
+
|
95
|
+
# ローカル変数や定数が未定義の場合は、エラーになる。
|
96
|
+
|
97
|
+
a = b || c
|
98
|
+
|
99
|
+
# しかし、||= の場合は、前段階の処理で定義済みとされるため、エラーにならない。
|
100
|
+
|
101
|
+
a || = b
|
102
|
+
|
103
|
+
# 上は下の糖衣構文
|
104
|
+
|
105
|
+
a = a || b
|
106
|
+
|
107
|
+
# 処理として、a が未定義の場合、始めに a が定義されたものと見なされ、
|
108
|
+
|
109
|
+
# a には nil が入っているとし、偽であるから、b が a に代入される。
|
18
110
|
|
19
111
|
```
|
20
112
|
|
113
|
+
|
114
|
+
|
115
|
+
`NaN`も偽になります。
|
116
|
+
|
117
|
+
```JavaScript
|
118
|
+
|
119
|
+
// b が 偽 なら
|
120
|
+
|
121
|
+
// 偽は undefined, null, false, +0, -0, NaN, ''
|
122
|
+
|
123
|
+
// 未定義は undefined が入るが、未宣言はエラーになる。
|
124
|
+
|
125
|
+
a = b || c;
|
126
|
+
|
127
|
+
```
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
JavaScriptと違って未定義(未宣言)の場合も簡単に確認できるようになります。
|
132
|
+
|
21
133
|
```CoffeeScript
|
22
134
|
|
135
|
+
# b が 偽 なら
|
136
|
+
|
137
|
+
# JavaScript の || と同じになるし、|| と書くこともできる。
|
138
|
+
|
139
|
+
a = b or c
|
140
|
+
|
23
|
-
# b が null または undefined なら
|
141
|
+
# b が 未定義 または null または undefined なら
|
142
|
+
|
143
|
+
# typeof を使用するため、エラーにならずに未定義か判断できる。
|
24
144
|
|
25
145
|
a = b ? c
|
26
146
|
|
27
147
|
```
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
`int?`などNullable型にすればプリミティブ型にも使えます。
|
28
152
|
|
29
153
|
```C#
|
30
154
|
|
@@ -34,6 +158,10 @@
|
|
34
158
|
|
35
159
|
```
|
36
160
|
|
161
|
+
|
162
|
+
|
163
|
+
関数型言語はMabye型のようなものであれば、同じようにできます。`<|>`は構文ではなく、中置演算子という**関数**の一種ですが、Haskellは遅延評価であるため、ショートサーキットになります。
|
164
|
+
|
37
165
|
```Haskell
|
38
166
|
|
39
167
|
--- Maybe型: b が Nothing なら
|
@@ -42,10 +170,30 @@
|
|
42
170
|
|
43
171
|
```
|
44
172
|
|
173
|
+
|
174
|
+
|
175
|
+
もうひとつ関数型の例。Noneはnullとは異なる概念です。構文ではなく関数で構成されており、Scalaは正格評価であるため、**ショートサーキットではありません**。
|
176
|
+
|
45
177
|
```Scala
|
178
|
+
|
179
|
+
// b が null なら
|
180
|
+
|
181
|
+
a = Option(b).getOrElse(c);
|
46
182
|
|
47
183
|
// Option型: b が None なら
|
48
184
|
|
49
185
|
a = b.orElse(c)
|
50
186
|
|
51
187
|
```
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
Java 8にはOptionalというのがあるらしいです。構文ではなく関数で構成されており、Javaは正格評価であるため、**ショートサーキットではありません**。
|
192
|
+
|
193
|
+
```Java
|
194
|
+
|
195
|
+
// b が null なら ※ Java 8 から
|
196
|
+
|
197
|
+
a = java.util.Optinoal.ofNullable(b).orElse(c);
|
198
|
+
|
199
|
+
```
|
2
Nullable・・・
test
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
|
29
29
|
```C#
|
30
30
|
|
31
|
-
// Nullabe型: b が null なら
|
31
|
+
// Nullable型: b が null なら
|
32
32
|
|
33
33
|
a = b ?? c;
|
34
34
|
|
1
C#、Haskell、Sacalaを追加
test
CHANGED
@@ -25,3 +25,27 @@
|
|
25
25
|
a = b ? c
|
26
26
|
|
27
27
|
```
|
28
|
+
|
29
|
+
```C#
|
30
|
+
|
31
|
+
// Nullabe型: b が null なら
|
32
|
+
|
33
|
+
a = b ?? c;
|
34
|
+
|
35
|
+
```
|
36
|
+
|
37
|
+
```Haskell
|
38
|
+
|
39
|
+
--- Maybe型: b が Nothing なら
|
40
|
+
|
41
|
+
a = b <|> c
|
42
|
+
|
43
|
+
```
|
44
|
+
|
45
|
+
```Scala
|
46
|
+
|
47
|
+
// Option型: b が None なら
|
48
|
+
|
49
|
+
a = b.orElse(c)
|
50
|
+
|
51
|
+
```
|