スポンサーリンク

2016年5月11日

[Elixir]Play with the defdelegate

とある錬金術師の万能薬(Elixir)

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をデリゲートで使ってみよう。

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

Bibliography

人気の投稿