回答編集履歴

3

Perl5にも//はあった。

2016/03/11 15:25

投稿

raccy
raccy

スコア21735

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
- // PHP 7
63
+ // $b 偽 な
4
64
 
65
+ // boolean への変換で FALSE になるオブジェクト
66
+
67
+ // 0, 0.0, "", "0", [], NULL, 空のSimpleXMLElement
68
+
69
+ $a = $b ?: $c;
70
+
5
- // $b が NULL なら
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
- # $b が 未定義(Any)
83
+ 変数の種類によって未定義の変数がどうるかが異なります。
16
84
 
85
+ ```Ruby
86
+
87
+ # b が 偽 なら
88
+
17
- $a = $b // $c;
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・・・

2016/03/11 15:25

投稿

raccy
raccy

スコア21735

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を追加

2016/03/09 21:54

投稿

raccy
raccy

スコア21735

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
+ ```