Goal
- defdelegateで標準のモジュールを利用する
- defdelegateで自作のモジュールを利用する
Dev-Environment
- OS: Windows8.1
- Erlang: Eshell V7.3, OTP-Version 18.3
- Elixir: v1.2.3
Play with the defdelegate
まずは標準で用意されているモジュールをデリゲートで使ってみる。
今回は、Enumのreverseをデリゲートで使ってみよう。
今回は、Enumのreverseをデリゲートで使ってみよう。
File: delegate_sample.ex
defmodule DelegateSample do
defdelegate reverse(enumerable), to: Enum
defdelegate other_reverse(enumrable), to: Enum, as: :reverse
end
- “to:”でデリゲートしたいモジュールを指定する
- “as:”でデリゲートする関数を別名で使う場合に元となる関数を指定する
Note:
非推奨(?)になるみたいなので、"append_first:"オプションは割愛しています。
参考: http://d.hatena.ne.jp/hayabusa333/20160116/elixir_changes_20160115
参考: https://github.com/elixir-lang/elixir/issues/4199
Example:
iex> DelegateSample.reverse([1,2,3])
[3, 2, 1]
iex> DelegateSample.other_reverse([1,2,3])
[3, 2, 1]
無事実行できました。
続けて、自作のモジュールをデリゲートで使ってみたいと思います。
File: sample.ex
defmodule Sample do
def sample do
IO.puts "sample"
end
end
File: delegate_sample.ex
defmodule DelegateSample do
...
## My Module
defdelegate sample(), to: Sample
defdelegate other_sample(), to: Sample, as: :sample
end
Example:
iex> DelegateSample.sample
sample
:ok
iex> DelegateSample.other_sample
sample
:ok
Note:
defdelegateはpublic扱いになる。
そのため、privateで使いたいのであればimportで対応をする。
複数のデリゲートを一度に定義はできるのでしょうか?
検証してみましょう。
検証してみましょう。
File: sample.ex
defmodule Sample do
...
def sample2 do
IO.puts "sample2"
end
def sample3 do
IO.puts "sample3"
end
end
File: delegate_sample.ex
defmodule DelegateSample do
...
defdelegate [sample2(), sample3()], to: Sample
end
Example:
iex> DelegateSample.sample2()
sample2
:ok
iex> DelegateSample.sample3()
sample3
:ok
問題なく定義できるみたいです。
もう一つ検証してみましょう。
別名は一度につけられるのか?(これは無理だと思いますが・・・)
別名は一度につけられるのか?(これは無理だと思いますが・・・)
File: delegate_sample.ex
defmodule DelegateSample do
...
defdelegate [other_sample2(), other_sample3()], to: Sample, as: :sample2, as: :sample3
end
うん、まぁコンパイルは通りますよね。
記法上間違いがあるわけじゃないですし。
記法上間違いがあるわけじゃないですし。
Example:
iex> DelegateSample.other_sample2()
sample2
:ok
iex> DelegateSample.other_sample3()
sample2
:ok
実行はできるけど、sample2/0の方が実行されてしまったみたいです。
以上!
誰かの役に立ったなら幸いです。m( )m
誰かの役に立ったなら幸いです。m( )m