Ruby中与void返回类型的替代方案

9

我的经验是在基于C的语言(C、C++、Java、C#)中,函数的返回类型可以是void,即无返回值。但在Ruby中,似乎每个函数都会返回一些东西。我想知道在Ruby中为一个不返回任何东西的方法应该返回什么。我最好的猜测是返回nil或包含该方法的对象(用于链接),或者只是忽略末尾的任何内容,但我似乎找不到任何相关信息。

Ruby中void的替代品是什么?

4个回答

11

放置

return nil
在方法的最后一个语句中。
或者简单地说。
nil

5
空函数(def foo; end)也会隐式返回nil - user142019
@Zoidberg 这是真的,但有实际用途吗? - SwiftMango
为了保持一致性,我会在返回“void”的函数中也返回nil - user142019
从 Ruby 2.1 开始,空方法不再返回 nil来源 - dimid
2
@Dimid 这是不同的问题。 a = def foo; end;b = foo()。你在谈论a是 :foo,但我们正在讨论b为什么为nil。 - SwiftMango

1

nil与void不同。你可以将一个变量设置为nil,但不能将其设置为void。如果函数返回nil,则可以将其分配给变量而不会出错,但尝试使用void函数(在支持void函数的java或其他语言中)进行分配会导致编译器报错。我不是Ruby超级专家,但我找不到支持void概念的迹象。所有函数都会返回一些东西,即使它是nil。如果这是不正确的,那么我希望有更多了解Ruby的人提供反例。

特别是在Ruby中,变量是一个带有名称的东西,而且由于Ruby中的所有内容都是对象,所以它还有一个存储指向堆上某个对象的地址的位置。将变量设置为nil意味着将其指针设置为NilClass的唯一实例。(true和false类似;TrueClass和FalseClass只有一个实例。)

我知道C语言有一个叫做void指针的东西。这是完全不同的“void”用法。虽然void指针确实包含一个地址并指向某个东西,但现在我们先忽略它们;我只是提到它们来阻止无益的争论。我们关注的是Ruby中真正返回“nothing”的函数,在我看来不存在。


0

如果你什么都不想返回,是的,可以使用 return nil。但是为什么呢?

通过不将函数调用分配给变量,你可以愉快地忘记已经返回了什么。那个返回值将存储在任何地方,并且会在垃圾回收中丢失。


16
如果你至少不考虑方法中的最后一个表达式的计算结果,可能会意外泄露关于方法实现的信息,并且人们可能会开始依赖它,即使你的文档说明相反。 - Jörg W Mittag

0
在现代版本的Ruby中,RBS支持void
如果您无法使用RBS,可以使用method_missing相对容易地编写自己的Void对象。它不能防止赋值,但确实使调试更容易。
# frozen_string_literal: true

# Responds to all messages by raising Void::Error.
#
# Use for methods that only produce side-effects and do not return anything.
# The meaning is the same as in C or Java.
#
# ```
# def void_method
#   # do side-effect
#   Void.new
# end
#
# unintentional_assignment = void_method
# # much later ..
# unintentional_assignment.foo
# # => Void::Error (Void from void_method.rb received: foo)
# ```
class Void
  class Error < RuntimeError
  end

  def initialize
    @instantiation_source_location = caller[1] || 'Source unknown'
  end

  def method_missing(method)
    raise(
      Error,
      format(
        'Void from %s received: %s',
        @instantiation_source_location,
        method
      )
    )
  end

  def respond_to_missing?(*)
    true
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接