Ruby参数类型确认

时间:2011-06-08 03:54:51

标签: ruby duck-typing

来自Java背景,我对Ruby对其方法参数的完全blasé态度感到有些不安。在Java中,我可以保证参数x是方法正常工作所必需的类型,在Ruby中,我无法保证x是整数,字符串或其他任何东西。

示例:如果我想在Java中编写absolute_value方法,则标题将类似于

public static int absoluteValue(int x)

在Ruby中它就像

def self.absolute_value(x)

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

嘿,欢迎来到Ruby。过去几年我也在Java工作,当时我真的很喜欢Java。

现在,将Ruby视为缺乏类型检查是不正确的。它至少具有与Java类似的类型检查,只是允许类型更改,因此检查在运行时完成。

另外,旧语言中的所有破碎声明样板都很烦人。一个类型检查的应用程序没有及时完成有用没有任何好处。经过类型检查的程序太冗长,无法阅读,可能会过时。

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

但是如果你不测试它,你就不知道它是否有效,所以方法调用类型符合的抽象知识并不像你想象的那样有用。

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

答案 2 :(得分: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

答案 3 :(得分:1)

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

答案 4 :(得分: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一起使用。而不是做一个other.is_a?(Point) - 他们已经测试了方法的实现,这对我来说似乎是个不错的选择。人们可以争辩说,“其他”对象可能有x和y可能意味着不同的东西,虽然正确的论点错过了我只是指向中间地带的观点。我的方法也倾向于直接进行添加,如果有人传递错误的类型则失败。