Поддерживает ли Ruby тип-намек?

Пример PHP:

function do_something(int $i) {
    return $i + 2;
}

Пример Ruby:

class MyClass
    # ...
end

def do_something(MyClass x)
    x.prop1 = "String..."
end

Есть ли что-то похожее на это? Спасибо.

Ответ 1

Ruby не имеет такой вещи, но все, что вам нужно сделать, это добавить одну строку так:

def do_something(x)
  raise "Argument error blah blah" unless x.kind_of?(MyClass)
  ...
end

Неважно. Но если вы считаете, что это слишком многословно, то просто определите метод:

module Kernel
  def verify klass, arg
    raise "Argument error blah blah" unless arg.kind_of?(klass)
  end
end

и поместите это в первую строку:

def do_something(x)
  verify(MyClass, x)
  ...
end

Ответ 2

Если вы действительно хотите убедиться, что определенное действие выполняется на экземпляре определенного класса (например, целое число), тогда рассмотрите определение этого действия для конкретного класса:

class Integer
  def two_more
    self + 2
  end
end

3.two_more   #=> 5
2.0.two_more #=> undefined method `two_more' for 2.0:Float (NoMethodError)

class MyClass
  def do_something
     self.prop1 = "String..."
  end
end

Ответ 3

Бесстыдный плагин - я только что опубликовал рубиновый камень для этого - http://rubygems.org/gems/type_hinting

Использование здесь - https://github.com/beezee/ruby_type_hinting

Я сначала искал его и нашел эту тему. Не мог найти то, что искал, поэтому написал и понял, что я поделюсь здесь.

Я считаю это более кратким, чем любое предлагаемое решение здесь, а также позволяет указать тип возвращаемого значения для метода.

Ответ 4

Нет, Ruby сам не поддерживает его, и я думаю, что это не намерение Matz добавить его к языку... Ruby действительно охватывает duck typing в своем собственном внутреннем API и делает Ruby очень динамичным и продуктивным языком...

Ответ 5

Ruby 3 представит типы для Ruby (Source). Вы уже можете использовать Sorbet для добавления типов в ваш код ruby.