来自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中防止这种情况,以便代码在运行时不会崩溃?
答案 0 :(得分:4)
欢迎来到Ruby,Kvass。希望你能学会爱鸭打字。通过编写测试,您可以对Ruby中的代码充满信心,而不依赖于类型检查和编译。通过不必定义类型,您可以获得速度,灵活性和可读性。
答案 1 :(得分:4)
现在,将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可能意味着不同的东西,虽然正确的论点错过了我只是指向中间地带的观点。我的方法也倾向于直接进行添加,如果有人传递错误的类型则失败。