1. OverView
さて、続きをやりましょう、さくっと続きを
https://elixirschool.com/ja/lessons/basics/basics#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E6%BC%94%E7%AE%97-9
本日は演算子です。計算する奴。
2. まずは解説
- 四則演算はさすがにサクッとスルーするのだ。
整数の除算や除算の余り(モジュロ)は、divとかremを呼び出してますね。
iex(1)> 2 * 5
10
iex(2)> div( 10, 5)
2
iex(3)> rem(10,3)
1
偉そうで悪いけど、ここでしれっと関数呼び出しがされてますね。
あとからさんざんやりますが、関数名()で、()の中の数字が引数となります。
この引数が処理され、結果が返されます。
divで言えば
div( 引数1, 引数2 )
iex(3)> rem(10,3)
1
引数1が10, 引数2が3...10÷3の余りが1なので、この関数はあまり1を返します。
さて、elixirでは、引数が二個あるので、div/2と表記します。
iexでは、hコマンドでヘルプが見れます…
iex(8)> h div/2
def div(dividend, divisor)
@spec div(integer(), neg_integer() | pos_integer()) :: integer()
guard: true
ここは、後から、書いたら、そこにリンク張っときますわ。
- なんでdiv/2とか、関数名と引数の数をまとめて表記するのか?
-> 引数の数で、別の関数になるからですな。
- なんでdiv/2とか、関数名と引数の数をまとめて表記するのか?
-> 引数の数で、別の関数になるからですな。
- ブール演算
Elixirは || と && 、 ! という論理演算子を用意しており、これらは「どんな型」にも対応しています:
iex(11)> -20 || true
-20
論理演算子 ||の左右を比較し、結果を返す。
ここはそういうものだと割り切って、
|| or
&&
! 否定
iex(11)> -20 || true
-20
演算子 | コメント |
---|---|
|| | |
&& | and |
! | 否定 |
orなのだけど、戻る値が-20なのが面白い
この順番、意味ありそう
※これも後の課題
さらに、最初の引数が真理値(true と false)で なければならない 3つの演算子があります:
and, or, notと書くと、意味が変わる変わるみたいだ。
iex(12)> true and 42
42
iex(13)> 42 and true
** (BadBooleanError) expected a boolean on left-side of "and", got: 42
iex:13: (file)
左辺(42)が、booleanじゃないと怒られてる。
本日の課題。
orなのだけど、戻る値が-20なのが面白い
この順番、意味ありそう
- 比較
さて、言わずとしれた比較、簡単に見えるよなぁ。
==, !=, ===, !==, <=, >=, < and >
なぜ、基本を2日もかけてやってるのか?それはここで1点
Elixirの重要な特徴はどんな2つの型でも比べられるということ。順序があります。
number < atom < reference < function < port < pid < tuple < map < list < bitstring
これ、この後の例で理解したんだが、
iex(14)> :hello > 999
true
:helloと言うatomは、trueとなる。上の例でnumber < atomであるな。
次、listと、mapの比較ですね、
{:hello, :world} > [1, 2, 3]
false
まぁ、上にmap < listと書いてあるので、上はmap > listの式なのはわかるのだけど、
mapやlistの要素の数は関係ないことに注意。
なお…
補足)
Elixirにおけるリストの比較方法
リストの比較は各要素を順に比較していくため、最初に異なる要素が見つかった時点で結果が決まります。
iex(2)> [1,2] < [3,4]
true
iex(17)> [6,2] < [5,5]
false
先頭の6と5は比較されても、後ろの2と5は比較されていないことに注意してください。
iex(19)> [:hello, :world] > [1, 2]
true
この場合は、同じlistの中の要素が比較されるので、:hello > 1も:world > 2( atom > numberなので) trueとなってます。
- 文字列への式展開
iex(24)> name = "Sean"
"Sean" 説明の為、変数nameにSeamをバインドしています。
iex(25)> "Hello #{name}"
"Hello Sean" 文字列中の#{name}が、変数nameの値、Seamに置き換えられました。
#{}で、{}の中に入ってる変数にバインドされた内容で置き換えてくれるわけですね
この、#{}と言う書き方が、シジルとして、たくさん表記法があるのであとで悩むとしましょう。
…%sと
- 文字列の連結
文字列の連結
iex(28)> "Hello " <> name
"Hello Sean"
...これは楽ですな。
3. 本日のチートシート!
- 四則演算
演算子 | 例 | コメント |
---|---|---|
+ | 加算(Addition) | |
- | 減算(Subtraction) | |
* | 乗算(Multiplication) | |
/ | 除算(Division) | |
div/2 | iex> div( 10, 5) 2 |
整数除算(Integer Division) |
rem/2 | iex> rem(10,3) 1 |
rem: 剰余(Remainder) |
div, remは関数呼び出しがされてますね。
divで言えば
div( 引数1, 引数2 )
iex(3)> rem(10,3)
1
引数1が10, 引数2が3...10÷3の余りが1なので、この関数はあまり1を返します。
さて、elixirでは、引数が二個あるので、div/2と表記します。
- ブール演算
演算子 | コメント |
---|---|
|| | |
&& | 論理積(AND) |
! | 否定(NOT) |
and, or, notと書く場合、演算子の左辺はbooleanでなくてならない
演算子 | 例 | コメント |
---|---|---|
and | iex(12)> true and 42 42 |
|
or | ||
nor |
エラーの例
iex(13)> 42 and true
** (BadBooleanError) expected a boolean on left-side of "and", got: 42
iex:13: (file)
左辺(42)が、booleanじゃないと怒られてる。
- 比較
演算子 | コメント |
---|---|
-- | リストの差(List Subtraction) |
== | 等価(Equality) |
!= | 不等価(Inequality) |
< | 小なり(Less Than) |
> | 大なり(Greater Than) |
<= | 以下(Less Than or Equal To) |
>= | 以上(Greater Than or Equal To) |
補足1)
Elixirの重要な特徴はどんな2つの型でも比べられるということ。順序があります。
number < atom < reference < function < port < pid < tuple < map < list < bitstring
iex(14)> :hello > 999
true
補足2)
Elixirにおけるリストの比較方法
リストの比較は各要素を順に比較していくため、最初に異なる要素が見つかった時点で結果が決まります。
iex(2)> [1,2] < [3,4]
true
iex(17)> [6,2] < [5,5]
false
先頭の6と5は比較されても、後ろの2と5は比較されていないことに注意してください。
- 文字列への式展開
※シジルとして、別途まとめますが、今回はこれだけ
例 | コメント |
---|---|
iex(24)> name = "Sean" iex(25)> "Hello #{name}" |
#{}で、{}の中に入ってる変数にバインドされた内容で置き換えてくれる |
- 文字列の連結
演算子 | 例 | コメント |
---|---|---|
<> | iex(28)> "Hello " <> name "Hello Sean" |