2016-08-13 65 views
0

如何创建仙丹一个mixin? - 一个包含函数的实体,我可以将其包含在模块中并使用这些函数。红宝石混入在药剂

什么是Ruby的药剂中混入的相同呢?

+2

你的问题是什么?我无法理解 – coderVishal

+0

我不知道你问了什么,但也许这会有所帮助 - > http://elixir-lang.org/getting-started/alias-require-and-import.html – JustMichael

+0

@coderVishal,如何创建一个混蛋。 – Johshi

回答

1

你不能。 Mixin是一个对象概念,Elixir中没有任何对象。

如果你只是想为功能短名称,你可以使用import,让您可以参考函数W/O使用完整的模块名称。

http://elixir-lang.org/getting-started/alias-require-and-import.html

另外还有一点,你可以用它来注入来自另一模块代码到当前模块中使用宏。这可能是最接近Ruby Mixin的东西。见

http://elixir-lang.org/getting-started/meta/domain-specific-languages.html

对于如何使用__using__宏的例子。

此外,还有用于功能多态性行为和协议。

行为是当你想要一个自定义函数在相同的参数,协议是当你想要相同的功能在不同的数据 类型工作。

2

这里是__using__宏的动作一个例子:如果你使用凤凰

# mixin.ex 
defmodule Mixin do 
    defmacro __using__(_) do 
    quote do 
     def hello do 
     IO.puts "Hello World" 
     end 
    end 
    end 
end 

defmodule MyModule do 
    use Mixin 
end 

Interactive Elixir (1.4.2) - press Ctrl+C to exit (type h() ENTER for help) 
iex(1)> c "mixin.ex" 
[MyModule, Mixin] 
iex(2)> MyModule.hello() 
Hello World 
:ok 
iex(3)> 

,你可以在你web/web.ex文件中添加了高清的报价定义为内要扩展特定组件。例如,我会经常为我的模型添加一个all()函数。

# web/web.ex 
def MyApp.Web do 
    def model do 
    quote do 
     use Ecto.Schema 

     import Ecto 
     import Ecto.Changeset 
     import Ecto.Query 

     def all, do: Repo.all(__MODULE__) 
    end 
    end 
    # ... 
end 

请注意,我们不会在Elixir中将它们称为mixin。