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

chaining ruby enumerator functions in a clean way

我刚刚完成了关于 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

正如评论中的许多人所说,这确实是一种风格问题;话虽这么说,我必须同意代码中的评论,并说您想避免在 do..end.

结束时进行方法链接

如果您要按行拆分方法,请使用 do..end。 {} 和 do...end 是同义词,如您所知,但大括号更常用于(根据我的经验)单行代码片段,正如 'mu is too short' 指出的那样,如果您开始使用它们时,您可能需要研究一下 lambda。但我会坚持做..在这种情况下结束。

我被教导要遵循的一般样式规则是,如果正在处理的内容以可能不直观的方式发生变化 class,则拆分链。例如:fizz = "buzz".split.reverse 将一个字符串分解为一个数组,但很清楚代码在做什么。

在您提供的示例中,有很多事情很难理解;我喜欢你在最后一个例子中使用哈希符号写出 group_by,因为很清楚 group_by 在那里排序的内容以及输出是什么 - 我会把它放在 [well named]它自己的变量。

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(例如:rails)上的大型项目,以了解那些比我更有经验的人如何编写干净的代码。祝你好运!