16

PHP 示例:

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

红宝石示例:

class MyClass
    # ...
end

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

有没有类似的东西?谢谢。

4

5 回答 5

10

Ruby 3 将类型引入 Ruby ( Source )。您现在已经可以使用Sorbet将类型添加到您的 ruby​​ 代码中。

于 2019-07-13T07:19:01.580 回答
5

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
于 2013-07-16T20:10:22.707 回答
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
于 2013-07-16T20:10:12.270 回答
2

无耻的插件 - 我刚刚为此发布了一个 ruby​​ gem - http://rubygems.org/gems/type_hinting

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

我先去寻找它并找到了这个线程。找不到我要找的东西,所以我写了它并想在这里分享。

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

于 2014-11-17T06:03:56.603 回答
1

不,Ruby 本身不支持它,我认为这不是 Matz 将它添加到语言中的意图...... Ruby 确实在其内部 API 中包含鸭子类型,它使 Ruby 成为一种非常动态和高效的语言...

于 2013-07-16T20:13:22.890 回答