수색…


소개

다형성 (Polymorphism)은 다른 유형의 개체에 대한 단일 인터페이스를 제공하는 것입니다. 기본적으로 다른 데이터 유형이 동일한 함수에 응답 할 수 있습니다. 따라서 같은 기능이 서로 다른 데이터 유형에 적용되어 동일한 동작을 수행합니다. Elixir 언어에는 다형성을 명확하게 구현하는 protocols 이 있습니다.

비고

모든 데이터 유형을 포함 할 경우, 당신은의 구현 정의 할 수 있습니다 Any 데이터 형식을. 마지막으로, 시간이 있다면 핵심 엘릭서의 다형성의 좋은 예인 EnumString.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