- Mastering Elixir
- André Albuquerque Daniel Caixinha
- 225字
- 2021-08-05 10:42:51
Bringing structs and protocols together
Now that we have the %Folder{} struct defined, we can define its implementation for the Size protocol.
We'll first define the implementation for the %File.Stat{} struct, as we can then use this to implement the protocol for %Folder{}. Here's the implementation for %File.Stat{}:
$ cat examples/size_implementations_file_stat_and_folder.ex
defimpl Size, for: File.Stat do
def size(file_stat), do: file_stat.size
end
# ...
With this in place, our implementation for our %Folder{} struct is as follows:
$ cat examples/size_implementations_file_stat_and_folder.ex
# ...
defimpl Size, for: Folder do
def size(folder) do
folder.files_info
|> Enum.map(&Size.size(&1))
|> Enum.sum()
end
end
To find out the size of a folder, we sum the size of each file it contains. As such, this implementation iterates through our files_info list, using the Size implementation for %File.Stat{} to get the size of each file, summing all the sizes in the end. In the following snippet, we can see this implementation being used on the folder variable we just defined:
iex> Size.size(folder)
779
With this, we can see the full power of mixing structs and protocols, which lets us have polymorphic functions based on the data type of their arguments. We now have a common interface, Size.size(data), that allows us to find out the size of pretty much anything we want, provided that we implement the Size protocol for the data type we're interested in.
- Android Jetpack開發(fā):原理解析與應用實戰(zhàn)
- Practical Windows Forensics
- Full-Stack Vue.js 2 and Laravel 5
- Android系統(tǒng)原理及開發(fā)要點詳解
- 深度學習:Java語言實現(xiàn)
- Mastering Git
- 基于SpringBoot實現(xiàn):Java分布式中間件開發(fā)入門與實戰(zhàn)
- Learning Hadoop 2
- Apache Camel Developer's Cookbook
- SciPy Recipes
- 汽車人機交互界面整合設計
- Getting Started with Nano Server
- 精益軟件開發(fā)管理之道
- Microsoft XNA 4.0 Game Development Cookbook
- Building Microservices with .NET Core 2.0(Second Edition)