[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 14:15 / Filesize : 278 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 27



1 名前:1様 [2009/04/02(木) 09:42:23 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9.1 は従来版とは別物であり、書籍や解説やライブラリのサポートがまだありません】
   【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】
    ※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です
    ※ただし 1.8.6 より安定しているとはまだ言えないので、安定性を第一とする用途には 1.8.6 をどうぞ

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/
 ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

331 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 19:30:48 ]
>>330
result << first_only(arr[0])
arr[1,-1].each do |e|
result << usual_process(e)
end

こんな感じが普通だと思う
「あー最初の要素だけ別扱いしたいんだなー」と読み下せる

332 名前:デフォルトの名無しさん [2009/04/13(月) 19:55:34 ]
f = File.open(ファイル)
  # いろいろする!
f.close

closeメソッドを呼んだ時点で、データはフラッシュされていると考えてよいのでしょうか?
それとも明示的にflushメソッドを呼ばないとダメですか?

333 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 19:58:20 ]
普通かどうかは知らないけど(dupしてから)shiftで最初の要素と残りの配列に分けてる。

334 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:00:09 ]
>>332
IO#close は IO#flush を呼ぶ
IO.open のブロックは終了時に IO#close を呼ぶ

ということで、たとえば書き込んだファイルを別名でコピーしたいような場合は、
close またはブロック終了後にcp を行うべき
Ruby では close メソッドを使うことはあまりないので、ブロックを使う記法に慣れてくれ

335 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:02:04 ]
arr[1,-1]

これ、おれはあんまり受け付けないなあ
each_with_index使って、
indexが0のときは別処理みたいな方が自然な気がするが

336 名前:デフォルトの名無しさん [2009/04/13(月) 20:02:09 ]
>>334
わかりました。ありがとうございます。

337 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:10:34 ]
配列がアホみたいに大きい場合、

res << first(a[0])
a[1..-1].each do |e|
 res << rest(e)
end

は配列のほぼ丸ごと複製が行われるのであんまりよろしくない

a.each_with_index do |e, i|
 res << i.zero? first(e) : rest(e)
end

が無難な動作だが、1要素目から最後まで比較する余地なく偽が続くのが若干キモい

res << first(a[0])
1.upto(a.size+1).each do |n|
 res << rest(a[n])
end

というのを思いついて、これは配列 1個で比較も 0回でおそらく高速だが、偏狭的だなと思う

338 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:17:55 ]
apt で ruby を入れたら /usr/bin/ruby や /usr/lib/ruby 以下に
入ったのだが、事情により
ln -s /usr/bin/ruby /usr/local/bin/ruby
して使っていたところ、 gem で入れたものが /usr/local の方に入ってしまって
地味に驚いたことがある。

339 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:24:42 ]
def each_specialize_first(collection, at_first)
 iter = collection.each
 at_first.call(iter.next)
 loop{ yield(iter.next) }
end

each_specialize_first a, lambda{|e| ... } do |e|
 ...
end

とか。



340 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:29:59 ]
普通はどうするもんか、という質問にメソッド定義しちゃう人って何なの

341 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:30:34 ]
top = a.shift
a.each {|x| }
a.unshift top

今はコレが好み。整数を手繰ってどうのこうの、
毎回ゼロか調べてどうのこうのはお腹一杯。
shiftとunshiftってい対応がすき。

342 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:31:34 ]
>>340
熱狂した痛い初心者
つまり、過去の自分

343 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:33:41 ]
>>341
キューって知ってる?

344 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:36:18 ]
一度shiftしたものは最後までshiftするべきだと思う
shiftした時点でそれは配列ではなくqueueなんじゃないかと

345 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:37:17 ]
>>343
オハヨ

346 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:47:09 ]
前にもこんな話あったな。queueだと言い張りたいならQueueクラス作れよw

347 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:52:37 ]
配列の要素をshiftしてunshiftするってのは筋が悪いの?

348 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 20:58:04 ]
>>346
arr[0] と arr[1..-1] で用が済むというか全く同じ動作のはずなのに、
わざわざ shift という名前のメソッドを使うのなら、その配列はキューであるという意図があるはずだろ

349 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:06:09 ]
>>347
配列を pop や shift や push してたら、スタックやキューとして使われてるのかなあ、とは思う
そういう風に使ってないのに、たとえば 0要素目だけを取り出して s に代入するだけの目的で

  s = array.shift

と書いてあったら、ちょっと混乱するかも



350 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:07:48 ]
>>348
ねーよw
同じ動作で別の名前を使うことに意味があるなら
Array#sizeと#lengthの違いを教えてくれよ

>>349
副作用があるからそれはない

351 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:11:15 ]
>>146
キューとして使うという想定も有るとは思うがその言い方はおかしくね?
Array#firstというメソッドが存在する理由はArray#[]のある場所をランダムアクセス的に拾ってくるという意味じゃなく
先頭から要素をいくつか取り出すという意味をコードに持たせる為と解釈している。
それと同様に先頭から要素を切り出す、という意味をコードに与えたいならばshiftを使うのが適切じゃね?

ところでこれはどうかな?
isfirst = true
a.each do |e|
res << isfirst ? first(e) ; isfirst=false : rest(e)
end
数値による範囲指定と数値比較を無くしてみた。がキモさは消せないなあ

352 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:12:08 ]
アンカミスorz
>>348ね。
なんでこんな訳わからんミスしたんだか

353 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:12:52 ]
配列かどうか? 型に拘るのはRubyらしくない。
shiftできるのならそれはshiftできる何かだ!

354 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:14:38 ]
>>350
array をそれ以降使わないのなら動作する

 heading = html.scan(/<h1>(.+?)<\/h1>/).flatten.shift

こんなのとか
1ヶ月くらいずっと、この手の使い捨て配列の最初と最後の要素アクセスを shift と pop でやってた俺が証人だ
試してみるとわかるが非常にめんどくさいので試してみなくてもいい

355 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:16:57 ]
>>354
それこそまさに、なぜArray#firstとArray#lastを使わないっていう

356 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:17:17 ]
>>349
> 0要素目だけを取り出して s に代入するだけの目的で
>  s = array.shift

なにかに代入すうるだけならさすがに
a.firstかa[0]でしょw

取り出すってのが、今の流れの上では大事な特徴。

357 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:20:47 ]
a[0],a[1,-1]とかa.shiftとかしちゃうと、要素0個の配列で例外でるから、
>351とかが無難かね。


358 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:22:27 ]
>>357
配列が 0個でない、とかのチェックはしてあるという前提でいいと思うなあ
配列が空なのにエラー出さずに処理が進むほうが嫌なことが多いと思う

359 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:31:50 ]
配列が空じゃないか?を追加したらどんどんすっきりした記述からかけ離れていく。

配列が 0個でない、とかのチェックはしてなくてもうまく動く方がいいよ



360 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:33:28 ]
> 配列が 0個でない、とかのチェックはしてあるという前提

each_with_indexで回せばそんなの必要ないじゃんw
なんでわざわざ手間のかかる上に間違えやすいやり方を選ぼうとするの?

361 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:33:55 ]
キューとスタックの概念をどう学んでるかに結構依存しそうな感じだ
shift って「pop で上から積んだもの」を下から取るイメージだろ
Ruby の配列を利用する場合は先頭を取り出して詰めるように実装されてるだけであって、
先頭を取り出して詰める目的に shift を使うのはやっぱ不自然だ

ってか、 shift と pop または unshift、push と言われて動作がピンと来るよな?

362 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:36:16 ]
このshiftだキューだうるさい御仁は
shiftメソッドはキューでしか使っちゃだめとか言ってるの?
まさかね。

363 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:40:42 ]
ary[1..-1] だと,書き込まない限り配列そのもののコピーされないので速い
unshiftすると要素をずらすので遅い


364 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:40:56 ]
キューとスタックの話をしようとして、
上とか下とか言われても微妙だなw
それこそ固有の実装を前提にしてないか?

365 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:48:44 ]
もともとの質問は>>330
一応な

366 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 21:59:48 ]
単にこれはPerlとかの文化だろ。

先頭に対するのがshift, unshift
末尾に対するのがpop, push

367 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:01:28 ]
もうshiftとかキューの話はいいんじゃないか。関係ないだろ。

368 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:10:55 ]
で、カッコイイという理由で shift を使ったのが>>341


369 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:12:10 ]
>>363は大嘘なので初心者諸君は忘れましょう



370 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:17:06 ]
>>368
shift したものと shift で残ったものを別々に使うのはなんかキモいな

371 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:25:13 ]
>>370
まあ、そのへんなんだろうな
想定されてる使い方とズレてることを気にする人と、ズレてることを気にしない人

372 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:31:10 ]
アセンブラ上がり的には、
shift/unshiftは横にserializeされてるイメージで、
push/popは縦にstackされてるイメージだな。

373 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:49:02 ]
アセンブラどころかCすらやったことないがそんなイメージだぞ

おれのshift/unshiftのイメージ

□□□□■■■■■■■

おれのpush/popのイメージ

    |
    □
  □□□
□□□□□

374 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:55:40 ]
スタックをピラミッドで組むのは大方のイメージとずれてると思う
というか、てっぺんのアンテナは何だ

375 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 23:00:35 ]
スタックっていったら重ねたお皿だろう

と思ったがRubyとか高水準な言語では
要素の大きさがバラバラなスタックってのもありな気がしなくもない

376 名前:デフォルトの名無しさん [2009/04/13(月) 23:00:59 ]
>>824
マジレスすると初めての場合はちゃんとしたローション使わないと痛さで糞ができなくなるぞ。
お勧めのローションはテンプレをみてくれw

377 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 23:17:50 ]
>>374
真ん中を貫いてる棒だよ。
棒がないと下からひょいっと取り出せるじゃん。
ちなみに「□□□□□」は真ん中に穴があいてる円盤を表現してみた。

378 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 23:21:19 ]
Perlから入った人はpush/pop/shift/unshiftはリスト操作
というイメージが定着してるからな。
アセンブラの人とはかみ合わないさ。


379 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 23:24:58 ]
アセンブラとか関係なく shift や pop はキューとかスタックとかあのへんの操作だと思う

が、そういや Perl は shift や pop を常用していたような記憶がある



380 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 23:25:05 ]
>>369
巨大な配列にa2=a[1..-1]とかやってメモリ使用量見てみろよ

381 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 23:27:04 ]
言いたかないが、Ruby 特有の事情だぜ、
リストをイテレータアクセスする機能が標準でついてて while と shift のコンビが必要ないのとか

382 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 23:29:47 ]
RubyのはPerlを継承したとして、Perlの場合、

shiftはシェルスクリプトのshift
push/popはプログラマなら常識のスタック操作の名前から
とここまではわかる。

unshiftは思いつくものがないんだが、
lwallは単にshiftの打ち消しとしてunshiftと名付けたのだろうか。



383 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 23:31:01 ]
Cにungetcってあるな。


384 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 06:57:55 ]
>>381
shift が本来の意味に集中できる余地があるのはいいことだな

>>380
「速い」「遅い」と書いてあるのでメモリ使用量は参考にならない
というか、Rubyの配列はオブジェクトへの参照のヒモが各要素のセルにどばーっとくっついたスダレみたいな箱だろ
その箱とヒモ自体を作る速度を問題にしてるんじゃないの
莫大な配列だと参照をコピーするだけでも時間がかかると
範囲オブジェクトやInteger#uptoで添え字を増減させてアクセスするなら参照の複製すら行われないから少なくともその分速いと

385 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 07:07:07 ]
Array#shift はオブジェクトそのものは維持する

386 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 08:38:39 ]
>>373 はスタックとハノイの塔を脳内でマージしている。


387 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 08:52:27 ]
jarp.does.notwork.org/diary/200810c.html#200810211
if (first=true)..false and first
...
end


388 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 09:08:09 ]
うおきめえ
というか実際に動かさないとなにやってるかわからんな(w

389 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 11:15:16 ]
>>384
だからメモリの使用量見れば巨大な参照の列のコピー自体が起きてないことが分かるだろうに




390 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 12:26:27 ]
>>384
> その箱とヒモ自体を作る速度を問題にしてるんじゃないの

箱ごとシェアするんだよ。これ実行してみろ。

a = [1]*10000000
t = Time.now
10.times { b = a[1..-1] }
p Time.now - t
t = Time.now
10.times { b = a[1..-1]; b[0] = 0 }
p Time.now - t

391 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 12:29:15 ]
ブログラムコードに対する形容詞の「きもい」の意味がわからない

392 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 12:36:13 ]
グロいってのはよく言うけど、それよりは褒め言葉に近いニュアンスがあるような気がする

393 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 12:40:44 ]
{ } begin endが混在するのがキモイ
OOPLなのに関数があるのがキモイ

394 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 13:12:38 ]
良いプログラムの定義を仮に「単純で美しく、論理的に明確ですっきりしている」とすると、
キモイというのは「動くことは動くが良いプログラムとはほど遠い」ということだろう。
大抵「なんでこんなことやってるの?」とか感じると思う。
知ってる知識を使うことが目的になって、かえってごちゃごちゃにするやつは割と見かける。

395 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 17:44:57 ]
PRaggerのTracとPRagger wikiがあらされまくってんだけど、なんとかしろよ。
どこ言えばいいんだこれ。
更新してないのかもしれんが放置せず管理しろ。
今時スパムフィルターくらいいれろ。あと、メールかなんかで通知されるように設定しろ

PRagger - Trac
pragger.ikejisoft.com/

FrontPage - PRaggerまとめサイト それPra
garyo.sakura.ne.jp/ruby/pragger/index.php?FrontPage

396 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 18:21:02 ]
おいおい落ち着けよ






・・・ってRubyでPlagger使えたのかよおぉぉおおぉおぉおおおお!!!

397 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 18:54:59 ]
>>395 IKeJIだろJK

398 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 21:03:18 ]
RubyでPostScriptファイルの情報を取得して表示しようとしているのですが
RMagicで印刷枚数、部数、プリントサイズ、モノクロかカラーかって取得できますか?
ImageMagicをコマンドラインで動かすのは面倒なんですが、
RMagicは画像の加工でしか使えないですかね?

399 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 21:16:35 ]
取得できる情報はここにあるだけかも。
studio.imagemagick.org/RMagick/doc/imageattrs.html




400 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 22:43:49 ]
>>390
へえ、なるほど
部分配列のコストなんて考えたこと無かったけど
元の配列とシェアするんですね
で、代入された時点で初めて完全なコピーが行われる
もとの配列の要素が増減した時にもちゃんとコピーされる
上手いこと出来てるなあ
require 'benchmark'
def bm(mes,&b) print mes;puts Benchmark.measure(&b) end
a = [1]*10000000
b =nil
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}
bm('部分参照'){b=a[1..-1].size}
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}


401 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 22:49:48 ]
あ、間違ってた
bm('部分参照'){b=a[1..-1].size}
じゃなくて
bm('部分参照'){b=a[1..-1]}
でした

でも、参照した影響っていつまで残るんでしょうか
部分配列を参照して使い捨てた後でもコピーが起こってるみたいなんですけど
require 'benchmark'
def bm(mes,&b) print mes;puts Benchmark.measure(&b) end
a = [1]*10000000
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}
bm('部分参照'){a[1..-1]} #使い捨て
GC.start
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}


402 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 22:53:45 ]
結局動作上は即レスの>>331が無難なのか

403 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 22:55:16 ]
>>402
誰でもすぐ思いつく泥臭いのがうまくいくことも多いってことだな

404 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:00:41 ]
ベンチマーク取ってみるとRangeとか使って添字で回すより、
部分配列でeachした方が速かったり

405 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:06:27 ]
>>402
配列の要素が2つ以上無いと例外になるってばさ。
「最初の要素だけ特別な処理」って時に要素一つだけの配列を
渡されるケースもそんなにまれではなさそうに思うんだけどな・・・

なんか揉めてたが、動作的に無難っていったら>>341かもよw

406 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:10:10 ]
>>405
いやそれなら配列以外を渡されるチェックもすべきだろ
Enumerable だけ対応して shift メソッドが定義されてなかったらどうする

407 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:12:21 ]
うむ、rescue ブロックが100行くらいついてない時点でどれも論外だ

408 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:21:37 ]
真珠を継承しちゃったおかげで、悪い所も継承しちゃった感じだな。
そろそろ反省して次の言語来る?

409 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:24:34 ]
>>405
irb(main):001:0> [1][1..-1]
=> []

要素1つでも問題ない



410 名前:405 mailto:sage [2009/04/14(火) 23:24:51 ]
なんか勘違いしてた。要素が一つあれば例外にはならないのね。
あと、その後のレスでもみんなさりげなく翻訳してるが、
arr[1,-1] は arr[1..-1] なのな。

>>406
お題が配列だし、そこまで行くと何もシンプルには書けないような(´・ω・`)

411 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:24:57 ]
>>405
snippetとか例文とかそういう概念はないんか

412 名前:405 mailto:sage [2009/04/14(火) 23:26:57 ]
なんか言い訳が間に合わなかったZE!
しばらくROMってます(´・ω・`)

413 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:28:37 ]
要素が0個のときうまくいかねーって

414 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:54:38 ]
a = [1,2,3,4,5]
top = a.shift
a.each {|x| p 1}
1
1
1
1
a.unshift top => [1,2,3,4,5]


a = []
top = a.shift
a.each {|x| p 1}
a.unshift top => [nil]


こうしてくだらないバグがこの世に一つ増えるのだった

415 名前:デフォルトの名無しさん [2009/04/15(水) 00:17:16 ]
プログラム関係ないけど、Ruby使いの人はどんなエディタ使ってるの?
gvim使ってるけどVisualStudioしか使ったことなかったから
インテリセンスなっしんぐのエディタは結構きついです・・・

416 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 00:20:24 ]
NetBeansが続々とスクリプト言語に対応していってる。
でも型情報が無いからインテリセンス並のコード補完は期待できないな。

417 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 00:24:26 ]
Aptana Studio。RDTとRadRailsね。

Rubyは変数の型を動的に変えられるから、
インスタンスメソッドだとインテリセンスはほとんど役に立たないよ。
クラスメソッドならOKだけど。ステップ実行は便利。

418 名前:デフォルトの名無しさん [2009/04/15(水) 00:25:19 ]
いまんとこ、対応してるIDEはNetBeansとEclipsだけですか?

419 名前:デフォルトの名無しさん [2009/04/15(水) 00:31:01 ]
Rubyならばここだぜ
www.tech-arts.co.jp/technologies/new-technologies/ruby-on-rails.html



420 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 01:09:54 ]
>>414
「配列の最初の要素だけ別処理する」という仕様に対して、
長さ0の配列が渡されたら何もしないのが正しいと言い切れるの?

421 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 01:22:26 ]
>>401
>参照した影響っていつまで残るんでしょうか

sliceすると、sliceされた配列も新しく出来た配列もシェア状態になる。
シェア状態になった配列を破壊的に変更するとコピーが起きる。
コピーがされたらシェア状態じゃなくなる。

というわけで、破壊的変更がされるまで。

422 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 01:24:15 ]
以前からArrayはcopy on writeに違いないと訳もなく信じていたのだけど、
今回の話でちょっと興味を持ったので少し実験してみた。
もしかして一部分でも書き換えたら、巨大な配列だろうと丸コピーしてる?

irb(main):001:0> a = Array.new(1<<24) { |i| i } # メモリ使用量70MB程度
irb(main):002:0> b = Array.new(1<<8) { a[1..-1] } # メモリ使用量そのまま
irb(main):003:0> b.each { |e| e[0] = 1 } # たった256要素も変更できない
NoMemoryError: failed to allocate memory
from (irb):3:in `[]='
from (irb):3
from (irb):3:in `each'
from (irb):3
from :0

ソースを読むだけの気力も能力もないので適当なことを言わせてもらうけど
配列をブロックに小分けするようなことはしていないようにみえる。

ガチガチの配列ならともかく、RubyのArrayってどこにでも追加削除可能な
万能コンテナみたいだから、内部的にはある程度の長さのブロック(配列)と
ハッシュやツリーなんかの混合構造の方が効率良さそうに思えるけど。
それとも、やり過ぎて添字アクセスが遅くなるのを嫌っているのかな?

423 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 02:05:38 ]
>配列をブロックに小分けするようなことはしていないようにみえる。
その通り。

>ハッシュやツリーなんかの混合構造の方が効率良さそうに思えるけど。
>それとも、やり過ぎて添字アクセスが遅くなるのを嫌っているのかな?

たぶん、ちゃんと検討されたことはない。でも、

- この最適化で速くなるRubyプログラムは少なそう(多いというなら説得が必要)
- わずかだろうけど遅くなるプログラムは結構ありそう(添字アクセス)
- 配列がflatなメモリだと期待している拡張ライブラリ(非常に多い)が動かなくなる

というあたりから、標準のArrayに組み込むのは微妙かなあ。
SparseArrayみたいな別ライブラリがいいと思う。やるとしたら。

424 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 03:07:21 ]
java で、
Vector → ArrayList
さらに LinkedList や CopyOnWriteList と、言語のバージョンが上がるごとに List の派生クラスが増えていったように
Ruby も Array の派生組み込みクラスが作られていくかな?

Ruby の文化からすると、あまりそういうことはしなさそうだけど。

425 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 05:18:29 ]
>>422
ttp://i.loveruby.net/ja/rhg/book/object.html

426 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 05:48:59 ]
>>425

422じゃないけど、Rubyの場合は
基本的に変数はすべて参照になっているって事でいいのかな。

irb --prompt simple
>> a = [1, 2]
=> [1, 2]
>> b = a
=> [1, 2]
>> a << 3
=> [1, 2, 3]
>> a << 4
=> [1, 2, 3, 4]
>> b.size
=> 4
>> b
=> [1, 2, 3, 4]

この場合、aとかbってのはただのラベルで配列の実体は別の場所にあるってことでいい?

427 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 06:53:21 ]
> 基本的に変数はすべて参照になっているって事でいいのかな。
いいと思うけど、俺にアンカーつける必要なくない?
他にもいい人はたくさんいるよ

428 名前:422 mailto:sage [2009/04/15(水) 08:15:18 ]
>>423
組み込みオブジェクトの内部表現が変わってもスクリプト側には
影響ないと思ってたんだけど、拡張ライブラリが駄目なのか。

>>424の言うように派生クラスにするか、Arrayを初期化するときに
内部実装を選択するヒントとかパラメータを指定できるようになれば
面白いかなって思ったんだけど。


>>425
これ、Ruby Hacking Guideってやつだよね?
Webで見れたとは、こりゃありがたい。
後でゆっくり読ませてもらうわ。

429 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 08:32:04 ]
初心者スレだったんだっけ

>>426
オブジェクトを「捕まえる」「入れておく」ことはできない
名前で参照するしかない
変数に対する = は、"右辺" の指すオブジェクトに新たなラベルをつける行為で、本当は「代入」ではない
irb> a = [1, 2]
irb> b = a
irb> a << 3
irb> p (a.object_id == b.object_id)
true

で、スレ的にもこれだけでいいと思うんだが、こっからがめんどい
irb> a = [1, 2, 3, 4, 5]
irb> p (a[0..2].object_id == a.object_id)
false

a と a[0..2] は違うオブジェクトなので、
  [1, 2, 3, 4, 5]
  と
  [1, 2, 3] ← a[0..2] が返す、できたてほやほや配列
という2つの配列オブジェクトが(Rubyの「オブジェクト置き場」に)存在しているように感じるが、実は
  [1, 2, 3, 4, 5] <共有済>
  と
  <注: id:3324 の配列を共有、0要素目から2要素目までを返す、ただし、破壊的変更が来たら配列内容をコピーして保持する>
という、1つの「share された」配列と1つの「share した」配列になってる
これらは自分が share 関係にある配列と自分が share 状態であるということを覚えていて、破壊的変更が自分に来たら share 関係にある配列にそれを通知する
通知または破壊的変更がきた場合の動作は
 ・ 自分が共有元(a)である場合は share 状態を解除し普通の配列に戻る(破壊的変更を自分が受けていた場合は受け付ける)
 ・ 自分が共有先(a[0..2])である場合は共有元の要素の参照をきちんと複製して share 状態を解除し普通の配列に切り替える
ということである、というようなてきとーな理解でいいか>>421
array.c を読めばなんか書いてあるのかね



430 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 08:40:40 ]
この最適化が入ることで、逆にそれ以外のところが遅くなるはずだが、
配列って部分参照することってそんなにあるっけ?


431 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 08:43:53 ]
>>429
ん、単純に

[ <id:0011>, <id:0013>, <id:0015>, <id:0018>, <id:0411> ]

という普通の配列と

[ a[0], a[1], a[2] ] # a が変更されたらオブジェクトIDの参照に切り替えること

の関係になるという話なんじゃないの?
や、こんな 2段階やるくらいなら最初から [ <id:0011>, <id:0013>, <id:0015>] という配列作っとけよ、という感じではあるんだが






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<278KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef