[表示 : 全て 最新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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

702 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 11:21:11 ]
~/.irbrcに最低これくらいは書いとくよね

# vim:ft=ruby
require 'irb/completion'
__history__ = File.expand_path('~/.irb_history')
File.foreach(__history__) {|line| Readline::HISTORY.push(line.chomp) }
END { File.open(__history__, 'w') {|f| f.puts Readline::HISTORY.to_a.join("\n") } }
IRB.conf[:PROMPT_MODE] = :SIMPLE


703 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 11:34:09 ]
あーいるよな、デフォルト設定の話してるときに「カスタマイズすればいい」とか脳のとろけた話する奴

704 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 12:06:20 ]
もんだいはどちらがコストが低いかと言う話になる。
この場合、カスタマイズの例を実際に >>702が出してくれたので、
irb本体に手を入れるよりよほど簡単である。

許されてもよいのではないか。

RubyGemsで一発で解決することに対して、数行のモンキーパッチで解決するならまだしも、
長々とスクリプトを書くのであれば、どちらがコストが低いかは自明

705 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 12:20:13 ]
自演乙

706 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 14:09:22 ]
まあそのへんは果てしなくどうでもいい

707 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 14:53:41 ]
自分用のスクリプトで引数にキーワードハッシュでも文字列ハッシュでも通常引数でも動作するようにしたり
クラスメソッドでparseみたいな総合一連動作メソッドを作りまくったりしてると
YAGNIということばを思い出す

オチはとくにない

708 名前:デフォルトの名無しさん [2009/05/04(月) 17:18:06 ]
標準入力から読み込んだ画像を表示するビューアを探しているのですが、探す暇もない(面倒)なので
自分で簡単なビューアを作ろうとruby-gtk2のリファレンス読んでいたのですが...
(まあこんな感じ cat image.jpg | imageviewer)

Gtk::Imageをざっと目を通したところ、画像ファイルの名前を指定するようですが
$stdin.read とか指定できませんかね?

709 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 17:50:50 ]
あのへんはRuby関係ないからなー

710 名前:デフォルトの名無しさん [2009/05/04(月) 17:55:29 ]
708だけど、imagemagickで実現できたわ(^^
$ cat image.jpg | display でおk。

まあimagemagickも/tmp/magick-Xxxxのような一時ファイルを作成しているから
同じようにすればいいのかな。。



711 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 18:35:20 ]
>>709
2ch は、7割が脱線で出来ています。

712 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 20:05:28 ]
>>708
前に画像ビューア作ってたとき、漏れはこんな感じで
PixbufLoaderとcairo使ってごにょごにょやってた

require "gtk2"

ploader = Gdk::PixbufLoader.new
ploader.write($stdin.read)
ploader.close

drawing_area = Gtk::DrawingArea.new
window = Gtk::Window.new
window.signal_connect("destroy") do
Gtk.main_quit
false
end

drawing_area.signal_connect("expose-event") do |w, e|
context = w.window.create_cairo_context
context.save do
context.set_source_pixbuf(ploader.pixbuf)
context.paint
end
true
end

window.add(drawing_area)
window.show_all
Gtk.main

713 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 20:29:24 ]
なんでRubyでそういうの作ろうと思うのかね
もしかしてRubyしか使えないとか?

714 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 20:34:41 ]
Rubyからアクセスすれば簡単手軽に作れるからだろ


実際問題として簡単でも手軽でもないような気もするがまあそれはそれで

715 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 20:41:59 ]
楽だから

716 名前:デフォルトの名無しさん [2009/05/04(月) 20:44:45 ]
Rubyで書くと おちんちんきもちいいお(´;ω;`) だから

717 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 22:25:51 ]
708でも712でも無いけど、どうしても速度が欲しければjavaかCで書く
でも普段はそんなん必要ないから楽ちんなrubyで書く
>>713なら何で書くのさ?アセンブラ?まさかマシン語とか?

718 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 00:39:46 ]
vistaのローカルにいれているRubyの1.86を
1.9xにアップグレードしたいのですが
インスト方法どこかに書いてありますか?


719 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 00:58:12 ]
それはアップグレードではなくアンインストール後の新規インストールになるな

720 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 01:18:23 ]
>>718
あなたは、1.9x を使う要件を満たしません。
1.8x を使い続けてください。



721 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 01:20:10 ]
まだヘソ曲げてんのかよw

722 名前:718 mailto:sage [2009/05/05(火) 01:57:45 ]
できました。
1.86アンインスト

1.9x解凍、C:\に置く

windowsのシステム環境変数書き換え

でしたね、できました。
複数バージョン置けたんですかね。
記法が変わりすぎで1.9xの中心にしか
覚えませんが。。

723 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 16:05:42 ]
RDEを使いたいと考えて、インストールして、実行してるんだけど
以下のコードを書いたらエラーっぽいメッセージがRDEから出でる。

----------------------
a = []
a.each do |x|
x.
----------------------

メッセージ
Access violation ta address 004B0137 in module 'rde.exe'.Read of address 00000015.

x.の"."を打ったところで出るので、オブジェクトのメソッドを取得しようとして失敗しでもしてるのだろうか?
エラーメッセージをとりあえず無視してるのだけど、気味が悪いので、対策知ってる人がいたら教えてください。



724 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 19:19:30 ]
    || 時刻1 | 時刻2 | 時刻3 | …
------------------------------
分類1 || d_1_1 | d_1_2 | d_1_3 |
分類2 || d_2_1 | d_2_2 | d_2_3 |
分類3
  :

というスプレッドシートっぽい概念がしっくり来るデータがあります
(実際は2系統が直接関連付けられてないバラバラなハッシュです)

データ.category("分類1") とすると [d1_1, d1_2, d1_3, ...] というようにす

725 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 19:21:48 ]
…悩んでたら途中で送っちゃった
こんなごっつい構造のデータでなくてもいいような気がさっきからずっとしてるので
とりあえずキャンセルしますごめんね

726 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 19:51:04 ]
キャンセル吹いたw

727 名前:受付嬢 mailto:sage [2009/05/05(火) 21:45:30 ]
また、いらしてください

728 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 22:36:29 ]
以前から不思議だったんだが
RDEはなぜこれほどまでにバグだらけなのだろう
何か理由があるのだろうか

729 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 22:39:43 ]
マジレスすると玄人が使わないからバグ報告が少ないとかじゃないか

730 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 22:53:24 ]
どこからかだったか忘れたけど

require 'irb/completion'
require 'irb/ext/save-history'
IRB.conf[:SAVE_HISTORY] = 99999
IRB.conf[:PROMPT_MODE] = :XMP
require 'pathname'
require 'fileutils'
require 'uri'
require 'pp'




731 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 22:55:50 ]
使われない→バグが取れない→使われない・・・・の
負のスパイラルに陥ってる可能性が

732 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 23:31:59 ]
剰余の挙動が意味不明で躓きそう
0xcc.net/blog/archives/000083.html
こんなもんなんすか?

733 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 23:50:54 ]
>>732
スレタイのRuby初心者となんの関係もない話題だが、
Division and Modulus for Computer Scientists でも読んでみたら?

734 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 00:55:50 ]
>>733
ttp://research.microsoft.com/en-us/um/people/daan/download/papers/divmodnote-letter.pdf#search=%27Division%20and%20Modulus%20for%20Computer%20Scientists%27
Floored divisionってくだりですね。
剰余と除数の符号が揃うまで
試行する。。なるほど。。

Web業界とはいえ企画職で
文系には小一時間かかりました(笑
ありがとうございます。

735 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 07:14:15 ]
>>732
おいおいスクリプト言語ぜいが全然周りと違ってて吹いた。
下手するとハマるね、これは。
こういうのって何かで規定されてないのかね…。

AA化してみた

負の剰余

       C   Java   PHP  Emacs Ruby Python Perl
      (GCC (Sun JDK 4.3.10 22.0.50.2 1.8.2  2.3.5  5.8.4
      3.3.5) 1.5.0_05)   -16
 -3 % 5  -3   -3     -3   -3    2     2    2
.  3 % -5   3    3     3    3    -2   -2  -2
 -3 % -5  -3   -3     -3   -3    -3   -3  -3

こんなプログラムはいやだ: 負の剰余 - bkブログ
0xcc.net/blog/archives/000083.html

736 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 08:03:39 ]
個人的にはスクリプト言語勢の振る舞いがしっくり来るなあ。
しかし数学的な定義はないのか?ありそうだが。

737 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 08:16:14 ]
定義されてるよ。

「 A mod B は "AをBで割った余り"」だから「B と商 x をかけて剰余を足すと A に戻る」でいいよな?

-3 mod 5 = -3 だとする場合 (C言語)
 5 と 商 0 をかけて剰余 -3 を足すと 5 * 0 + (-3) = -3 に戻る…正解
-3 mod 5 = 2 だとする場合 (スクリプト言語)
 5 と 商 -1 をかけて剰余 2 を足すと 5 * (-1) + 2 = -3 に戻る…正解

ということで、そもそも2通りあるから、「どっちでもいい」。
手計算の世界では「剰余は商より小さい正の整数」という条件がついてたりするんだけど
(「10割る3」は「商3余り1」であるべきで、「商4余り-2」ではないと習ったはず)
C言語は「割られる数が負なら絶対値で計算して結果を負に変換する」という流儀に従ってる。
まあ、剰余に関しては言語のマニュアル必ず読めって感じだな。

738 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 08:41:01 ]
CやC++なんかの仕様では
  「割る数と割られる数の両方が正である場合は商と剰余は必ず正であるが、
  少なくともどちらかが負である場合は定義しないので処理系が得意なように作れ」
とかヤな感じに丸投げなことが書いてあったはず

739 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 08:50:02 ]
>>738
CやC++の場合は、コンパイラが、「俺は知ったこっちゃねぇ。CPUに任せる」という
コード生成ができるという利点がある。

740 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 08:57:32 ]
ってことは正確を期したいならどんな言語使うにせよ
正負の確認処理を挟むべきってことか



741 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 09:00:49 ]
負の除算は意図をもって行われるべきだってことだね
まあ、コンピュータにおける除算自体がそもそも日常視点では怪しさのカタマリだから慎重になるべきなんだけどさ

742 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 09:02:23 ]
>>740
確認したってどうせ一つしか結果は出てこないんだから、
それなら最初から自分で関数組んだ方がw

743 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 09:09:01 ]
一般的用途においては割る数と割られる数の両方を事前に絶対値とって使うべきかね
剰余を使う機会で負になるのはたいてい割られる数だし

744 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 09:26:39 ]
>>723
hpcgi2.nifty.com/sakazuki/forum/wwwforum.cgi?id=1&az=thread&number=250
自分の場合、ここを参考にver1.0.1をインストールした後にver1.1.1を上書きインストールしたら
エラーが出なくなった。

745 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 10:09:29 ]
>>744
ありがと!
足りないファイルを1.0.1からコピーしたらエラーでなくなったよ

746 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 10:23:58 ]
>>735
>>736

数学的にどうこうってのは737の書いたとおりで
en.wikipedia.org/wiki/Modulo_operation
に、いろんなプログラミング言語でどっちなのかまとめている表があるよ。

両方持ってる奴もあるんだなw


747 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 17:37:44 ]
rspec 使って遊んでます

「大量のファイルやら外部参照やらがあり、きちんと動作することが現状
 おおむねわかりきってるひとまとまりの部分のテスト」

「今テストしたい部分を繰り返しテストして試す」
という行為にちょっとジャマ(処理に時間かかるし、ファイルアクセスがなんとなく無駄)です

if false # 終わったので一旦スルー
 …
end

で囲うというのも考えたんですが、なんかこうスマートな考え方はないもんでしょうか?

748 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 18:02:36 ]
>>747
つ pending

外部と接続する部分は、mockがうまく利用できる形に持っていくのもよい。


749 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 18:38:14 ]
>>747
スペックファイルを分割すればいいのでは?

750 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 18:44:56 ]
ネットからファイルを取得する処理のあるスクリプトなんかは困るよね
specコマンド連打するたびにGETが大量に起こったり



751 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:25:25 ]
そんなの、specファイルの中でメソッド再定義すればいいじゃん
サーバへアクセスしてる部分を事前に保存しておいたローカルのファイルを読むように書き換えればいい

752 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:32:53 ]
specファイルの中でオリジナル書き換えたらオリジナルのテストになんねえよ

753 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:35:55 ]
なんという正論

754 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:39:41 ]
>>752
そのメソッドをテストするときだけオリジナルの動作になれば問題ないだろ
html = $TEST_HOGE ? File.read("local.html") : open(uri).read

755 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:43:27 ]
「実際にネットワークからモノを取ってくるオブジェクトX」自体
のテストではネットワークを使わざるをえないが、それのテストが
十分出来ているなら、Xの利用者をテストする際には、Xはmockで
代用できる。






756 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:50:49 ]
>>754
実質的な動作は同じだしな
テストできないで終わるよりずっとマシ

757 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:12:53 ]
>>754
だからこうするんだってば
def get(uri)
 return uri.read
end
  ↓
def get(uri)
 return File.read('local.html')
end


758 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:21:04 ]
>>757
微妙・・・
テスト内の複合バグとかさくさく作り込みそうに見える。
元のコードがみんなシンプルなものならいいかもしれないけど。
mockとかstubってのはそういう書き換えをしなくていいためにあるんじゃないの?

ttp://www.ibm.com/developerworks/jp/web/library/wa-mockrails/
とか
ttp://d.hatena.ne.jp/takihiro/20081023/1224762895
とか読んでも全く使い方はわからんかったが

759 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:27:58 ]
コストのかかる部分を全部メソッドとして吐き出せるようにクラスを作る
そうすればその部分のメソッド定義を書き換えるだけでテストが書きやすい

760 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:30:49 ]
インスタンス変数をメソッド内で利用するとテストで条件変えたときに書き換えられないから、
全部引数で渡すようにするのがポイント



761 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:33:50 ]
RSpecのテストに対応させてスクリプトを作ると諸記述が2ランクくらい退化するというのはよくある

巷のRSpecの解説は一番大事なことをあえてすっ飛ばしてると思うんだ

762 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:35:00 ]
>>759
なるほど

>>760
こっちは・・・どうなんだろう。

いずれにせよ、テストしやすい書き方も大事ってことか。

763 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:39:02 ]
>>761
describe と before と it と should と eql しか使わせる気がなさそうな説明はいくつか…
これしか使わなくてもテストは書けるのでタチが悪い
これ以上のことを説明する気がないのならむしろRSpecを使わせないほうが効率も能率も高い

764 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:41:20 ]
>>763
なにそのるびま

765 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 21:11:43 ]
rspec といえば、あれって「○○と表示されること」をテストするのってどうするん?

766 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 21:40:48 ]
>>764
素晴らしい先駆者であるがゆえに失速の影響が…


えー、「内部の○○メソッドを今は動作したことにしたい」というカジュアルな用途には、stub! が使えると思われ

require 'spec'; require 'open-uri'
class Hoge
def get(uri); open(uri).read; end
def pick_title(uri); get(uri).scan(/<title>(.+?)<\/title>/).to_s; end
def main
pick_title('www.example.com/')
end
end
# -----------------------
describe Hoge do
before :all do
@hoge = Hoge.new
end
describe "#main: サーバからHTMLを取得してタイトルを表示する" do
it "たいとる!" do
@hoge.stub!(:get).and_return('<html><title>たいとる!</title></html>')
@hoge.main.should eql('たいとる!')
end
end
end

「@hoge の get メソッドが呼ばれたときは処理を横取りして and_return の引数を代わりに返すようにする」という記述
あんま小難しいこと考えなくていいのでとっても便利

767 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 22:23:06 ]
…これはこれで stub! ばかりになりそうw

768 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 03:40:20 ]
rspecにはTest::Unitの-nオプションみたいにテストを限定する方法はないの?

769 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 05:45:40 ]
>>750
つ FakeWeb

外部URLを偽装するテスト用ライブラリ「FakeWeb」
doruby.kbmj.com/x5r_on_rails/20090427/_URL_FakeWeb_1

MOONGIFT: ≫ Web API/Mashup開発者に必須!オフラインでも外部アクセスをテストできる「FakeWeb」:オープンソースを毎日紹介
www.moongift.jp/2009/04/fakeweb/

まあ、こういうのをスタブ?っちゅーらしいが

770 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 00:15:40 ]
str = String.new
p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65

#ふー。。。



771 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 11:35:21 ]
require 'pstore'
h = Hash.new{|h, k| h[k] = Array.new}
h[0] << 'a' << 'b' << 'c'
PStore.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h}

これを実行すると
/usr/lib/ruby/1.8/pstore.rb:349:in `dump': can't dump hash with default proc (TypeError)
と言われます。
既存のハッシュを「無難な」ハッシュに変換してそれをまた戻す方法とかないもんでしょうか

772 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 11:46:17 ]
うわー
それじゃデフォルト値つきの配列やハッシュって駄目じゃん
普通の配列やハッシュのつもりで誰がMarshalするかわからないんだし怖くて使えん

773 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 11:48:31 ]
hh = Hash[h] ではどう?

774 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 11:51:42 ]
>>772
Proc つきのまま外に出すなってことなんだと思う
デフォルト値つきのハッシュはデータ製作用の仮形態のみにしておく

require 'pstore'
def makedata
h = Hash.new{|h, k| h[k] = Array.new}
h[0] << 'a' << 'b' << 'c'
return Hash.new.merge(h)
end
h = makedata
PStore.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h}

これなら動作する
開発者側が気を遣えってことなんだろうな

既存の誰かが作った(そしてどこに初期値つきハッシュが使われてるのかよくわからん)データを
マーシャル可能な形態に変換する方法は知らん

775 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:01:39 ]
>>771
いっそのことYAMLにしてしまうとか
require 'pp'
require 'yaml'

#h = {0 => Array.new}
h = Hash.new{|h, k| h[k] = Array.new}
h[0] << 'A' << 'B' << 'C'
h["mage"] << '100' << 1234.56 << :hage

pp h
puts

y = h.to_yaml
puts y
puts

new_h = YAML.load(y)
pp new_h

pp h == new_h

776 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:05:25 ]
わざわざ PStore するってことはオブジェクトとして一時保管したいのだろう
YAML ではどうにもならん気もする

777 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:06:03 ]
では、yaml/storeで

#!ruby -Ku
$KCODE='u'

require 'pp'
require 'yaml/store'
#require 'pstore'

h = Hash.new{|h, k| h[k] = Array.new}
h[0] << 'a' << 'b' << 'c'
YAML::Store.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h}

778 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:06:48 ]
あああ、てか、procごと保存して復元したいってことなのか?PStoreってそこまで対応しとるノン?

779 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:11:50 ]
Rubyist Magazine - 標準添付ライブラリ紹介 【第 9 回】 PStore
jp.rubyist.net/magazine/?0016-BundledLibraries

> IO や Proc などの Marshal.dump が出来ないオブジェクトは保存することが出来ませんが、
> Marshal.dump 出来るオブジェクトなら何でも保存できて、Marshal.load 出来るものは何でも読み込めます。

駄目なんすね・・・まあ普通考えたらそうか

procで詰まるってことは、後でevalれるコードを格納できるように、
って難しく考えないで、1個1個個別対処しかないんじゃないのかなあ。
復元時にprocを戻すようにというか、Hash.new{|h, k| h[k] = Array.new} 生成して再代入と言うか

780 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:19:55 ]
一応>>774が答ではあるのだろう
出しっぱなしにならないようにクラス製作者に気をつけてもらうしかなさそうだ
デフォルト値の動作が重要な代入可能な配列なんかを提供する場合は
Procつき配列をそのまま出すのではなくそういうデフォルト動作をするメソッドを自力で作れと



781 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 12:22:55 ]
めんどいな

782 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 15:34:57 ]
class MyHash < Hash
def initialize(*args)
super {|h, k| h[k] = []}
end
def marshal_dump
Hash.new.update(self)
end
def marshal_load(data)
update(data)
end
end


783 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 17:43:17 ]
マニュアルのとこにちょろっと書いておいてくれるとよかったのにね
「ただし、ブロックは Proc なのでこのままではオブジェクトを Marshal することができません。Hash#merge して下さい」とか

784 名前:753 mailto:sage [2009/05/08(金) 17:49:20 ]
>>728
同じ事を考えたんだけどmarshal_loadしたオブジェクトは
initializeされてないからdefault_procが再設定されてないのよ

h = MyHash.new
h[0] << 'a' << 'b' << 'c'
h = Marshal.load(Marshal.dump(h))
h[1] << 'a' << 'b' << 'c'
#=> undefined method `<<' for nil:NilClass (NoMethodError)

initialize以外でdefault_procは設定出来ないしどうしたもんかね

785 名前:784 mailto:sage [2009/05/08(金) 17:51:39 ]
名前欄は無視してくだしあ

786 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 19:52:10 ]
>>770
>p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65

これって fusiあな、、?

787 名前:デフォルトの名無しさん [2009/05/08(金) 20:39:17 ]
TSUKARETA

788 名前:デフォルトの名無しさん [2009/05/08(金) 20:39:48 ]
$ irb1.8
irb(main):001:0> str = String.new
=> ""
irb(main):002:0> p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65
"TUKARETA"
=> nil
irb(main):003:0>


789 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 21:21:55 ]
String.new << e

は、e.to_s した結果を末尾に追加するべきだと思う

790 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 21:26:18 ]
まあ ASCII コードの取り扱いのへんはいろいろシガラミがあってだな



791 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 23:26:20 ]
Rubyユーザとは思えない>>772のレスのせいで初心者が混乱しかねないので、
一応言っとく。

○デフォルト値はあってもMarshalできる(もちろんpstoreも)

h = Hash.new(1)
h = Marshal.load(Marshal.dump(h))
p h[:foo] #=> 1

○ダメなのはdefault_proc

h = Hash.new {}
Marshal.dump(h) #=> can't dump hash with default proc (TypeError)

○default_procはHash#default=で消せる

h = Hash.new {}
h.default = nil
h = Marshal.load(Marshal.dump(h))
p h #=> {}

○配列にデフォルト値などない

a = []
a.default = 1 #=> undefined method `default=' for []:Array (NoMethodError)

792 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 23:31:13 ]
>>784
Hash#default_proc=

793 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 01:38:12 ]
>>792
このスレでは1.9をデフォと思わないほうがいい。


794 名前:784 mailto:sage [2009/05/09(土) 01:46:48 ]
>>792
1.8.7だと undefined method になっちゃう(1.8.8とかで取り込んで欲しいな)
てかinitialize呼んじゃってもいいのね
def marshal_load(data)
 update(data)
 initialize {|h,k| h[k] = Array.new }
end

# あとアンカも間違えてた ×>>728>>782

795 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 02:43:48 ]
asobi.sqweebs.com/learn/1.php

Rubyではこんなの、作れないっしょ!

796 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 05:34:28 ]
てか、自分でクラス作ってるならこんな面倒なことしなくても
「該当部分の見当つくんだから空のハッシュとマージさせとけ今からやれ」で終了なわけで
ソース読むのめんどいくらいの他人様のライブラリを仮定してると思われる以上
そこで「1.9ならできる」というのはいささか的外れな気もする

797 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 07:48:41 ]
>>791
こういうのまとめたwikiが欲しいな…
RubyのFAQ用のwikiみたいなのってなかったけ?

798 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 08:40:47 ]
>>797
マニュアル嫁

799 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 08:43:37 ]
>>797
WikiのURLがいつのまにかテンプレから外されてるな
どっちも更新少ないから無理もないが

■ちょっと前にできたWiki
Ruby 初心者スレッド Hiki
starlet.s145.xrea.com/ruby/hiki/
Ruby Portal
ruby.morphball.net/portal/

800 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 09:19:06 ]
>>791
Ruby 初心者スレッド Hiki - PStore、Marshal関係
starlet.s145.xrea.com/ruby/hiki/index.cgi?PStore

転記しておいた



801 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 09:59:13 ]
質問です
オブジェクトが、あるモジュールに含まれるクラス群のインスタンスであるかどうかを
調べる簡単な方法はありますか?

現在、
obj.class.to_s =~ /MyModule/

みたいな判定の仕方をしているのですが、こういうことに正規表現マッチを
使うのも大げさな気がします。もっと簡潔なやり方はないでしょうか。

802 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 10:15:23 ]
obj.is_a?(MyModule) で用が済まなくなったらまた来てくれ






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

前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