2013-07-16 48 views
8

PHP实例:Ruby支持类型提示吗?

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

Ruby的例子:

class MyClass 
    # ... 
end 

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

有什么与此类似?谢谢。

+2

请注意,PHP只支持数组和对象的typehinting。 '(int $ i)'不幸是不可能的。顺便说一句,为什么downvotes在这里?对我来说,作为一个PHP-dev,这很有趣 – hek2mgl

+0

对不起? PHP不支持没有第三方扩展的标量排序 – Hast

+1

@不幸的是不是 – hek2mgl

回答

3

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

对于像yard这样的文档,rdoc有一个特殊的语法来指定参数的类。 – sawa

+6

这很有趣“你所要做的就是在每个函数调用中为每个参数写一个自定义异常”我真的不得不笑:)。我不知道红宝石是纯粹的垃圾,直到我发现没有类型暗示。现在我不会打扰那种语言 – Toskan

+4

除了审美问题,这在语义上不等同于类型提示。关键是,这是_runtime_检查,与类型提示相比,它允许_static_检查。即我可以立即检查所有代码路径,而无需运行它们。我并不想垃圾Ruby,只是指出运行时类型检查是不相同的。这只与完整的测试覆盖率相当(不仅仅是“100%覆盖率”:它必须测试每个代码路径,这不仅仅是触及每个语法行)。这是......相当“重大”的事情:P – hraban

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

由于单次发送,它仅适用于* one *“参数”(接收器)。 – user2246674

1

号,红宝石本身不支持它,我想这并不是Matz将它添加到语言中的意图...... Ruby真的在自己的内部API中包含了duck typing,它使Ruby成为一种非常动态和高效的语言......

+9

这些都很好,直到你遇到复杂的系统并且说参数需要匹配某个实现。 Ruby,就像它的语言一样 - 可以真正做到这一点。这是一些最好的面向对象语言的一大特点:) – Oddman

2

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

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

我去寻找它首先发现这个线程。无法找到我正在寻找的东西,所以我写了它,并认为我会在这里分享。

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