【问题标题】:Does Ruby support type-hinting?Ruby 支持类型提示吗?
【发布时间】:2013-07-15 04:12:19
【问题描述】:

PHP 示例:

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

Ruby 示例:

class MyClass
    # ...
end

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

有没有类似的?谢谢。

【问题讨论】:

  • 请注意,php 仅支持数组和对象的类型提示。很遗憾,(int $i) 是不可能的。顺便说一句,为什么在这里投反对票?对我来说,作为一个 PHP 开发者,这很有趣
  • @Hast 很遗憾没有
  • 这是完全有效的语法:it just doesn't do what you think it does
  • @hek2mgl:我有一个正在睡觉的提案:RFC...
  • 只是想添加(因为我偶然发现了这个线程):PHP7 也添加了 scala 类型提示。 Typehinting 是我在 ruby​​ 中几乎不会错过的东西。不过好吧,至少还有 Scala……

标签: ruby type-hinting


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • 对于yard、rdoc等文档,有一种特殊的语法来指定参数的类。
    • 除了美学问题,这在语义上并不等同于类型提示。至关重要的是,这是 runtime 检查,与允许 static 检查的类型提示相比。 IE。我可以立即检查所有代码路径,而无需运行它们。我不是想破坏 Ruby,只是指出运行时类型检查是不等价的。这仅与完整的测试覆盖率等效(不仅仅是“100% 覆盖率”:它必须测试每个代码路径,而不仅仅是触及每个句法行)。那是……相当“大事”:P
    【解决方案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
    

    【讨论】:

    • 看起来像是名称冲突和副作用的保证,如果需要多个参数则不可用。
    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

      不,Ruby 本身不支持它,而且我认为 Matz 不打算将它添加到语言中......动态且富有成效的语言...

      【讨论】:

      • 这一切都很好,直到你遇到复杂的系统并且说参数需要匹配某个实现。 Ruby,尽管它是一门伟大的语言 - 确实可以使用这样的功能。这是一些最好的面向对象语言的一个很棒的特性:)
      猜你喜欢
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 2020-07-09
      • 2019-10-11
      相关资源
      最近更新 更多