Ruby方法的显式返回 - 实现隐藏,重用和优化

时间:2009-12-23 11:31:07

标签: ruby-on-rails ruby

不是允许Ruby方法盲目地返回最后一个被评估的语句,而是明确返回nil有什么好处吗?

在实现隐藏和重用方面,盲目地允许返回评估的最后一个表达式似乎是危险的 - 用户是否会依赖于此只会在修改实现时获得令人讨厌的意外?除非给出明确的回报值,否则返回nil肯定会更好。

接下来,当返回是一个简单类型而不是对更复杂对象的引用时,Ruby是否可以进行优化?

克里斯

5 个答案:

答案 0 :(得分:5)

查看问题的第二部分:

  

Ruby可以进行优化吗?   当返回是一个简单类型时make   而不是更多的参考   复杂的对象?

......我认为不值得担心。如果有性能提升(而且我更确信存在),那么它最多只是微优化,并且不太可能带来任何有益的好处。我怀疑用require profile尝试两种方式都会显示出获得的收益微乎其微。 ; - )

答案 1 :(得分:1)

除非你打算用返回值做一些事情,否则我认为没有优势。

我没有看到有人想要捕获其返回值无意捕获的函数的返回值的情况。

如果我错了,有人会纠正我,但除了方便之外,隐含的返回值没有实际用途。


这是一个可能有用的假设场景

def func
  if do_something
    # we don't want to return the return value of do_something_else, so return nil
    do_something_else
    return nil
  end
  # we do want to return the return value of this function; however.
  do_foo
end

我发现它不太可能发生

答案 2 :(得分:1)

一般来说,没有。我从未见过一个函数,为了避免返回上一个执行语句的值,返回nil 如果从调用者使用了返回值,则可以返回nil以避免从调用者使用最后一个语句的结果。如果该函数应该返回一个值,那么我认为代码写错了,如果它没有显式返回值。

答案 3 :(得分:0)

是的,返回零有好处。除非你试图提供API,否则我不会担心它们。

答案 4 :(得分:-1)

通常有两种方法,即

  1. 功能方法 - 在运行或调用方法后返回值
  2. 程序方法 - 改变对象的内部状态
  3. 功能方法的一个例子是

    def max(num, another_num)
      num > another_num ? num : another_num
    end
    

    将返回可用于执行其他计算的最大数量。

    程序方法的一个简单示例可以是ruby中的setter或属性访问器,如

    class Person
    
      def name=(name)
        @name = name
      end
    
    end
    

    上述方法正在改变Person对象的内部状态,即通过将实例变量@name设置为提供的值。

    所以这一切都取决于你正在编写什么样的方法,你的方法的意图以及你将如何使用它。换句话说,如果它是一个程序方法,那么你可以在最后返回nil但是我个人从来没有这样做,即只更改对象的状态时返回nil,因为这只会添加一行代码并且还可以生成方法在不向方法添加任何值的情况下看起来很复杂。

    但是,Ruby始终从方法返回最后一个计算语句的值,无论它是程序方法还是函数方法,实际上在某些情况下可以方便地评估方法或方法中的某些条件。