我刚刚完成了一个关于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
答案 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)上查看大型项目,以了解那些比我自己更有经验的人编写干净的代码。祝好运!