【问题标题】:Explicit return from a Ruby method - implementation hiding, reuse and optimisationsRuby 方法的显式返回 - 实现隐藏、重用和优化
【发布时间】:2010-03-26 13:01:27
【问题描述】:

与其允许 Ruby 方法盲目地返回最后评估的语句,不如显式返回 nil 有什么好处?

在实现隐藏和重用方面,盲目地允许返回最后一个评估的表达式似乎很危险——当修改实现时,用户会依赖它来得到一个令人讨厌的惊喜,这不是有危险吗?除非给出明确的返回值,否则返回 nil 肯定会更好。

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

克里斯

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    看问题的第二部分:

    是否有 Ruby 可以进行的优化 当 return 是简单类型时 make 而不是参考更多 复杂的对象?

    ...我认为这不值得担心。如果有性能提升(我相当怀疑有),它充其量只是一个微优化,不太可能带来任何值得拥有的好处。我怀疑用require profile 尝试这两种方式将表明可以得到多少。 ;-)

    【讨论】:

    • 谢谢,剖析的建议可能是最好的回应。
    • 如果分析抛出任何具有不同返回值的有趣变化,将它们发布在这里 - 简要地 - 将提供信息。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      除非您打算使用返回值做某事,否则我认为没有优势。

      我没有看到有人想要捕获一个函数的返回值,而该函数的返回值并不打算被捕获。

      如果我错了,有人纠正我,但是隐式返回值除了方便之外没有任何实际用途。


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

      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
      

      我认为这不太可能发生

      【讨论】:

      • 我同意,当函数应该返回一个值时,隐式返回很有用。在这种情况下,功能代码被简化,相对于使用语句 return 的语言。
      • 当然,else 在你returned 之后就没有必要了。这是使用保护子句保持低嵌套级别的一种方法...
      • "== true" 也是多余的,超出了要求 <:->)
      【解决方案4】:

      是的,返回 nil 有好处。除非您尝试提供 API,否则我不会担心他们。

      【讨论】:

        【解决方案5】:

        一般有两种方法,即。

        1. 函数式方法 - 在方法运行或调用后返回一个值
        2. 过程方法 - 改变对象的内部状态

        函数方法的一个例子是

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

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

        一个简单的过程方法示例可以是 ruby​​ 中的设置器或属性访问器,例如

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

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

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

        但是,Ruby 总是从方法返回最后一个评估语句的值,无论它是过程方法还是函数方法,这实际上使得在某些情况下评估方法或方法内部的某些条件变得很方便。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-06
          • 2020-06-06
          • 1970-01-01
          • 1970-01-01
          • 2019-10-31
          • 1970-01-01
          相关资源
          最近更新 更多