- 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.
- Learning LibGDX Game Development(Second Edition)
- Java面向對象思想與程序設計
- SQL Server 2012數據庫技術及應用(微課版·第5版)
- PowerCLI Cookbook
- Java入門很輕松(微課超值版)
- Django開發從入門到實踐
- 從0到1:HTML+CSS快速上手
- Web Application Development with R Using Shiny(Second Edition)
- Mastering AndEngine Game Development
- 琢石成器:Windows環境下32位匯編語言程序設計
- Hands-On Functional Programming with TypeScript
- Elasticsearch Server(Third Edition)
- PLC應用技術(三菱FX2N系列)
- MongoDB,Express,Angular,and Node.js Fundamentals
- Statistical Application Development with R and Python(Second Edition)