Пример PHP:
function do_something(int $i) {
return $i + 2;
}
Пример Ruby:
class MyClass
# ...
end
def do_something(MyClass x)
x.prop1 = "String..."
end
Есть ли что-то похожее на это? Спасибо.
Пример PHP:
function do_something(int $i) {
return $i + 2;
}
Пример Ruby:
class MyClass
# ...
end
def do_something(MyClass x)
x.prop1 = "String..."
end
Есть ли что-то похожее на это? Спасибо.
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
Если вы действительно хотите убедиться, что определенное действие выполняется на экземпляре определенного класса (например, целое число), тогда рассмотрите определение этого действия для конкретного класса:
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
Бесстыдный плагин - я только что опубликовал рубиновый камень для этого - http://rubygems.org/gems/type_hinting
Использование здесь - https://github.com/beezee/ruby_type_hinting
Я сначала искал его и нашел эту тему. Не мог найти то, что искал, поэтому написал и понял, что я поделюсь здесь.
Я считаю это более кратким, чем любое предлагаемое решение здесь, а также позволяет указать тип возвращаемого значения для метода.
Нет, Ruby сам не поддерживает его, и я думаю, что это не намерение Matz добавить его к языку... Ruby действительно охватывает duck typing в своем собственном внутреннем API и делает Ruby очень динамичным и продуктивным языком...
Ruby 3 представит типы для Ruby (Source). Вы уже можете использовать Sorbet для добавления типов в ваш код ruby.