2013-03-13 20 views
0

我遇到了一些看似基本的问题。基本上我想要做这样的事情:红宝石 - 使用take_while与地图迭代器

result = reports.map do |rep| 
    rep.calculate_distance 
    break if rep.msg_code == 5 
end 

但是,而不是回到像这样:

=> [#<BigDecimal:7fc7036c63b8,'0.3962736920 816792E7',18(45)>, #<BigDecimal:7fc7066061c8,'0.1603401548 194003E4',27(45)>, #<BigDecimal:7fc70601fb60,'0.1707572852 613187E3',27(45)>, #<BigDecimal:7fc706176220,'0.4645528504 455211E3',27(45)>, #<BigDecimal:7fc70667e448,'0.1058402703 80584E4',27(45)>] 

它返回:那么

=> [nil, nil, nil, nil, nil] 

我试试这个:

reports.take_while {|rep| rep.msg_code == 5 }.map(&:calculate_distance) 

但它给m E本:

=> [] 

而且我知道事实,没有味精码等于5,所以它应该在阵列中返回大小数,但事实并非如此。

那么,如何获得take_while与地图一起工作以获得理想的结果呢?

+0

您需要在此处提供有关您的问题的更多信息。 – 2013-03-13 20:42:42

+0

@iAmRubuuu问题是我想返回一个大数字的数组。 calculate_distance是一个返回大数小数的rails对象的方法。我想继续这样做,直到rails对象的msg_code方法等于5. rails对象同时包含calculate_distance和msg_code方法。结果应该是大数小数的数组。 – JohnMerlino 2013-03-13 20:44:05

回答

2

我想继续做,直到导轨的msg_code方法的对象在take_while谓词等于5

reports.take_while{ |rep| rep.msg_code != 5 }.map(&:calculate_distance) 

基本上!= 5而不是== 5

+0

谢谢当我在8分钟内让我接受你的答案。 – JohnMerlino 2013-03-13 20:47:35

+1

@JohnMerlino不急,你可能会得到更好的答案;) – Kyle 2013-03-13 20:48:03

+0

这就是要走的路。只要评论一下,就像我们选择/拒绝一样,所以可以实现互补的'take_until'来保持块中的正逻辑。 – tokland 2013-03-13 20:54:39