- 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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
- 321 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 15:06:39 ]
- __send__: とにかく絶対にリフレクションでメソッドを呼びたい
send: 基本的にただメソッドを呼ぶだけのつもりだけど、中でどうするかはレシーバに決めて欲しい とかかな。 pとかrequireとかにカッコはつけたくない。 けどs2 = s1.sub(/hoge/, '') とかにはつけたい。 ってことで右辺値かどうかが一番でっかいと思う>カッコの省略
- 322 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 15:18:33 ]
- えーと…、
__hoge__ とアンダースコア前後2個つきで書く意図自体は他の言語でも有名だし理解してもらえてるよね? 既存の hoge 、またはユーザー定義の hoge と被らないように「普通ありえない名前」にする、という意図
- 323 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 15:33:15 ]
- >>322
他人に理解してるか聞く前に、自分がスレの流れを理解できるてるか自分の心に聞け
- 324 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 16:23:31 ]
- gem でインストールした各種ライブラリのソース、ドキュメント(Rdoc?) は、ローカルPCのどこに格納されるのでしょうか?
たとえば Rails の rescue.rb というソースを見たい場合、 api.rubyonrails.org/ の左のペインから ActionController::Resuce をクリックして api.rubyonrails.org/classes/ActionController/Rescue.html を見ると、HTML の上に In: vendor/rails/actionpack/lib/action_controller/rescue.rb と 表示されますが、これがどこかわからない。 自分は Ruby を c:\ruby\ruby-1.8.5-i386-mswin32 にインストールしていて、 以下のように rails をインストールした。 gem install rails -v 2.1.1 --include-dependencies んで、c:\ruby\ruby-1.8.5-i386-mswin32 の下で、"rescue.rb" を検索したら、 c:/ruby/ruby-1.8.5-i386-mswin32/lib/ruby/gems/1.8/gems/actionpack-2.1.1/lib/action_controller/rescue.rb が見つかったのですが、これがソースの実体ですか? In: vendor/rails を、ローカルのどのように読み替えたらいいのかわからないです。
- 325 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 16:36:07 ]
- gem environment gemdir で出てくるディレクトリが vendor で、 その下の固定 gems ディレクトリが rails ディレクトリだな
rubygem ライブラリのソースを参照することが多くなると思うが、全ては gemdir 以下に入ってる
- 326 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 16:38:12 ]
- >>323
__send__ は send が被らないように作ったメソッド名だ、という指摘のどこが変? __ つきメソッドが何か特別扱いの動作をする予約名メソッドだという勘違いは初心者によくあるぞ?
- 327 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 16:57:21 ]
- そんな指摘してねーだろカス
- 328 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 16:57:38 ]
- 結局 >>322 はひとりごとってこと?
内容の是非は別にして
- 329 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 17:06:15 ]
- >>326
指摘の内容が変とかそれ以前の話で、 お前は誰に指摘したんだ?ってことでしょ。
- 330 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 19:25:15 ]
- 配列の最初の要素だけ別処理をしたいです
どう書くのが普通?
- 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された配列も新しく出来た配列もシェア状態になる。 シェア状態になった配列を破壊的に変更するとコピーが起きる。 コピーがされたらシェア状態じゃなくなる。 というわけで、破壊的変更がされるまで。
|

|