我正在学习ruby(有一个java / groovy背景),看起来像编写方法时,方法签名是
def method_name
# do something
end
使用ruby的动态特性,我理解为什么没有显式声明返回类型。但是,假设我有一个名为get_name
的方法。作为代码的调用者,我可能不确定它是返回String还是某些自定义Name类型。有没有办法明确声明返回类型?并且(如果可能的话)这真的是在红宝石中完成,以明确返回值是什么?
答案 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中使用检查器。