4

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

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

public static int absoluteValue(int x)

在 Ruby 中,它会类似于

def self.absolute_value(x)

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

4

5 回答 5

4

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

于 2011-06-08T04:03:15.787 回答
4

呵呵,欢迎来到 Ruby。在过去的某些年里,我也曾在 Java 领域工作过,当时我真的很喜欢 Java。

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

另外,旧语言中所有令人沮丧的声明样板都令人讨厌。一个没有及时完成的​​类型检查应用程序对任何人都没有任何好处。过于冗长而无法阅读的类型检查程序可能会过时。

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

但是,如果您不对其进行测试,您将不知道它是否有效,因此方法调用类型符合的抽象知识不会像您想象的那么有用。

无论如何,Ruby 在这一点上已经证明了自己作为一门语言的出色表现。作为一个现实生活中的平台,RoR 在速度和内存使用方面都存在一些性能问题,但我不知道有任何项目抱怨动态类型并希望他们通过一些旧的冗长语言获得 RSI。

于 2011-06-08T04:33:52.790 回答
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
于 2011-06-08T04:51:57.240 回答
1

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

于 2011-06-08T03:59:03.357 回答
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

此示例用于在使用 (x,y) 坐标的 Point 类上实现“+”操作。而不是做一个 other.is_a?(Point) - 他们已经测试了该方法的实现,对我来说这似乎是一个不错的选择。有人可以争辩说,“其他”对象可能具有 x 和 y 属性,含义不同,尽管正确的论点忽略了我只是指向中间立场的观点。我的方法也倾向于直接进行加法,如果有人通过错误类型则失败。

于 2012-01-17T11:52:49.977 回答