vieweditattachhistoryswikistopchangessearchhelp

Smalltalk: 10 個の空の an Array を要素に持つ an Array を作って返す

いつも悩むので、なにか美しい書き方があれば是非。テンポラリ変数は新たに設けない方向で。--sumim

  Array new: 10 withAll: Array new
これだと、全要素が同一の an Array になってしまう。
| array |
array _ Array new: 10 withAll: Array new.
array first == array last

=> true
この手の顕在化しにくいバグは多い。

  #(()()()()()()()()()())
ま、お約束ということでこれでもいいのですが、できたら n 個でも使える手をお願いします(^_^;)。

  Array streamContents: [ : stream | 10 timesRepeat: [stream nextPut: Array new] ]
(1 to: 10) collect: [ : void | Array new ]
(Array new: 10) collect: [ : void | Array new ]
(Array new: 10 withAll: [Array new]) collect: [ : each | each value ]
(Array new: 10 withAll: 'Array new') evalStrings
(1 to: 10) inject: (Array new: 10) into: [ : array : index | array at: index put: Array new; yourself ]
((1 to: 10) inject: OrderedCollection new into: [ : collection : void | collection add: Array new; yourself ]) asArray
0 adaptToCollection: (Array new: 10 withAll: Array) andSend: #new:
(Array new: 10) gather: [ : each | Array with: Array new ]
(Array new: 10) in: [ : array | (1 to: array size) do: [ : index | array at: index put: Array new ]. array ]
[ : array | 1 to: array size do: [ : index | array at: index put: Array new ]. array ] value: (Array new: 10)
--sumim

  (Array new: 10 withAll: Array new) deepCopy
でいかがですか。--abee


おお。すばらしいですね。deepCopy は思い付きませんでした。ありがとうございます。--sumim

絶対にすみさんが好きになりそうなやつとしては、

  | c |
  c _ OrderedCollection with: Array new.
  c addAll: c.
  c add: Array new.
  c asArray deepCopy.

とか(試しているうちに無限ループに入っても責任は持ちません)。--Yoshiki

縦棒がswikiに解釈されることを忘れていた...不覚。というわけで、

  ((OrderedCollection with: Array new) ifNotNilDo: [:c | c addAll: c]; add: Array new; yourself) 
    asArray deepCopy

9の累乗のものを作るときとかには便利^^;--Yoshiki

>縦棒がswikiに解釈される
行頭にスペースを入れれば大丈夫です。ここでは流れ的に各行頭に = を入れていただければよろしいかと(入れておきました。スクリプトもお題に沿うようにちょっと手を入れました)。

#addAll: がおもしろい挙動を示しますね。不思議。
どうやら 8 回繰り返してあきらめているようですね。
この手の御法度は、(試してもみずに(^_^;))無限ループになるものだとばかり思っていました。--sumim

最初のバッファサイズを越えてmakeRoomAtLastするまでいけるので、さらに

  ((OrderedCollection new: 11) ifNotNilDo: [:c | c add: Array new. c addAll: c])
 asArray deepCopy

とすればすこし短く(?)なります。勝手に問題を変えていました。すみません。-- Yoshiki

このページを編集 (2737 bytes)


Sorry! このページは Swiki ブック内で孤立しています。

This page has been visited 1835 times.