2015-02-05 51 views
1

我刚刚完成了一个关于ruby的课程,其中教师将电影列表分组,然后对它们进行分组,然后调用map,sort和reverse。它工作正常,但我没有发现语法是非常可读的,我试图弄清楚我脑海中是否有效。我来自c#背景。以一种干净的方式链接ruby枚举器函数

#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 
+2

这真的是一种风格的东西,但大多数情况下,单行使用'{}'块语法,多行使用'do'' end' - 以下是一些使用的样式指南:https://github.com/styleguide/ruby​​。这当然是codereview的问题,虽然不是SO – Anthony 2015-02-05 22:26:14

+1

不,你不能[发布其他人的代码](http://meta.codereview.stackexchange.com/questions/3649/my-question-was-closed-as-being -off-topic-what-are-my-options/3654#3654)。 – Hosch250 2015-02-05 22:28:08

+1

如果你的逻辑块不是单线,那么你可以使用lambdas:'release_date = lambda {| movie | ...}; movies.group_by(&RELEASE_DATE).MAP(....)'。 – 2015-02-05 22:37:00

回答

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

+0

非常感谢!这是超级有用的,我感谢你的洞察力! – 2015-02-09 23:03:25

+0

:D没问题。乐意效劳! – 2015-02-10 15:46:16

相关问题