Ruby支持类型提示吗?

NON*_*ONE 10 ruby type-hinting

PHP示例:

function do_something(int $i) {
    return $i + 2;
}
Run Code Online (Sandbox Code Playgroud)

Ruby示例:

class MyClass
    # ...
end

def do_something(MyClass x)
    x.prop1 = "String..."
end
Run Code Online (Sandbox Code Playgroud)

有什么类似的吗?谢谢.

jay*_*eff 8

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


saw*_*awa 5

Ruby 没有这样的东西,但你所要做的就是添加一行:

def do_something(x)
  raise "Argument error blah blah" unless x.kind_of?(MyClass)
  ...
end
Run Code Online (Sandbox Code Playgroud)

没什么大不了的。但是如果你觉得它太冗长了,那么定义一个方法:

module Kernel
  def verify klass, arg
    raise "Argument error blah blah" unless arg.kind_of?(klass)
  end
end
Run Code Online (Sandbox Code Playgroud)

并将其放在第一行:

def do_something(x)
  verify(MyClass, x)
  ...
end
Run Code Online (Sandbox Code Playgroud)

  • 除了审美问题,这在语义上不等同于类型提示。至关重要的是,与允许 _static_ 检查的类型提示相比,这是 _runtime_ 检查。即我可以立即检查所有代码路径,而不必运行它们。我不是要破坏 Ruby,只是指出运行时类型检查并不等效。这仅相当于完整的测试覆盖率(不仅仅是“100% 覆盖率”:它必须测试每个代码路径,这不仅仅是命中每个句法行)。那是......相当“大不了”:P (11认同)
  • 对于yard、rdoc等文档,有一种特殊的语法来指定参数的类。 (3认同)

小智 5

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

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

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

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