Ruby支持类型提示吗?

时间:2013-07-16 19:50:32

标签: ruby type-hinting

PHP示例:

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

Ruby示例:

class MyClass
    # ...
end

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

有什么类似的吗?感谢。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

如果您确实想确保对特定类的实例(如整数)执行某个操作,请考虑在特定类上定义该操作:

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

答案 2 :(得分:3)

无耻的插件 - 我刚刚为此发布了一个红宝石 - http://rubygems.org/gems/type_hinting

用法在这里 - https://github.com/beezee/ruby_type_hinting

我先找了它,发现了这个帖子。无法找到我想要的东西,所以我写了它,并想到我会在这里分享。

我认为它比这里提出的任何解决方案都更简洁,并且还允许您为方法指定返回类型。

答案 3 :(得分:1)

不,Ruby本身并不支持它,我认为Matz并不打算将它添加到语言中...... Ruby真的在其自己的内部API中拥抱duck typing并且它使Ruby成为可能一种非常有活力和富有成效的语言......

答案 4 :(得分:0)

Ruby 3将为Ruby(Source)引入类型。您现在可以使用Sorbet将类型添加到您的红宝石代码中。