我的经验是在基于C的语言(C、C++、Java、C#)中,函数的返回类型可以是void,即无返回值。但在Ruby中,似乎每个函数都会返回一些东西。我想知道在Ruby中为一个不返回任何东西的方法应该返回什么。我最好的猜测是返回nil或包含该方法的对象(用于链接),或者只是忽略末尾的任何内容,但我似乎找不到任何相关信息。
Ruby中void的替代品是什么?
我的经验是在基于C的语言(C、C++、Java、C#)中,函数的返回类型可以是void,即无返回值。但在Ruby中,似乎每个函数都会返回一些东西。我想知道在Ruby中为一个不返回任何东西的方法应该返回什么。我最好的猜测是返回nil或包含该方法的对象(用于链接),或者只是忽略末尾的任何内容,但我似乎找不到任何相关信息。
Ruby中void的替代品是什么?
放置
return nil
在方法的最后一个语句中。nil
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”的函数,在我看来不存在。
如果你什么都不想返回,是的,可以使用 return nil。但是为什么呢?
通过不将函数调用分配给变量,你可以愉快地忘记已经返回了什么。那个返回值将存储在任何地方,并且会在垃圾回收中丢失。
void
。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
def foo; end
)也会隐式返回nil
。 - user142019nil
。 - user142019nil
。 来源 - dimida = def foo; end;
和b = foo()
。你在谈论a是:foo
,但我们正在讨论b为什么为nil。 - SwiftMango