[#47173] 小数点以下を切り捨てる方法について — "T.Soejima" <clev@...2.so-net.ne.jp>

お世話になっております。そえじま@勉強中です。

16 messages 2010/06/23

[ruby-list:47120] Re: 配列の配列を返すmap

From: Nobuhiro IMAI <nov@...>
Date: 2010-06-01 11:28:35 UTC
List: ruby-list #47120
いまいです。

From: arima <arima.tknr_at_nifty.com>
Date: Tue, 1 Jun 2010 19:48:12 +0900

> 配列の配列を返すmapで、理解できない現象に困っています。
> 
> 整数の配列から、隣り合う要素のペアの配列を返すという、簡単なscriptです。
> 
> aA=[10, 20, 30, 40, 50]
> aX=[0, 0]
> 
> aY=aA.map{|x|
>     aX.push(x).shift

Array#push も Array#shift も配列を破壊的に変更するので、aX を破壊的に変
更しながら、最終的に aX が [40, 50] になったところで aY に入るので、

> [[[40, 50], 0, 10], [[40, 50], 10, 20], [[40, 50], 20, 30], [[40, 50], 30, 40], [[40, 50], 40, 50]]

こんなことになります。

>  [aX, aX[0], aX[1]]の中のaXは、すべて[40, 50]を返します。

2〜3番目の要素はその時点の aX の各要素を指しているのに対して、1番目の要
素は aX そのものを指しているということですね。

aX.object_id # => 68879620
aY.map(&:first).map(&:object_id) # => [68879620, 68879620, 68879620, 68879620, 68879620]

68879620 という値は実行した環境によって違いますが、すべて同じオブジェ
クトを指しているということが確認できると思います。

最後に、たぶん、お望みのものは以下で実現できると思います。

aA.each_cons(2).to_a # => [[10, 20], [20, 30], [30, 40], [40, 50]]
--
Nobuhiro IMAI <nov@yo.rim.or.jp>
Key fingerprint = F39E D552 545D 7C64 D690  F644 5A15 746C BD8E 7106

In This Thread