重写"更好"的代码

use*_*052 5 ruby arrays coding-style initialization

我正在使用Ruby 1.9,我想知道是否有一种"更好"的方式来编写以下代码.

  array_one = []
  array_two = []
  some_array.each { |value|
    array_one << value.id
    array_two << value.name
  }
Run Code Online (Sandbox Code Playgroud)

我"不喜欢" 在上面的例子中初始化array_onearray_two喜欢然后加入那些value.idvalue.name.这是因为并且主要是为了更好地理解和阅读我的应用程序中的代码.

我想提供相同的功能,但具有"更好"的编码.可能吗?

Jör*_*tag 5

你在那里的代码模式通常是想要离开的fold(或更普遍的一种变形)的确定标志.Ruby确实提供了一种内置的折叠方法,因为它被称为历史原因inject.

未经测试:

array_one, array_two = some_array.
  inject([[], []]) {|(array_one, array_two), value|
    [array_one << value.id, array_two << value.name]
}
Run Code Online (Sandbox Code Playgroud)

不确定你是否认为这是"更好".对于了解什么fold是什么的人来说,这可能更清楚.对于那些没有的人,可能不是.

(虽然我认为,如果你明白什么fold是,那么你就不是一个很好的Ruby程序员,甚至是一个非常优秀的程序员,但是,这只是我的看法.)

然而,说某些迭代是一个fold并不是非常有用,因为它fold是一种通用的迭代方法(这意味着每种形式的迭代都可以表示为a fold).你真正拥有的是map:

array_one, array_two = some_array.map(&:id), some_array.map(&:value)
Run Code Online (Sandbox Code Playgroud)

请注意,这将遍历some_array两次.但是,除非您有可靠的基准测试和分析结果表明此双遍历是应用程序中性能问题的主要来源,否则您真的不应该担心这一点.