Sas*_*gov 149 ruby coding-style return-value
来自Python背景,在风格方面总是有"正确的方法"("Pythonic"方式),我想知道Ruby是否存在相同的情况.我一直在使用自己的风格指南,但我正在考虑发布我的源代码,并且我希望它遵守可能存在的任何不成文的规则.
return
在方法中明确键入是"Ruby方式" 吗?我已经看到它有没有完成,但有没有正确的方法呢?是否有合适的时机去做?例如:
def some_func(arg1, arg2, etc)
# Do some stuff...
return value # <-- Is the 'return' needed here?
end
Run Code Online (Sandbox Code Playgroud)
Tim*_*olt 218
旧的(和"回答")问题,但我会把我的两分钱作为答案.
TL; DR - 您没有必要,但它可以使您的代码在某些情况下更加清晰.
虽然不使用显式返回可能是"Ruby方式",但是对于使用不熟悉的代码或不熟悉Ruby的这个特性的程序员来说,这会让人感到困惑.
这是一个有点人为的例子,但成像有一个像这样的小功能,它会增加一个传递的数字,并将其分配给一个实例变量.
def plus_one_to_y(x)
@y = x + 1
end
Run Code Online (Sandbox Code Playgroud)
这是否意味着是一个返回值的函数?很难说开发人员的意思是什么,因为它既分配了实例变量,又返回分配的值.
假设很久以后,另一个程序员(可能不熟悉Ruby基于最后一行代码执行返回的方式)来了,并希望输入一些用于日志记录的打印语句,该函数就变成了这个......
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
end
Run Code Online (Sandbox Code Playgroud)
现在的功能被破坏如果有什么需要一个返回值.如果没有人期望返回值,那很好.显然,如果代码链的某个地方更远,那么调用它的东西就是期望返回的值,它会失败,因为它没有回到它预期的状态.
现在真正的问题是:做了什么确实期望返回值吗?这件事有没有破坏?它将来会破坏什么吗?谁知道!只有对所有通话的完整代码审核才会通知您.
所以至少对我来说,最佳实践方法是要么非常明确地表示如果重要的话你要归还某些东西,要么在没有的时候根本不归还.
因此,在我们的小型演示函数的情况下,假设我们希望它返回一个值,它将被写成这样......
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
return @y
end
Run Code Online (Sandbox Code Playgroud)
并且任何程序员都会非常清楚它确实会返回一个值,并且更难以在没有意识到的情况下打破它.
或者,可以像这样写它并省略返回声明......
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
@y
end
Run Code Online (Sandbox Code Playgroud)
但是为什么要把这个词留下来呢?为什么不把它放在那里,让它100%清楚发生了什么?它实际上对您的代码执行能力没有任何影响.
Ben*_*hes 66
不.好的Ruby风格通常只会使用显式返回来提前返回.Ruby在代码极简主义/隐含魔法方面很重要.
也就是说,如果一个明确的回报会使事情更清晰,或更容易阅读,那么它不会伤害任何东西.
Jör*_*tag 31
我个人使用return
关键字来区分我称之为功能方法的方法,即主要针对其返回值执行的方法,以及主要针对其副作用执行的程序方法.因此,返回值很重要的方法,获取额外的return
关键字以引起注意返回值.
我在调用方法时使用相同的区别:函数方法获取括号,而过程方法则没有.
最后但并非最不重要的是,我也使用块的区别:功能块获得花括号,程序块(即"做"某事的块)得到do
/ end
.
但是,我尽量不对它有所了解:使用块,花括号和do
/ end
具有不同的优先级,而不是添加明确的括号来消除表达式的歧义,我只是切换到另一种样式.方法调用也是如此:如果在参数列表周围添加括号使得代码更具可读性,那么即使所讨论的方法本质上是程序性的,也是如此.
Ale*_*ean 13
其实重要的是区分:
Ruby没有本地区分这些的方法 - 这使您容易编写过程,side_effect()
而另一个开发人员决定滥用过程的隐式返回值(基本上将其视为不纯函数).
要解决这个问题,请从Scala和Haskell的书中删除,并明确返回您的过程nil
(aka Unit
或()
其他语言).
如果您遵循这一点,那么使用显式return
语法或不仅仅是个人风格的问题.
进一步区分功能和程序:
do/end
()
,而在调用函数时,请不要需要注意的是约尔格W¯¯米塔格实际上主张的其他方式-避免()
S表示程序-而是因为你想一边实现方法调用从变量清晰可辨,尤其是当元数为0.见,这不是明智的方法调用Scala的风格指南为细节.
样式指南指出,您不应该return
在最后一个声明中使用.如果它不是最后一个,你仍然可以使用它.这是社区严格遵守的惯例之一,如果您计划与使用Ruby的任何人合作,您也应如此.
话虽这么说,使用显式return
s 的主要论点是,对于来自其他语言的人来说,它会让人感到困惑.
java中方法长度(不包括getter/setter)的常用启发式算法是一个屏幕.在这种情况下,您可能没有看到方法定义和/或已经忘记了您从哪里返回.
另一方面,在Ruby中,最好坚持使用长度小于10行的方法.考虑到这一点,人们会想知道为什么当明确暗示时,他必须多写10%以上的陈述.
由于Ruby没有void方法,而且一切都更加简洁,如果你使用显式return
s ,你只是增加了开销,没有任何好处.