2011-06-08 66 views
3

从Java的背景来看,我对Ruby对其方法参数的完全态度感到有些不安。而在Java中,我可以保证参数x是该方法正常工作所必需的类型,在Ruby中,我无法保证x是一个整数,一个字符串或其他任何事情。Ruby参数类型确认

例子:如果我想用Java编写的absolute_value方法,头会像

public static int absoluteValue(int x) 

在Ruby中它会是这样的

def self.absolute_value(x) 

在这个例子中,在Java代码我可以完全确定传入的参数不是“生日快乐!”但在Ruby代码中,我不知道这一点。如何在Ruby中防止这种情况,以便代码在运行时不会崩溃?

+0

为什么这个标签“ruby on rails 3”? – 2011-06-08 04:40:48

+0

相关问题:http://stackoverflow.com/questions/177080/ruby-and-duck-typing-design-by-contract-impossible – 2011-06-08 04:46:28

+0

我删除了轨道标记,它与处理它的问题 – DGM 2011-06-08 12:47:23

回答

4

恩,欢迎来到红宝石。在过去的几年里我也是用Java工作的,当时我真的很喜欢Java。

现在,认为Ruby缺少类型检查是不正确的。它至少有和Java一样的类型检查,只是允许类型更改,因此检查在运行时完成。

另外,所有在旧语言中压碎声明样板文件都很烦人。没有及时完成的​​类型检查的应用程序有用并没有什么好处。类型检查的程序过于冗长,无法阅读,可能会过时。

如果在第一次运行Ruby程序时没有检查到类型,那么它可能会被测试覆盖。

但是,如果你不测试它,你不知道它是否能够正常工作,所以方法调用类型符合的抽象知识不会像你想象的那样有用。

在任何情况下,Ruby在这一点上都已经证明自己非常好,作为一种语言。作为一个真实的平台,RoR在速度和内存使用方面都存在一些性能问题,但我不知道有任何项目抱怨动态类型,并希望通过使用一些冗长的语言让RSI受到抨击。

1

Ruby(几乎?)总是被解释,所以在方法头中指定的类型检查无论如何都会在运行时崩溃。 “duck typing”行为(操作类型检查被操作的对象是否具有正确的方法)是Ruby成语的一部分,您不应该尝试在Ruby中编写Java。学习编写Ruby代码。

+0

无关,但这是一个艰难的过渡:P – Kvass 2011-06-08 04:03:24

4

欢迎来到Ruby,Kvass。希望你会学会喜欢鸭子打字。通过编写测试,您可以在Ruby中获得对代码的信心,而不依赖于类型检查和编译。您无需定义类型即可获得速度,灵活性和可读性。

2

跟我来,如果你想住。

a="String" 
puts a.kind_of? Integer # false 
puts a.kind_of? String # true 

a=10 
puts a.kind_of? Integer # true 
puts a.kind_of? String # false 
+1

然而,这不是鸭子打字。在Ruby社区中,这通常被幽默地称为* chicken typing *。 – 2011-06-10 16:25:07

0

你可以做一个最低水平的方法测试,同时仍然保持鸭子打字。若要从

def +(other) 
    raise TypeError, "Point-like argument expected" unless other.respond_to? :x and other.respond_to? :y 
    Point.new(@x + other.x, @y + other.y) 
end 

这个例子是用来实现对Point类与(X,Y)cordinates作品“+”操作书“Ruby编程语言”,使用的例子。而不是做一个other.is_a?(点) - 他们已经测试了该方法的实施,对我来说这似乎是一个不错的选择。人们可以争辩说,“其他”对象可能有x和y attrs意思是不同的东西,尽管一个正确的论点忽略了我只是指向中间立场的观点。我的方法也倾向于直接进行添加,如果某人传错了类型,则会失败。