重写“更好”的代码

| 我正在使用Ruby 1.9,我想知道是否有一种“更好的”方式来编写以下代码。
  array_one = []
  array_two = []
  some_array.each { |value|
    array_one << value.id
    array_two << value.name
  }
我\“不喜欢\”像上面的示例一样初始化
array_one
和ѭ2and,然后添加those3ѭ和
value.name
。这是因为主要是为了更好地理解和阅读我的应用程序中的代码。 我想提供相同的功能,但使用“更好”的编码。可能吗?     
已邀请:
        您那里的代码模式通常是肯定要退出的sign5ѭ(或更常见的是同构关系)的迹象。 Ruby确实提供了一种内置的折叠方法,由于历史原因,它称为“ 6”。 未经测试:
array_one, array_two = some_array.
  inject([[], []]) {|(array_one, array_two), value|
    [array_one << value.id, array_two << value.name]
}
不知道您是否认为这“更好”。对于了解“ 5”是什么的人,这可能更清楚。对于不这样做的人,可能不是。 (尽管我认为如果您不了解ѭ5是什么,那么您就不是一个非常好的Ruby程序员,甚至根本不是一个非常好的程序员,但这只是我的看法。) 但是,说某个迭代是
fold
并不是真正有用的,因为
fold
是一种通用的迭代方法(这意味着每种形式的迭代都可以表示为
fold
)。您在这里真正拥有的是13英镑:
array_one, array_two = some_array.map(&:id), some_array.map(&:value)
请注意,这将两次遍历
some_array
。但是,除非您有可靠的基准测试和性能分析结果表明这种双重遍历是应用程序中性能问题的主要根源,否则您不必担心。     
        您可以使用Array#collect方法:
array_one = some_array.collect { |value| value.id }
array_two = some_array.collect { |value| value.name }
正如JörgW Mittag在回答中提到的那样,该解决方案还将遍历源数组两次。     
        您可能需要使用
transpose
将包含两个元素的数组的n元素数组转换为两个n元素数组:
array_one, array_two = some_array.map {|value| [value.id, value.name]}.transpose
这是RDoc链接,尽管相当简洁。     

要回复问题请先登录注册