代码之家  ›  专栏  ›  技术社区  ›  Sasha Chedygov

用Ruby显式返回是一种好的风格吗?

  •  143
  • Sasha Chedygov  · 技术社区  · 15 年前

    来自Python的背景,在风格方面总是有一种“正确的方法”(一种“Pythonic”的方法),我想知道Ruby是否也有这种方法。我一直在使用我自己的风格指南,但我正在考虑发布我的源代码,我希望它遵守任何可能存在的不成文规则。

    显式输入是“Ruby方式”吗 return 在方法上?我见过有没有这样做,但有没有正确的方法?有没有可能是对的 时间

    def some_func(arg1, arg2, etc)
      # Do some stuff...
      return value # <-- Is the 'return' needed here?
    end
    
    8 回复  |  直到 10 年前
        1
  •  237
  •   EliadL ThiefMaster    5 年前

    这是一个老问题,但我会拿出我的两分钱作为回答。

    TL;DR-您不必这样做,但在某些情况下,它可以使您的代码更加清晰。

    这是一个有点做作的例子,但是想象一下有一个像这样的小函数,它在传递的数字上加上一个,并将其分配给一个实例变量。

    def plus_one_to_y(x)
        @y = x + 1
    end
    

    这是一个返回值的函数吗?很难说开发人员的意思是什么,因为它既分配实例变量,又返回分配的值。

    def plus_one_to_y(x)
        @y = x + 1
        puts "In plus_one_to_y"
    end
    

    现在函数被破坏了 . 如果没有任何东西需要返回值,则可以。很明显,如果在代码链的某个地方,调用它的东西期望返回一个值,那么它将失败,因为它无法返回它期望的值。

    现在真正的问题是:有什么东西真的期望返回值吗?这是不是弄坏了什么东西?将来它会破坏什么吗?谁知道呢!只有对所有调用进行完整的代码检查才能让您知道。

    因此,在我们的小演示函数的情况下,假设我们希望它返回一个值,它会这样写。。。

    def plus_one_to_y(x)
        @y = x + 1
        puts "In plus_one_to_y"
        return @y
    end
    

    任何程序员都很清楚,它确实返回了一个值,而且他们很难在没有意识到的情况下破坏它。

    def plus_one_to_y(x)
        @y = x + 1
        puts "In plus_one_to_y"
        @y
    end
    

    但是为什么要省去return这个词呢?为什么不把它放在那里,让它100%清楚发生了什么?它实际上不会影响代码的执行能力。

        2
  •  67
  •   Miguel bmargulies    12 年前

    不会。好的Ruby风格通常只会对 提前返回 . Ruby热衷于代码极简主义/隐式魔术。

    这就是说,如果一个明确的回报能让事情变得更清楚,或者更容易阅读,那么它不会损害任何东西。

        3
  •  31
  •   Jörg W Mittag    15 年前

    我个人使用 return 关键字来区分我所说的 函数方法 ,即主要为其返回值执行的方法,以及 程序方法 回来 关键字以引起对返回值的注意。

    我使用相同的区别时 使命感 方法:函数方法有括号,过程方法没有。

    最后但并非最不重要的一点是,我也使用了块的这种区别:功能块得到大括号,程序块(即“做”某事的块)得到大括号 do end .

    然而,我试着不去相信它:用积木、花括号和 / 终止 有不同的优先级,我只是切换到另一种样式,而不是添加显式括号来消除表达式的歧义。方法调用也是如此:如果在参数列表周围添加括号使代码更具可读性,我会这样做,即使所讨论的方法本质上是过程性的。

        4
  •  13
  •   Alex Dean    11 年前

    实际上,重要的是要区分:

    1. 函数-为其返回值执行的方法
    2. 程序-针对其副作用执行的方法

    side_effect() 另一个开发人员决定滥用程序的隐式返回值(基本上将其视为不纯函数)。

    程序 显式返回 nil (又名 Unit () (以其他语文)。

    return 语法与否只是个人风格的问题。

    为了进一步区分职能和程序:

    1. 复制Jrg W Mittag编写带花括号的功能块和带花括号的程序块的好主意 do/end
    2. 调用过程时,请使用 () ,而在调用函数时,不要

    请注意,Jrg W Mittag实际上提倡另一种方法——避免 () 对于过程来说,这是不可取的,因为您希望将副作用方法调用与变量明确区分开来,特别是当arity为0时。见 Scala style guide on method invocation 详情请参阅。

        5
  •  8
  •   ndnenkov    8 年前

    The style guide 声明,您不应该使用 return 在你最后的陈述中。你仍然可以使用它 if it's not the last one . 这是社区严格遵守的惯例之一,如果您计划与任何使用Ruby的人合作,您也应该遵守。


    话虽如此,使用显式 回来 对于来自其他语言的人来说,这是令人困惑的。

    • 第二,这适用于大多数人,他们来自Algol语言。大多数都是这样的 “较低级别” 与Ruby相比,您必须编写更多的代码才能完成某些工作。

    一屏 . 在这种情况下,您可能没有看到方法定义和/或已经忘记了从何处返回。

    另一方面,在Ruby中,最好坚持使用方法 less than 10 lines long


    因为Ruby没有 无效的 回来 s

        6
  •  4
  •   Devon Parsons    10 年前

    It does.

    这是该语言的一个众所周知的特性,任何希望在ruby中调试问题的人都应该了解它。

        7
  •  1
  •   Praveen Angyan    15 年前

    这是你最喜欢哪种风格的问题。如果您想从方法中间返回某个位置,则必须使用关键字返回。

        8
  •  0
  •   Gishu    13 年前

    def some_func_which_returns_a_list( x, y, z)
      return nil if failed_some_early_check
    
    
      # function code 
    
      @list     # returns the list
    end