Ruby: аргументы проверки типов, похожие на Cadence SKILL

В Cadence SKILL (проприетарный язык EDA, основанный на LISP & SCHEME) можно определить типы аргументов в процедуре.
Если будет задан неверный тип аргумента, произойдет ошибка. См. отчет оболочки ниже:

procedure( foo( ko "t" ) printf( "Hey %s\n" ko ) )
>foo
>foo("1")
>Hey 1
>t
foo(1)
>*Error* foo: argument #1 should be a string (type template = "t") - 1

Есть ли что-то столь же изящное в Ruby? То есть в определении интерфейса метода, а не в теле, делается проверка типов?
Спасибо.


person user1134991    schedule 10.06.2016    source источник
comment
Нет. В Ruby нет встроенных аннотаций типов.   -  person Jordan Running    schedule 10.06.2016


Ответы (2)


Вы можете сделать это «изящным» следующим образом:

module FirstArgumentIsAString
  module Initializer
    def initialize(word)
      fail 'Word must be String' unless word.is_a?(String)
      super
    end
  end

  def self.included(klass)
    klass.send :prepend, Initializer
  end
end

class Foo
  include FirstArgumentIsAString
end

y = Foo.new(2)
> Uncaught exception: Word must be String
person Mihhail Sidorin    schedule 10.06.2016
comment
Ух ты. Почти то, что я хотел, я могу настроить это, чтобы сделать то, что я себе представлял. Спасибо. - person user1134991; 13.06.2016

Вы всегда можете сделать

fail 'Keep input as a string' unless variable_name.is_a?(String)

хотя это не динамический тип мышления, попытайтесь добиться утиного набора текста

person Mihhail Sidorin    schedule 10.06.2016