1 名前: 【大吉】 mailto:sage [2009/01/01(木) 13:13:22 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 【Ruby1.9 は不安定な開発版であり初心者には全く向きません】 【最新安定版の Ruby1.8.7 の使用をお勧めします】 ※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。 1.9 の新機能の一部が利用可能なので初学者にお勧めです。 ※ただし十分安定しているとは言えないので プロダクション環境での利用にはお勧めしません。 関連スレやURLは>>2-8 あたりを見てください。Ruby on Railsの質問は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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
47 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 02:23:44 ] 前スレ見てないけど混乱するからじゃないの? スーパプログラマならごちゃ混ぜでも大丈夫だろうけど。 AWT弄ると割と楽しいな。 rubyにもjavaのAWTみたいなの欲しい。
48 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 02:44:48 ] >>46 パーザの差し替えが効かなくなるから。 だから個人用なら好きにしろって言われてたでしょ。
49 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 03:42:10 ] >>46 クラスと、クラスの生成を分離するのが いわゆるFactoryパターン こう問題を分割することで、コードの見通しが良くなり変更に強くなる
50 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 05:55:40 ] I used "-d" option to run ruby. However, following errors are occured. What is the menning? Exception `LoadError' at c:/ruby/lib/ruby/site_ruby/1.8/rubygems.rb:871 - no such file to load -- rubygems/defaults/operating_system Exception `NoMethodError' at c:/ruby/lib/ruby/1.8/rational.rb:78 - undefined method `gcd' for Rational(1, 2):Rational debug_mode
51 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 05:56:59 ] >>50 ups, sorry... note: last "debug_mode" string are output my code
52 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 05:57:31 ] > note: last "debug_mode" string are output my code note: last "debug_mode" string are output from my code
53 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 06:48:21 ] Rubyで、文字列として記述するさい、 \をエスケープしないで記述する方法はありますでしょうか? C#の @"c:\windows" みたいな機能です。
54 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 07:27:33 ] >>50 > Exception `LoadError' at c:/ruby/lib/ruby/site_ruby/1.8/rubygems.rb:871 > - no such file to load -- rubygems/defaults/operating_system It fails to execute "require 'rubygems/defaults/operating_system'" > Exception `NoMethodError' at c:/ruby/lib/ruby/1.8/rational.rb:78 > - undefined method `gcd' for Rational(1, 2):Rational You might execute a code like Rational(1, 2).gcd, but the Rational class does not have a method named gcd.
55 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 07:50:12 ] >>53 'c:\windows'
56 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 08:52:35 ] >>55 レスありがとうございます。 シングルクォートだとそのままいけるんですね。助かりました。
57 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 09:06:48 ] >>54 > It fails to execute "require 'rubygems/defaults/operating_system'" Humm.... Ignoring this exception is no problem? > > Exception `NoMethodError' at c:/ruby/lib/ruby/1.8/rational.rb:78 > > - undefined method `gcd' for Rational(1, 2):Rational > You might execute a code like Rational(1, 2).gcd, > but the Rational class does not have a method named gcd. I found "Rational::gcd" in rational.rb ... But, the error has occurred. This is why? sample code is here. ----cut here---- #!ruby -Ku puts "hello" ----cut here---- Run command "ruby -d foobar.rb" to confirm.
58 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 10:38:35 ] require 'rubygems'って重い重い言われてるけどそんなに 重くないんだな linuxのruby1.9でnokogiriでリンクを抽出して表示するだけのコードなら require 'rubygems'するのと直接nokogiriをrequireするのとで差が無かったーよ active rubyとかだと違うのかなぁ
59 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 11:07:42 ] >>58 Ruby1.8でも比較してみるんだ!
60 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 11:20:15 ] オブジェクトを外部ファイルに格納して呼び出して使うにはどうしたら良いんでしょうか。 ちなみにオブジェクトの中身は単なるファイルのパスです。 例えば、外部ファイル path.rb の中身を、 file = 'D:/hoge.txt' とします。それを別の Rubyファイル open.rb で、 open(file) と書いて開きたいのです。
61 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 11:28:57 ] >>56 一切のエスケープをしない文字列リテラルが欲しい! シングルクォート文字列だと クォート文字をエスケープすることでクォート文字自体を含ませられる よって\自身やクォート文字直前の \ はエスケープしなければならない したがって \\ と書きたい場合は \\\もしくは\\\\にしなければならず \\PC1\share\doc\text1.txt みたいなUNCパスや c:\doc\ みたいに、最後に\が付いたディレクトリ名とかで注意が必要 '\\\PC1\share\doc\text1.txt' # => \\PC1\share\doc\text1.txt 'c:\doc\\' # => c:\doc\ 実際のことろは、ruby内で完結するならば パスの区切りは / にしとけば問題ないのだけれども dirname = <<'EOS'.chomp \\PC1\share\doc\ EOS シングルクォートのヒアドキュメントだと、まったくエスケープされないが どうしても末尾に改行がつくし、ワンライナー出来ない まったくエスケープしない代わりにクォート文字が含められなくてもかまわない文字列リテラル希望 %b!もじれつ! みたいのだとクォート文字を変えられるのでクォート自体は記述できなくてもいいんだけど
62 名前:デフォルトの名無しさん [2009/01/05(月) 12:15:45 ] なんという国際的なスレッド。。あっぱれ!
63 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 14:13:45 ] >>61 ワンライナーするだけなら%s記法でto_sするとか? 個人的には改行無視のバックスラッシュって使ったことないから %qをバックスラッシュ記法無効にするぐらいでもかまわないけど ハマる人はいるんだろうぁ。
64 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 15:03:49 ] C# の s = @"hogemage"; みたいなの?
65 名前:デフォルトの名無しさん [2009/01/05(月) 15:09:25 ] cygwinにruby・rubygems・rails(1.2.6)・sqlite3-rubyを入れています。 データベースにアクセス(例えばrake db:migrate)すると、↓のようなWarningが表示されます。 /home/***/depot/config/boot.rb:20:Warning: Gem::SourceIndex#search support for String patterns is deprecated Warningが出る原因、対処法などあればご教授下さい。
66 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 15:24:16 ] 2年前ぐらいのlinux環境で動いてたrubyのスクリプトを動かしたい 最新のrubyでは動かなかった 2年前だとバージョンいくつぐらいだといいのかな
67 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 15:27:57 ] >>60 何がしたいのか良く分からんが文面通りに解釈すると ---open.rb--- require 'path.rb' open(file)
68 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 15:32:00 ] >61 hoge=%(\\PC1\share\doc\text1.txt) fuga=%(c:\doc\)
69 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 15:33:06 ] >>66 1.6
70 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 15:43:15 ] >>68 >ruby -ve "puts %(\\PC1\share\doc\text1.txt)" ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32] \PC1 haredoc ext1.txt 1.9の話?
71 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 15:58:35 ] >>67 できました。ありがとうございます。
72 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 16:07:45 ] >>65 cygwinでrailsなんて無理だからやめとけ。
73 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 20:09:17 ] >>67 それだとうまくいかないんじゃない? path.rb には file = 'D:/hoge.txt' と書かれてあるから、変数fileはローカル変数だよね? require 'path.rb' しても、ローカル変数は path.rb の中だけで有効で、open.rb からは参照できないと思う。 解決策としては、fileじゃなくて$fileにするとか? >>71 なんでこれでうまくいくの?
74 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 20:13:16 ] >>73 www.ruby-lang.org/ja/man/html/_CAD1BFF4A4C8C4EABFF4.html#a.a5.ed.a1.bc.a5.ab.a5.eb.ca.d1.bf.f4 >トップレベルのローカル変数はプログラムの終了まで
75 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:50:33 ] >>74 げげ、しらんかった。さんくす。
76 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:51:20 ] >>57 Humm... It's kinda odd. It may be that the instalation of Ruby was failed??
77 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:55:39 ] トップレベルのローカル変数はファイル内に閉じてるよ
78 名前:デフォルトの名無しさん [2009/01/05(月) 22:09:21 ] なんという国際的なスレッド。。あっぱれ!!
79 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:12:31 ] Railsで "fooBarBaz" を "foo_bar_baz" に変換するメソッドって何ですか。 あと後学のために知りたいんですけど、こういう場合って何をキーワードにしてぐぐればいいでしょうか。
80 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:27:51 ] >>79 "キャメルケース アンダースコア rails" でググったら、それらしいのが一番上にでてきたYO! Rails 使ってないんで、よく分からんが。 recorder.komasui.org/conventions-of-ruby-on-rails#l16
81 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:39:03 ] >>63 書きたいのは、連続したバックスラッシュと 末尾のバックスラッシュだから それでもだめなんですよ >>64 そんな感じのが欲しい C#の @"hogehoge" だと 唯一 "" が "になるっていうエスケープのみが効くようで バックスラッシュは全部そのままになる Windowsのパスや正規表現を書くには必要だったのでしょうね C#環境をインストールしてないので、マニュアル見ただけだけですが Pythonの raw文字列とか三連クォートのraw文字列はかなり理想的なのかも? と思って調べたら 末尾にバックスラッシュが書けなかった Win版Inkscapeに付いてた2.5.1なんですけど r"""ほげほげ\""" はNGで文字列が閉じない かといって r"""ほげほげ\"""" # => ほげほげ\" マニュアル見たら raw 文字列を奇数個連なったバックスラッシュで終わらせることはできません と書いてありました
82 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:41:55 ] C# だと @"foo\bar\dirname\" でもおkなのは良いよね Matzパクってくれないかしら
83 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:43:14 ] >>80 ありがとう!
84 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:47:21 ] >>79 調べ方の一例 $ irb -ractive_support irb> String.ancestors => [String, ActiveSupport::CoreExtensions::String::Multibyte, ActiveSupport::CoreExtensions::String::Behavior, ActiveSupport::CoreExtensions::String::Filters, ActiveSupport::CoreExtensions::String::Conversions, ActiveSupport::CoreExtensions::String::Access, ActiveSupport::CoreExtensions::String::Inflections, Enumerable, Comparable, Object, ActiveSupport::Dependencies::Loadable, Base64::Deprecated, Base64, Kernel] このうち、目的のメソッドはInflections(語形変化)の中にある。 irb> ActiveSupport::CoreExtensions::String::Inflections.instance_methods => ["titleize", "constantize", "singularize", "classify", "demodulize", "underscore", "titlecase", "foreign_key", "tableize", "humanize", "pluralize", "camelize", "camelcase", "parameterize", "dasherize"] irb> "fooBarBaz".underscore => "foo_bar_baz"
85 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:49:45 ] あ。 gemで入れたactive_supportが、-rubygemsがなくても動いているのは ~/.irbrcでrequireしてるからデス… 適当に自分の環境にあわせてね。
86 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:40:09 ] irb(main):005:0> puts %(\\samba\test\hoge"mage") \samba esthoge"mage" だめっぽいっすね・・・
87 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:43:55 ] Rubyだと ファイルパスは / でかくだろJK、というのもわかるんですが ちょっとしたファイルパスのコピペでも/に置換が必要だったり、 win32のプログラムに渡すのにパスが / じゃ通らなケースが多々あったり 細かいところで不便なところがあるんですよね・・・。
88 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:45:21 ] >>57 Ok. I see. I will re-install ruby programs. Thanks all. Best regards,
89 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:46:16 ] ups.. s/>>57 />>76 /
90 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:53:39 ] >r"""ほげほげ\""" はNGで文字列が閉じない >かといって >r"""ほげほげ\"""" # => ほげほげ\" r"""\"ほげほげ""" # => \"ほげほげ r"""ほげ\\ほげ""" # => ほげ\ほげ >C# だと @"foo\bar\dirname\" でもおkなのは良いよね >Matzパクってくれないかしら いちどVBのマニュアル見るといいよ
91 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 00:06:50 ] > いちどVBのマニュアル見るといいよ なぜVBが出てくるのかさっぱりだが とりあえずどの辺を読めばいいのかkwsk
92 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 00:37:24 ] 何で最後に \ が来るような文字列が必要なの? 最後が \ の時はディレクトリ、みたいな判断でもしてるとか?
93 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 01:06:33 ] ライブラリ(Rubyで書かれたかどうかは問わない)が そういう文字列を欲しがることは結構ある。
94 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 01:15:43 ] てかなんでwindowsのパス区切りは\なんだ? \\にしたりしなかったり一体どれだけの混乱を強いていると思ってるんだ
95 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 01:22:45 ] +がエンコードできないですけど、どうやればいいでしょうか。 p URI.escape("+") 結果 "+" ってなっちゃうですけど。
96 名前:デフォルトの名無しさん [2009/01/06(火) 01:50:29 ] >>95 + って空白文字を表すんじゃないの?
97 名前:96 [2009/01/06(火) 01:54:14 ] ごめんうそ。
98 名前:デフォルトの名無しさん [2009/01/06(火) 01:54:26 ]
99 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 02:10:52 ] >>95 URI.escapeはURIの中に出てきたらおかしいものだけをエスケープする。 +はURIの中に入っていても全く問題ないのでエスケープされない。 +をエンコードしたいなら、CGI.escapeを使えばおk。
100 名前:デフォルトの名無しさん [2009/01/06(火) 02:19:22 ] _ /,.ァ、\ ( ノo o ) ) R )ヽ ◎/(. F (/.(・)(・)\ . C (/| x |\) 嫁 //\\ . (/ \)
101 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 02:21:07 ] >>99 御解答ありがとうございます。 うまくできました。
102 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 02:25:01 ] かなり初歩なんですけど、配列、ハッシュ、構造体をどのように使い分ければいいでしょうか? Rubyに限ったことではないですけども・・・・。
103 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 02:25:49 ] >>94 MS-DOSはCじゃなくてBasicで書かれていたから バックスラッシュでエスケープの問題は無かった
104 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 02:29:29 ] >>102 用途によって使い分ける 想像付かなければとりあえずアルゴリズム辞典とかでも読んでください
105 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 02:44:20 ] >>102 www.codelogy.org/archives/2007/10/post_4.html 簡単な奴なら配列やハッシュテーブルを構造体代わり使えばいいけど、 他人に渡したり、再度使おうとするときには構造体を使った方がいいんじゃないかな? struct使うまでのプログラムかいたことねーけど
106 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 06:06:35 ] >>87 pathnameのWindows正式対応版が出てくれれば一番良いんだけどなー pathname2は他の外部ライブラリに依存してたりするし >>102 基本的には「臨機応変に」としか言えない 俺の場合、ハッシュはどうしても必要な時以外には使わないようにしている 間違ったキーを使っても、エラーが出なくて困ることがあるし
107 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 10:05:36 ] >>94 パス区切りが\でコマンドオプションが/なのは、VMS由来。
108 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 10:34:33 ] >>107 まじで? CP/M由来だと思ってたんだが
109 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 11:34:19 ] >>107 VMSはディレクトリを[]でくくり、区切りは '.' 相対パス [.foo.bar.baz]filename.ext 絶対パス [foo.bar.baz]filename.ext
110 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 11:38:59 ] CP/M にはディレクトリないだろ
111 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 12:16:41 ] CP/M++ DQN
112 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 12:29:20 ] >>109 command.comがこれをお手本にしてるから。 h50146.www5.hp.com/products/software/oe/openvms/manual/v82-1/html/DEBUG/DOCU_052.HTM#122_usingsymbolsandoperat
113 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 13:05:14 ] DOS は CP/M を元にして作った(参考にした?) CP/M はコマンドオプション指定に"/"を使ったので DOS もそうなった んで、ディレクトリを実装する時に"/"を使えないので"﹨"を使った というのが、普通に聞く説だと思うが
114 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 14:17:20 ] しかし「MS-DOSはCじゃなくてBasicで書かれていたから」には吹いた。 ちなみに最初はフルアセンブラです。
115 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 14:29:45 ] イメージで言いたいことはわからんでもないがぬ
116 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 17:37:08 ] 0終端じゃなくて$終端だったような
117 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 17:57:59 ] >>116 それはファンクションコール9番の特殊仕様。 たしかキルドールが「その仕様の理由をゲイツに訊いてみな、答えられないから」と 言ってるという話を読んだ記憶がある。ソース忘れた。
118 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 18:14:47 ] >>117 俺もその話聞いたことがある。 同じくソース忘れたけど。
119 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 21:19:49 ] スレ眺めてたら自分の質問が初歩的過ぎて申し訳ないんですが、質問です。 [23,6,58,345]みたいな配列をコピペしてgetsなどで入力させるとき、 "[23,6,58,345]"となってしまって、これ自体が1つのオブジェクトとして認知されてしまうのですが、 23,6,58,345のように4つのオブジェクトとして一度に認識させる方法はあるのですか?
120 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 21:23:04 ] eval でも他所様からの入力はevalしたら死ねるので注意
121 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 21:24:23 ] ありがとうございます 早速ためして見ます
122 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 22:06:48 ] >>120 おかげで完成しました。 ありがとうございます!
123 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 22:58:42 ] >>120 他所様の入力をevalの前に正規表現で (\[[\d\,]+\]) とかしてからevalしても死ぬ?
124 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:02:02 ] >>123 入力がその正規表現に限定できるならそれでもいいんじゃない?
125 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:02:24 ] >>123 安全と確信できるパターンなら大丈夫いいのだが、 そのパターンだと [,,,,,,,] みたいなのを受け入れてしまわんか? あと、$SAFEおよびtaint/untaintについても調べておくとよい。
126 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:05:03 ] >>123 数値だけなら自分でscanとかsplitととかした方が安心な気がする
127 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:40:58 ] inspect な記述を数値か文字列のどちらかの配列かハッシュに変換するライブラリとか作ったら それなりに人気が出ると思う
128 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:45:14 ] >>127 こういうことじゃなくて? eval({5 => 8.5, :a => 'b'}.inspect)
129 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:48:03 ] 今回の記法に限れば YAML.load('[1, 2, 3]') => [1, 2, 3] とかもありかな。
130 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:50:36 ] JSONやYAMLとしてパースしてもいいんじゃない?
131 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 00:03:16 ] "[-1,0,1,2,3]".scan(/-?\d+/).map(&:to_i) こんな感じでいいんじゃなかろうか
132 名前:デフォルトの名無しさん [2009/01/07(水) 01:43:30 ] インスタンス変数の値を、GDBMを使ってDBへ書き込みがしたくて こんな風に記述した。 GDBM.open(dbfile, 0644, GDBM::NEWDB){|db| line = @number, "," ,@name, "," ,@age, "," ,@address, "," ,@tel, "," ,@grade, "," ,@department, "\n" db[@number] = line } db[@number] = lineの部分で in `[]=': can't convert Array into String (TypeError) とエラーが出力される。 授業ではインスタンス変数の値ではなく、 CSVファイルから読み込み→DBファイルへ登録としてて、 カンマ区切りのデータならそのままDBへ書き込めるのかと解釈 したんだがそこから間違ってるのか…orz 長文スマソ
133 名前:デフォルトの名無しさん [2009/01/07(水) 01:44:45 ] >>132 sage忘れた…ゴメンorz
134 名前:デフォルトの名無しさん [2009/01/07(水) 01:48:28 ] いや、質問者はむしろageろ
135 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 01:58:50 ] >>132 >line = @number, "," ,@name, "," ,@age, "," ,@address, "," ,@tel, "," ,@grade, "," ,@department, "\n" これは多重代入の怪しいルールでlineには配列が入るんだ で,多分GDBMには文字列しか保存できないからこんなことになってる だからインスタンス変数の値が全部文字列なら+でつなげるといいと思う
136 名前:デフォルトの名無しさん [2009/01/07(水) 02:11:51 ] >>135 試したら先ほどのエラーは消えました! でも + でつなげるってことはカンマ区切りなしの文字列しか DBへ書き込みできないってことになりますか?
137 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 02:14:36 ] line=@number + "," + @name + "," + (以下略 こうだよこう
138 名前:デフォルトの名無しさん [2009/01/07(水) 02:17:09 ] >>137 素で勘違いしてましたorz そして出来ました! 助かりました…ありがとうございました!
139 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 06:41:18 ] 勉強用なら、一旦配列にして結合用文字でjoinするのがスクリプトとしてもわかりやすいんじゃね、と思うぞ data = [@number, @name, @age, @address, @tel, @grade, @department] GDBM.open(dbfile, 0644, GDBM::NEWDB){|db| db[data[0]] = data.join(',') } この場合はDBから読むときには data = db[no].split(',') とかして取り出す 結合用文字はカンマを選んだが、インスタンス変数の中に存在しない文字なら @ でも # でも ^ でも何でもいい
140 名前:デフォルトの名無しさん [2009/01/07(水) 13:54:35 ] '\0' がマジおすすめ
141 名前:デフォルトの名無しさん [2009/01/07(水) 15:09:26 ] >>139 ,140 重ね重ねありがとう! おかげで課題出来そう
142 名前:デフォルトの名無しさん [2009/01/07(水) 18:37:38 ] >>132 の者です DB関連の問題は解決したんですが、 s1 = Student.new(引数) s2 = Student.new(引数) とインスタンスを生成した場合、Studentクラスのクラスメソッド内で 引数の値を判断してインスタンスを返す(s1とs2どちらのインスタンスなのか判断して返す) という処理は出来ますか?
143 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 18:45:53 ] >>142 そのコードの目的も含めてもうちょっと詳しく
144 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 18:50:54 ] そのクラス名は正直どうよと思わなくもない 生徒のもつ個人情報という意味ならふつーに StudentData とかでいいじゃんね >>142 回答は 「クラスメソッドは @@hoge 形式のクラス変数が読めるので インスタンスメソッドの中(今回はinitializeの中)で先頭に@を2つつけたクラス変数に値を入れておけばOK」 だけど、たぶんクラスメソッドの使い方間違ってる でも、間違ってるということが自覚できるのはずっと先なのでまずはどんどん変な構造のスクリプト作れ
145 名前:デフォルトの名無しさん [2009/01/07(水) 18:53:04 ] >>143 課題で学生クラスを生成する課題があって、 ・パラメータ7つ保持(これを引数にして渡してる、7つすべて文字列) ・学生クラスのインスタンス1つは、学生1人を表す ・クラスメソッドfindによって、文字列が一致する引数を持つ 学生インスタンスを取得できること 与えられた条件はこんな感じです
146 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 18:56:00 ] 宿題スレ向けではあるね Rubyの宿題教えてください。2限目 pc11.2ch.net/test/read.cgi/tech/1200175247/ このスレの連中は基本ヒマで、宿題スレも見てる人はいるから答はもらえるとは思うが
147 名前:デフォルトの名無しさん [2009/01/07(水) 18:59:20 ] >>146 課題では他にも色々条件が与えられていて、 他の部分はほぼ実装できてるんだけど 向こうでは>>145 みたいな部分的なこと聞いてもおkなんですか?