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

Dan*_*ams 4 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
Run Code Online (Sandbox Code Playgroud)

Raf*_*aez 6

我会用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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

  • 我同意对多行使用`do ... end`,对单行块使用`{...}`.这导致不得不偶尔混合两种风格,但在我看来,这本身并不是邪恶的. (2认同)

the*_*Man 5

我会这样做:

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
Run Code Online (Sandbox Code Playgroud)

sort将比简单对象的简单比较慢得多。sort_by<=>

在风格上,如果您要返回一个值,尤其是在方法链中,请使用{...}而不是do...。end“样式指南”建议使用do...end当您在一个块中处理多end.some_method行时,但很模糊且令人困惑。使用{...}提醒我们我们只传递值并清除模糊性。

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

此外,baresplitsplit ' 'or做同样的事情split(' ')