所有方法都必须返回有意义的值吗?

时间:2014-10-17 01:19:06

标签: ruby

以下是镐书中的一小段代码:

def count_frequency(word_list) counts = Hash.new(0)
  for word in word_list
    counts[word] += 1
  end
  counts
end

最后的counts设置方法的返回值。返回的值是最后一次计算的值。

但是,有没有我们不关心方法的返回值的情况?例如,我有一对嵌套的each循环,它们将棋盘绘制到控制台。在该方法之外,计算的值是相当无意义的。我只想画一张棋盘。

将返回值留给环境是不是很糟糕,还是我总是试图明确设计返回有意义值的方法?

4 个答案:

答案 0 :(得分:3)

如果没有使用具有特定期望值的方法,则不必关心返回值。无需担心。

但是对于你的counts示例,返回该值是方法的重点。如果该方法没有返回该值,那么它就没有意义了,最后你肯定需要counts

在某些情况下,返回值不是方法的主要目的,但您仍希望返回某个值。一个这样的情况是,该方法旨在用于jQuery样式的方法链,如下所示:

some_object.do_this(args).do_that(args).then_do_this

在这种情况下,重要的是返回接收器。这种情况发生在某些库或框架中,但除非您特意将其用于这种方式,否则您不一定必须这样做。

答案 1 :(得分:1)

没有

在Ruby中,每个表达式都返回一个值,即使它只是nil。不只是方法;你写的每一行。对于方法,返回的值是退出之前评估的最后一个值。这个价值的含义取决于你。如果您记录该方法没有返回值,那么即使它确实返回一个值,它也是未定义的;不是API的一部分,调用者最好不要使用它。

例如,如果你记录它,即使nil也可以有正确的含义;它通常用于表示无法找到资源。但是,如果方法的唯一目的是执行像写入文件这样的副作用,那么它可能就没有任何实际意义; puts返回nil.

答案 2 :(得分:1)

不,当方法不能返回有意义的值时,返回值是不必要的,就像大多数其他编程语言一样。

事实上,最常见的方法之一puts会返回nil

#puts "hello"
hello
=> nil

答案 3 :(得分:1)

理论上,如果您清楚地记录了返回值没有意义,那么您可以偶然返回方法中最后一个表达式所评估的内容。

实际,但是,没有人会阅读文档,因此,如果您的方法 返回某些内容,那么 的人将依赖它。另外,根据你到底是什么意外"意外"返回时,您可能会泄漏方法的私有内部实现细节,或者甚至可能会破坏对象的封装,例如:返回私有实例变量的值。

例如,使用defined?一元前缀运算符。它被指定为返回true或false值。然而,在MRI上,它不仅返回任何真实值,它实际上返回String描述被询问的表达类型(例如'local-variable''method'等。)人们已经变得如此依赖于这个返回值,所有其他Ruby实现只是模仿它,即使它没有记录。现在,事实证明,对于MRI而言,这些信息很容易获得,但对JRuby来说并非如此,并且保持这些信息会导致性能下降。

E编程语言是一种纯粹的基于表达式的语言,如Ruby或Lisp。一切都是表达,没有任何陈述。一切都返回一个值。但是,与其他语言不同,子例程的隐式返回值不是子例程中计算的最后一个表达式的值,而是nil。如果要返回有意义的内容,必须显式return一个值。那是因为E的创造者认为,如果不小心返回你不想要的东西太危险了。 (E明确设计用于安全性,安全性,完整性和可靠性。)