Elixir Language
엘릭서의 다형성
수색…
소개
다형성 (Polymorphism)은 다른 유형의 개체에 대한 단일 인터페이스를 제공하는 것입니다. 기본적으로 다른 데이터 유형이 동일한 함수에 응답 할 수 있습니다. 따라서 같은 기능이 서로 다른 데이터 유형에 적용되어 동일한 동작을 수행합니다. Elixir 언어에는 다형성을 명확하게 구현하는 protocols
이 있습니다.
비고
모든 데이터 유형을 포함 할 경우, 당신은의 구현 정의 할 수 있습니다 Any
데이터 형식을. 마지막으로, 시간이 있다면 핵심 엘릭서의 다형성의 좋은 예인 Enum 과 String.Char 의 소스 코드를 확인하십시오.
프로토콜을 사용한 다형성
켈빈과 화씨 온도를 섭씨로 변환하는 기본 프로토콜을 구현해 보겠습니다.
defmodule Kelvin do defstruct name: "Kelvin", symbol: "K", degree: 0 end defmodule Fahrenheit do defstruct name: "Fahrenheit", symbol: "°F", degree: 0 end defmodule Celsius do defstruct name: "Celsius", symbol: "°C", degree: 0 end defprotocol Temperature do @doc """ Convert Kelvin and Fahrenheit to Celsius degree """ def to_celsius(degree) end defimpl Temperature, for: Kelvin do @doc """ Deduct 273.15 """ def to_celsius(kelvin) do celsius_degree = kelvin.degree - 273.15 %Celsius{degree: celsius_degree} end end defimpl Temperature, for: Fahrenheit do @doc """ Deduct 32, then multiply by 5, then divide by 9 """ def to_celsius(fahrenheit) do celsius_degree = (fahrenheit.degree - 32) * 5 / 9 %Celsius{degree: celsius_degree} end end
이제 Kelvin 및 Fahrenheit 유형의 변환기를 구현했습니다. 몇 가지 전환을 만들어 보겠습니다.
iex> fahrenheit = %Fahrenheit{degree: 45} %Fahrenheit{degree: 45, name: "Fahrenheit", symbol: "°F"} iex> celsius = Temperature.to_celsius(fahrenheit) %Celsius{degree: 7.22, name: "Celsius", symbol: "°C"} iex> kelvin = %Kelvin{degree: 300} %Kelvin{degree: 300, name: "Kelvin", symbol: "K"} iex> celsius = Temperature.to_celsius(kelvin) %Celsius{degree: 26.85, name: "Celsius", symbol: "°C"}
to_celsius
함수에 대한 구현이없는 다른 데이터 유형을 변환 해 봅시다.
iex> Temperature.to_celsius(%{degree: 12}) ** (Protocol.UndefinedError) protocol Temperature not implemented for %{degree: 12} iex:11: Temperature.impl_for!/1 iex:15: Temperature.to_celsius/1
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow