Как ограничить тип аргумента функции - PullRequest
0 голосов
/ 09 мая 2018

Допустим, у меня есть следующая функция:

def encode(obj)
  case obj
  when Int32
    "i#{obj}e"
  when String
    "#{obj.size}:#{obj}"
  when Symbol
    encode(obj.to_s)
  when Array
    obj.reduce "a" {|acc, i| acc + encode(i)} + "e"
  else
    raise ArgumentError.new "Cannot encode argument of class '#{obj.class}'"
  end
end

И я хочу избавиться от этой ветки else, чтобы сделать проверку во время компиляции на тип аргумента. Я могу написать что-то вроде этого:

def encode(obj : Int32 | String | Symbol | Array)

В этом случае все в порядке. Но что, если есть больший список типов? Есть ли более элегантный способ сделать это? Я хочу, чтобы компилятор проверил, что эта функция принимает только те типы, которые соответствуют в выражении case.

1 Ответ

0 голосов
/ 09 мая 2018

Перегрузка на помощь:

def encode(obj : Int32)
  "i#{obj}e"
end

def encode(obj : String)
  "#{obj.size}:#{obj}"
end

def encode(obj : Symbol)
  encode(obj.to_s)
end

def encode(obj : Array(String))
  obj.reduce "a" { |acc, i| acc + encode(i) } + "e"
end
...