以干净的方式链接ruby枚举器函数

时间:2015-02-05 22:20:48

标签: ruby enumerator

我刚刚完成了一个关于ruby的课程,其中教师获取电影列表,将它们分组,然后调用地图,排序和反向。它工作正常,但我发现语法不易读,我想弄清楚我的想法是否有效。我来自c#背景。

#we can reformat our code to make it shorter
#note that a lot of people don't like calling functions on the
#end of function blocks. (I don't like the look, either)
count_by_month = movies.group_by do |movie|
                        movie.release_date.strftime("%B")
                    end.map do |month, list|
                        [month, list.size]
                    end.sort_by(&:last).reverse

我想知道的是,我是否可以做类似

的事情
#my question: can I do this?
count_by_month = movies.group_by(&:release_date.strftime("%B"))
                   .map(&:first, &:last.size)
                   .sort_by(&:last)
                   .reverse

#based on what I've seen online, I could maybe do something like
count_by_month = movies.groupBy({m -> m.release_date.strftime("%B")})
                   .map{|month, list| [month, list.size]}
                   .sort_by(&:last)
                   .reverse

1 个答案:

答案 0 :(得分:2)

正如评论中的一些人所说,这真的是风格问题;话虽如此,我必须同意代码中的注释,并说你想避免在do..end结尾处进行方法链接。

如果要按行拆分方法,请使用do..end。 {}和do ... end是同义词,如你所知,但是对于单行代码片段,经常使用大括号(根据我的经验),并指出“mu太短”,如果你开始使用它们,你可能想看看lambdas。但是在这种情况下我会坚持做。

我所教导的一般风格规则是,如果以可能不直观的方式使用更改类进行处理,则会拆分链。例如:fizz = "buzz".split.reverse将字符串分解为数组,但很清楚代码在做什么。

在你提供的例子中,有很多内容有点难以理解;我喜欢你在最后一个例子中使用散列表示法写出了group_by,因为很清楚group_by在那里排序是什么以及输出是什么 - 我把它放在一个[自己命名的]变量中。

grouped_by_month = movies.groupBy({m -> m.release_date.strftime("%B")})
count_by_month = grouped_by_month.map{|month, list| [month, list.size]}.sort_by(&:last).reverse

这会将代码拆分为一行,用于设置分组哈希值,另一行用于操作它。

同样,这是风格,所以每个人都有自己的怪癖;这就是我如何根据快速浏览来编辑它。你似乎总体上很好地进入了Ruby!有时我只想在一行上看一系列方法,即使它反对最佳实践(我正在做Project Euler或我自己的其他项目)。我建议在Github(ex:rails)上查看大型项目,以了解那些比我自己更有经验的人编写干净的代码。祝好运!