我的经验是使用基于 C 的语言(C、C++、Java、C#),其中函数的返回类型可以是 void,即不返回。但在 Ruby 中,似乎每个函数都会返回一些东西。我想知道在 Ruby 中返回什么以获取在 Java 或 C++ 中不返回任何内容的方法。我最好的猜测是 nil 或包含方法(用于链接)的对象,或者只是忽略最后发生的任何事情,但我似乎找不到任何关于此的信息。
Ruby 中 void 的替代方法是什么?
我的经验是使用基于 C 的语言(C、C++、Java、C#),其中函数的返回类型可以是 void,即不返回。但在 Ruby 中,似乎每个函数都会返回一些东西。我想知道在 Ruby 中返回什么以获取在 Java 或 C++ 中不返回任何内容的方法。我最好的猜测是 nil 或包含方法(用于链接)的对象,或者只是忽略最后发生的任何事情,但我似乎找不到任何关于此的信息。
Ruby 中 void 的替代方法是什么?
放
return nil
在方法的最后一条语句中。
或者干脆
nil
nil 与 void 不同。您可以将变量设置为 nil,但不能将其设置为 void。如果一个函数返回 nil ,它可以被分配给一个没有错误的变量,但是尝试使用一个 void 函数(在 java 或一些支持 void 函数的语言中),编译器会叫。我不是 ruby 超级专家,但我找不到任何迹象表明支持 void 的概念。所有函数都会返回一些东西,即使它是 nil。如果这是不正确的,那么我希望对 ruby 有更多了解的人可以提供一个反例。
变量,尤其是在一切都是对象的 ruby 中,是一个有名称和位置的东西,用于存储指向堆上某处对象的地址。将变量设置为 nil 意味着将其指针设置为 NilClass 的唯一实例。(true 和 false 相似;TrueClass 和 FalseClass 有单个实例。)
我意识到 C 有一个叫做 void 指针的东西。这是对“无效”一词的完全不同的用法。一个 void 指针实际上包含一个地址并指向某个东西。让我们暂时忽略这些;我只是提到他们来阻止徒劳的反驳。我们专注于 ruby 中真正返回nothing的函数,据我所知这些函数并不存在。
如果您不想返回任何东西,是的,您可以使用 return nil 。但为什么?
通过不将函数调用分配给变量,您可以幸福地忘记返回的内容。该返回值将不会存储在任何地方,并且会在垃圾收集中丢失。
在现代版本的 Ruby 中,RBS 支持void
.
如果您不能使用 RBS,您可以Void
使用method_missing
. 它不会阻止分配,但它确实使调试更容易。
# 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