适用于包含块的多行方法链接的Ruby样式

时间:2014-03-27 20:02:39

标签: ruby coding-style

在这种情况下,风格指南并不清楚(除了只是认为它很奇怪而且是这样)。我有一串哈希/数组函数可以在复杂的响应对象上执行。我需要做几种选择和地图。目前我只有一长串方法调用,但用于排序和选择的一些块是多行而有些则不是。

我应该混合块定义类型吗?只使用大括号或只使用.end块?我应该把它分成多个步骤吗?

另外,如果我重构我的块并将它们变成方法,那么将它们放在哪里是合适的?它们在包含类的实例或类方法的上下文中没有意义。

我环顾四周,对于什么是正确的样式没有找到共识但是我正在寻找一种能够通过Ruby样式指南的方法(所以最有可能将我的块重构为方法,但是我在哪里放置它们?)

这是一个人为的例子:

def example1 (arr)
  arr.sort do |a, b|
    a_pieces = a.value.split ' '
    b_pieces = b.value.split ' '
    (a_pieces[1] + a_pieces[5]) <=> (b_pieces[1] + b_pieces[5])
  end
  .last[:some_value]
  .select do |a|
    a == 'something'
  end

end


def example2 (arr)
  arr.sort { |a, b|
    a_pieces = a.value.split ' '
    b_pieces = b.value.split ' '
    (a_pieces[1] + a_pieces[5]) <=> (b_pieces[1] + b_pieces[5])
  }
  .last[:some_value]
  .select { |a| a == 'something' }
end

2 个答案:

答案 0 :(得分:5)

我会为多行使用do ... end块,为单行代码使用花括号{ ... }。我从不将do ... end用于链接方法,除非在多行块之前。我还在同一行中链接方法,只要代码可读,并且行不超过80个字符。

所以我的例子我会按如下方式编写代码:

def example1 (arr)
  arr.sort do |a, b|
    a_pieces = a.value.split ' '
    b_pieces = b.value.split ' '
    (a_pieces[1] + a_pieces[5]) <=> (b_pieces[1] + b_pieces[5])
  end.last[:some_value].select { |a| a == 'something' }
end

虽然我可能会将它分成两种方法(实际上是三种,其中example1为一种方法):

def sort_array(arr)
  arr.sort do |a, b|
    a_pieces = a.value.split ' '
    b_pieces = b.value.split ' '
    (a_pieces[1] + a_pieces[5]) <=> (b_pieces[1] + b_pieces[5])
  end
end

def select_item(arr)
  arr.last[:some_value].select { |a| a == 'something' }
end

def example1(arr)
  select_item(sort_array(arr))
end

答案 1 :(得分:1)

我会这样做:

def example1(arr)

  arr.sort_by { |a|
    a_pieces = a.value.split
    (a_pieces[1] + a_pieces[5])
  }.last[:some_value]
   .select { |a| a == 'something'}

end
如果除了对简单对象进行简单sort比较之外的任何事情,那么

<=> 比<{3}}慢。

从风格上讲,如果您要返回一个值,请使用{ ... }而不是do ... end,尤其是在一系列方法中。当您处理块中的多行时,“样式指南”建议使用do ... end,但end.some_method非常混乱且令人困惑。使用{ ... }提醒我们,我们只传递价值观并清理琐事。

请记住,它们是样式指南,而不是法律,并且是真正的通用编码实践指南,可帮助我们编写每个人都可读的代码。一致性很重要,可读性也很重要。

此外,裸sort_bysplit ' 'split(' ')的内容相同。