コード例(1)


Struct Point

In [1]:
struct Point
    x
    y
end
In [2]:
p1 = Point(1.0, 2.0)
Out[2]:
Point(1.0, 2.0)
In [3]:
p1.x
Out[3]:
1.0
In [4]:
p1.y
Out[4]:
2.0
In [5]:
p2 = Point(3.0, 4.0)
Out[5]:
Point(3.0, 4.0)

p1 + p2

In [6]:
import Base.+  # おまじない

function +(p1::Point, p2::Point)
    Point(p1.x + p2.x, p1.y + p2.y)
end
Out[6]:
+ (generic function with 164 methods)
In [7]:
p1 + p2
Out[7]:
Point(4.0, 6.0)

Note:
+ 演算子の多重定義(オーバーロード)をしていますっ
すでにシステムで定義されている演算子(関数)なので、このように import Base.+ を予め記述するか、function Base.:+(〜) と書く必要があります。


p1 + (2.5, 3.2)

In [8]:
function +(p::Point, t::Tuple)
    Point(p.x + t[1], p.y + t[2])
end
Out[8]:
+ (generic function with 165 methods)
In [9]:
p1 + (2.5, 3.2)
Out[9]:
Point(3.5, 5.2)

Note:
ここでは簡単のため、第2引数を Tuple とだけ指定していますが、実際には NTuple{2} のように要素数を特定したり、さらに NTuple{2,Number} のように型を特定した方が良いでしょうっ


(2.5, 3.2) + p2

In [ ]:
function +(t::Tuple, p::Point)
    # TODO: 実装してみましょう!
end
In [ ]:
(2.5, 3.2) + p2
# => Point(5.5, 7.2)

Note:
実装してみましょうっ
いくつか方法がありますよっ


Point

  • 引数に 型アノテーション を付ける
  • 関数の実装を書き分ける

Note:
Juliaの演算子オーバーロードは、実は多重ディスパッチのおかげっ!