ruby显式方法返回类型

时间:2012-06-23 14:14:52

标签: ruby methods

我正在学习ruby(有一个java / groovy背景),看起来像编写方法时,方法签名是

def method_name
    # do something
end

使用ruby的动态特性,我理解为什么没有显式声明返回类型。但是,假设我有一个名为get_name的方法。作为代码的调用者,我可能不确定它是返回String还是某些自定义Name类型。有没有办法明确声明返回类型?并且(如果可能的话)这真的是在红宝石中完成,以明确返回值是什么?

5 个答案:

答案 0 :(得分:6)

Java执行静态类型检查。它确保在编译时满足所有类型要求。 Ruby更具动态性,它不进行编译时间检查,其类型系统通常被称为“鸭子打字”。也就是说,“如果它像鸭子一样走路,像鸭子一样嘎嘎叫,那它一定是鸭子。”

如果某个方法需要一个响应某些消息的对象(具有某些方法),那么只要它符合协议,它就不关心该对象的实际类型。如果这是由良好的测试套件支持,那么它(可以说)是一种更好的方法,因为它允许更快的原型设计和减少视觉混乱。减少视觉混乱 - 代码更具表现力和可理解性。这样做的好处显而易见。 :)

答案 1 :(得分:1)

我发现RubyMine / IntelliJ提供的注释注释对此非常有帮助。例如:

# @param [String] time_zone_offset_string eg. +10:00
# @return [Array] An array containing sign, hours and minutes
def self.parse_timezone_string(time_zone_offset_string)
  ... parse the timezone string ...
  return [sign, hours, minutes]
end

这些注释似乎不是RDoc的特征 - 如果是这样的话会很棒。

答案 2 :(得分:0)

据我所知,ruby不可能定义方法返回值的类型。但你可以使用is_a等方法吗?或类检查类型。

答案 3 :(得分:0)

简短的回答是:这是不可能的,永远不会成为可能的。它将永远不会被使用。

这是一个很长的答案:Ruby不对类型进行操作。 Ruby在泛型对象上运行。在某些时候,一切都只是BasicObject。 Ruby使用Duck Typeing,它具有核心原则

  

如果它像鸭子一样走路,像鸭子一样说话,翻译很乐意将它视为鸭子。

您可以使用Object#class(返回对象的类)和Object#is_a?(klass)来检查类,但社区强烈建议不要这样做。只需逻辑思考,阅读源代码,并使用文档。

答案 4 :(得分:0)

2019年,Stripe发布了他们的红宝石类型检查器Sorbet。现在可以指定方法签名。可以看起来像这样:

  sig {returns(String)}
  def name
    "Sergio"
  end

例如,如果您对类型犯了错误,则会得到有趣的错误。

代码:

  sig {returns(Integer)}
  def name
    "Sergio"
  end

错误:

editor.rb:12: Returning value that does not conform to method result type https://srb.help/7005
    12 |    "Sergio"
            ^^^^^^^^
  Expected Integer
    editor.rb:11: Method name has return type Integer
    11 |  def name
          ^^^^^^^^
  Got String("Sergio") originating from:
    editor.rb:12:
    12 |    "Sergio"
            ^^^^^^^^
Errors: 1

您可以在online playground中使用检查器。

相关问题