teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

Perl5にも//はあった。

2016/03/11 15:25

投稿

raccy
raccy

スコア21768

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
- // PHP 7
32
+ // $b 偽 な
33
+ // boolean への変換で FALSE になるオブジェクト
34
+ // 0, 0.0, "", "0", [], NULL, 空のSimpleXMLElement
35
+ $a = $b ?: $c;
3
- // $b が NULL なら
36
+ // $b が 未定義 なら
37
+ // PHP 7 からの機能
38
+ // 未定義な変数は NULL であり、NULL かどうかの判断になる。
4
39
  $a = $b ?? $c;
5
40
  ```
41
+
42
+ 変数の種類によって未定義の変数がどうなるかが異なります。
6
- ```Perl
43
+ ```Ruby
7
- # Perl 6
44
+ # b 偽 な
8
- # $b が 未定義(Any) なら
9
- $a = $b // $c;
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・・・

2016/03/11 15:25

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -13,7 +13,7 @@
13
13
  a = b ? c
14
14
  ```
15
15
  ```C#
16
- // Nullabe型: b が null なら
16
+ // Nullable型: b が null なら
17
17
  a = b ?? c;
18
18
  ```
19
19
  ```Haskell

1

C#、Haskell、Sacalaを追加

2016/03/09 21:54

投稿

raccy
raccy

スコア21768

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