1 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 00:26:33 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 【Ruby1.9 は不安定な開発版であり初心者には全く向きません】 【最新安定版の Ruby1.8.6 の使用を強くお勧めします】 関連スレや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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
191 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 03:27:37 ] rescue すればいい
192 名前:デフォルトの名無しさん [2008/04/21(月) 03:56:54 ] 全体を囲む大きなbeginブロックを書くということですか? 視認性が悪くなるので、 前もってエラーハンドラみたいなものが登録できたらいいと思うのですが・・
193 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 04:07:33 ] 基本的には処理はトップレベルにベタ書きすべきじゃないと思うから (変数はなるべくローカルスコープに入れた方がいいので)、 C などの main 関数みたいに全ての処理を囲んだ関数を作って トップレベルに記述する処理はその関数のみにしておくと良い。 そういう状態であれば、begin で囲むのもそこだけで済む。
194 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 04:18:35 ] ふーむなるほど… ありがとうございました
195 名前:デフォルトの名無しさん [2008/04/21(月) 06:16:46 ] Timeオブジェクトを引き算するとfloatが返ってきます 時間の差をあらわすオブジェクト(間隔オブジェクト?)が 返ってきて欲しいのですがどうしたらいいですか?
196 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 07:44:30 ] >>196 返って来たFloatがその間隔オブジェクト(秒.マイクロ秒) 欲しい単位が分なら (t2 - t1).to_i / 60 すればいい
197 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 10:59:01 ] >>186 代入演算子の一種として実装すればよい 例:a += 1
198 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 21:39:36 ] このへんを蒸し返してみたら? blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-list/6233?6096-6403
199 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:23:48 ] num++に問題があるというより ++numとnum++の挙動の違いをRubyの中に組み込むのに難があるという感じ?
200 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:32:18 ] succはあるんだから、前置++は構文だけの問題だね 後置は……
201 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:42:48 ] > succはあるんだから ほほう 君のRubyでは 3.succ として 3が 4になるのか?
202 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:43:01 ] 馬鹿ばっかだな 演算子で終わることに自体に問題があるんだろ
203 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:45:52 ] >>201 ああ、succはsucc!じゃないよね 吊ってきます
204 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:59:58 ] で、誰が演算子で終わることを問題にしてるの?
205 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 23:51:33 ] Cだと 1++ で 1 が 2 になるのか。 おもしろいな
206 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:02:31 ] 演算子で終わることの意味も分からない馬鹿がいるな
207 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:16:53 ] 演算子で終わる云々なんて、この何回もループした議論の中で出てきたっけ? そりゃ内部仕様は変えなきゃいかんだろうが、「演算子で終わったら駄目」な理由は? というか採用されても、「特殊なメソッド」以上のものにはならんと思うが
208 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:17:20 ] RubyでCGI作ってみてるのですが、system(id root)とかのコマンド結果が どうもHTTPヘッダーとして出力されてしまっているようです。 どうにか出力しない方法ってあるんでしょうか。
209 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:18:59 ] パイプ使って、標準出力/エラー出力を捨てとけ。
210 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:23:10 ] >>209 ありがとです。
211 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 01:48:37 ] DBIを使ってPostgresSQLと接続しようとしたのですが、上手くいきません。 環境は、 OS CentOS 5.1 64bit Postgres 8.3.1 ruby-1.8.6-p114 ruby-postgres-0.7.1 dbi-0.2.0 です 接続しようとすると`load_driver'エラーが出ます。ruby-postgresだけだと接続出来るのですが、dbiだと駄目です。 ちなみにdbiのインストールオプションはruby setup.rb config --with=dbi,dbd_pgでインストールしました。 $ irb irb(main):001:0> require "postgres" => true irb(main):002:0> PGconn.connect("localhost", 5432, "", "", "testdb","user","wassword") => #<PGconn:0x2aaaaabaceb0> irb(main):003:0> require "dbi" => true irb(main):004:0> DBI.connect("dbi:postgres:testdb:localhost", "user", "wassword") DBI::InterfaceError: Unable to load driver 'postgres' from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:352:in `load_driver' from /usr/local/lib/ruby/1.8/monitor.rb:242:in `synchronize' from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:282:in `load_driver' from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:233:in `_get_full_driver' from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:219:in `connect' from (irb):4 from (eval):3 よろしくお願いします。
212 名前:デフォルトの名無しさん [2008/04/22(火) 02:42:51 ] 広くメソッドというもの自体をオーバーライドすることは出来ますか? メソッドすべてにフックを仕込んで、メッセージのやりとりを ロギングしたり、そういうことがしたいんですが
213 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 02:51:19 ] ttp://doc.loveruby.net/refm/api/view/method/Kernel/m/set_trace_func
214 名前:212 mailto:sage [2008/04/22(火) 03:04:54 ] >>213 こんな機能があったんですね ありがとうございました
215 名前:デフォルトの名無しさん [2008/04/22(火) 03:21:12 ] RubyWay読んでたら、Stringのeachは1.9ではなくなり、 each_lineを使うようになったと書いてありました。 今書いてるスクリプトには、ファイルからの読み込み処理等で eachが結構あります。 これは書き換えないと1.9以降では動かなくなるのでしょうか?
216 名前:デフォルトの名無しさん [2008/04/22(火) 06:46:11 ] ハッシュの存在しないキーを参照してもnilが返ってくるだけでノーエラーですが 多次元配列で存在しないキーを参照すると undefined method `[]' for nil になります 存在しなかったとしてもエラーが出ないように参照する方法を 教えて下さい
217 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 07:11:08 ] def nil.[](i) nil end
218 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 07:42:47 ] ハッシュのデフォルト値を[]にするとか
219 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 08:03:40 ] あ、スマンぼけてた。問題は配列のほうか。
220 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 08:16:16 ] 多重ハッシュでも存在しないキー指定したら undefined method `[]' for nil になるじゃん 何をしたいか明確に書けよヴォケ
221 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 10:20:15 ] >>216 配列じゃなくてハッシュを使う
222 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 11:25:06 ] 多次元配列などというものはRubyには存在しません
223 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 13:57:40 ] class TajigenHairetsu << Hash def [](*arg) super(arg) end def []=(*arg) super(arg[1,-1], arg.last) end
224 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 17:41:56 ] rubyのコマンドからファイルの有無を確認する方法は無いでしょうか? 無ければ指定したテキストファイルを作り あれば追記するような仕組みを持ちたいので
225 名前:216 mailto:sage [2008/04/22(火) 17:50:19 ] 217さんの方法でしのぐことにしました ありがとうございました >>220 ハッシュか配列かではなく nilに[]が使えないことをどうしようかという話でした
226 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:17:46 ] >>224 ファイルのことについてどうこうしたいんだからFileクラスのメソッド探してみれ
227 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 19:31:56 ] だからfetch(i,default)を使えと
228 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 20:24:49 ] 問答無用に'a'でopenすればええんとちゃうの?
229 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:04:12 ] >>228 のぞんでいたどうさができました おそらく不具合の原因は参考にしていたサイトがafile=File.new(*****) とnewを使っていたためのようです 今まで5個ほど言語を学んできましたがrubyほどシンプルで強力な言語は 無いと感じました 本当にありがとうございます!
230 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:28:45 ] >>215 動かなくなるよ。 str.each は、str.scan(/^/).each に置き換えよう。
231 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:42:21 ] IO#eachは残ってるんじゃなかったっけ?
232 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:15:01 ] class String unless method_defined?(:lines) def lines self end end end としておいて、1.8系でもstr.lines.eachと書いておくという手も…
233 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:06:52 ] irb > print "test" この結果が ttt => nil と出るんですが、これはどういう意味なんですか? irb => ttt と出力されることを期待したのですが。
234 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:09:48 ] tttはtestのつもり? irbの=>の後ろに出るのは、入力した式(print "test")を評価した値。 x= print "test" とすると x = nil になるのといっしょ。 testという文字列が書き出されるのは式の評価(値を求めること)の、まぁ副作用だ。
235 名前:233 mailto:sage [2008/04/22(火) 23:38:04 ] >>234 おぉ丁寧にありがとうございます。 入力コマンドを単純に実行するのではなく評価するだけなんですね。 てか使い道あるんでしょうかね…?
236 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 00:34:45 ] ないよ
237 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 00:37:12 ] irb > print "test" この結果が ttt => nil ^^^~~~~~~ ^:printの出力 ~:irbが返り値のインスペクションを出力 コマンドって…
238 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 00:43:07 ] ttt => String にはならんの?
239 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 00:51:04 ] たぶん出力の意味を勘違いしてるよ。 irbは「=> 返り値」を印字してるだけ。 その前のprintの出力に改行がないからそんな見た目なだけ。 もしそんな出力がされるってことは、printがStringクラスを返してるというイミフなことになるぞ。
240 名前:デフォルトの名無しさん [2008/04/23(水) 06:24:22 ] RubyのIDEでおすすめは何ですか? 今はNetBeansを使っていますが、他のファイルのクラス等が 自動補完できないのでもう少し高機能なのが欲しいと思っています
241 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 09:33:10 ] おすすめは無い あと1年くらいしたら便利なの出てくるぜと3年くらい前から言われてる
242 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:46:14 ] rubyらしいな
243 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 14:09:47 ] pythonから移ってきた人向けの入門ページとかないですか?
244 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 15:31:57 ] for文について質問です。 for book in book_array end このように配列を回すfor文の中でインデックスを取得することは出来ないのでしょうか?
245 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 15:33:59 ] Enumerable#each_with_index
246 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 15:53:58 ] >>245 ありがとうございます!できました。 java出身だとfor文でインデックス取れないって変な感じですね。
247 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:15:35 ] 数値計算関係はpython 日本語処理はruby という使い分けしようと思っててるんですが、うまくミックスする方法はないのでしょうか?
248 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:39:13 ] 質問が曖昧すぎて意味不明
249 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:40:43 ] >>246 for i in (0..book_array.size) p i, book_array[i] end カウンタ変数もなしにインデックスが取れるわけないだろう
250 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 20:37:16 ] >>249 × .. ○ ...
251 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 21:54:00 ] 上と下ならどっちがrubyらしいですか? if foo == "" end if foo.is_a? String && foo.empty? end
252 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:07:13 ] オブジェクトの型をチェックするコードは常用するものではない。
253 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 23:04:56 ] >>247 全部Python
254 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 23:13:04 ] てかRubyの日本語処理ってNKFべっただし PythonからRuby向けを切り出す必要があるとは思えない Pythonで書けるなら全部Pythonで書くのがベスト
255 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:18:41 ] rubyで簡単なツールを作ろうと考えております GUIを組むにはruby/tkとか色々種類があるようなのですが、 最もメジャーなのはどれでしょうか? ツールの詳細としては、チェックボックスやリストで設定項目を設定し、 それによるシミュレーション結果をメッセージボックスに文字列で 順次吐き出すだけというものです ※一応Javaも少しかじってます もし「rubyのGUIは終わってるからJavaでやれ」とかならば それはそれで結論として構いません
256 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:28:07 ] 際だって使われているGUIツールキットはないと思うが、tkは最初から 付いてくるから比較的メジャーと思われる。 自分はマカーなので、必要な場合はOSに付いてくるRubyCocoaを使う ことになると思うけど。 Javaもかじってる人ならJRubyでSwing使うというのもアリかね。
257 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:31:29 ] >>255 FXRuby
258 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:35:52 ] railsでいいじゃん
259 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:38:22 ] >>255 ttp://www.gesource.jp/programming/ruby/gui/index.html おいらはApollo派
260 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:41:57 ] 配布するのか、自分の特定のマシンで使うのかにもよるよな
261 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:00:03 ] 漏れはRuby/Gtk2 Gnomeだからそれに合わせて。Gladeとかあって使い勝手も悪くない。
262 名前:255 mailto:sage [2008/04/24(木) 01:07:39 ] >>260 一応は仕事で補助的に使うツールです 基本は自分のPCで動けばOKですが 状況によっては周囲に配らないとも言いきれませんので 配布時のパッケージングに優れていると助かりますね
263 名前:255 mailto:sage [2008/04/24(木) 01:09:43 ] あと、OSはWindowsXPです 今更言う事でもありませんが、念の為…
264 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:12:18 ] >>255 wxRubyかFXRubyの2択だな
265 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:15:49 ] VisualuRubyはダメなのかな? exerbでexe化もできるみたいだし。 てか、ほんと「これだ!」ってのはないと思う。
266 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 09:48:06 ] 俺AvtiveRubyとHTA
267 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 10:24:49 ] HTA+ActiveScriptRubyなんて組み合わせ知ったときには これぞ俺が今まで追い求めていたものだと直感した GUIはHTMLで記述、中身の処理はRuby。夢のようだ なのになんで使わなくなったんだっけ俺
268 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 13:01:03 ] インターフェイスはrubyになるけど中身はIEのままじゃねそれ eachとかProcとかないんじゃ
269 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 14:45:06 ] >>247 >>254 xmlrpcやjsonでお互いのプログラム間で通信したらいいのかな?
270 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 17:24:55 ] >>255 反則っぽいけどwebrickでアプリケーションサーバを作るとか guiとかの環境依存性も配布する必要も無い ついでにdrbで分散処理も追加
271 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 00:47:28 ] >>255 >262,263の条件ならC#かJavaがいいと思う。 UNIX系でも使う可能性があるなら>264かな。
272 名前:255 mailto:sage [2008/04/25(金) 02:51:02 ] 色々候補ありましたが、日本語周りに確証が欲しかったので 差し当たりVisualuRuby触ってみる事にします 皆様レス有難うございました しかし決め手が無くて色んな種類があるという状態は 選択肢が広いとは言え、個人的には苦手だ…
273 名前:デフォルトの名無しさん [2008/04/25(金) 04:29:00 ] パスが入ってる文字列のファイルセパレーター(/や\)を, /からwindowsの\に変換するメソッドは有りますか?
274 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 05:51:48 ] >>273 文字の置き換えだろ? リファレンスマニュアルでStringの項を読みなさい
275 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 23:54:28 ] 文字列の50行目から100行目の範囲に対して、正規表現で検索をしたいのですが 今は str.split('\n).each do |line| cnt += 1 line =~ 〜 if(50<=cnt && cnt<=100) end のようにしているのですが、strはかなり長い文字列なので、無駄な処理をしている気がします もっと上手は方法はないでしょうか?
276 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 00:22:53 ] >>275 とりあえず、splitする必要ないでしょ
277 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 00:31:59 ] >>275 ややトリッキーな方法だが target_lines = str.split($/).slice(50..100) if target_lines then target_lines.each do |line| line =~ 〜 end end
278 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 00:39:05 ] >>276-277 ありがとうございます
279 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 10:18:49 ] >>275 str.each_with_index do |line, cnt| next if cnt < 49 line =~ 〜 break if cnt >= 99 end 1.9なら str.each_line.with_index
280 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 10:32:56 ] next unless (50..100) === cnt
281 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:00:36 ] 何を無駄って考えてるかによりそう strが巨大な配列になってるのがヤだっていうならsplitとeachは全滅だな
282 名前:デフォルトの名無しさん [2008/04/26(土) 13:58:48 ] Rubyからコマンドを実行させるには、execとかsystemとかいろいろあると 思うんですけど、出力結果を文字列として取得する場合はどうすればいいんですか? ちなみにRuby1.8.6です。
283 名前:282 [2008/04/26(土) 14:01:07 ] 282です。 できればエラーストリームだけとれるのが望ましいです。
284 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 14:13:05 ] kazuho.exblog.jp/1883201/ >日本のオープンソース開発者の中で有名なまつもと氏のような方ですらライセンス条件について間違った解釈をしてしまうのである ほうほう。
285 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 14:49:08 ] わざわざ自分のブログ宣伝して回るなよ
286 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 16:24:59 ] >>282 * Open3 を使う(require 'open3') * 自分で作る(open3 は簡単だから、読んでみるといい) * windowsでは動かないかもしれないが↓ command = 'ls /tmp' stderr = `#{command} 2>&1 > /dev/null`
287 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 22:55:11 ] >>282 $stdout, $stderr を reopen して system system のいいとこは shell を介さずに実行できるから コマンドインジェクションを防げる。
288 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 01:40:40 ] 単純にpopenじゃあかんの?
289 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 10:50:28 ] ポペン!
290 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 18:19:04 ] あのさ、あるクラス Foo があって、その機能強化版をつくったとき、 クラス名は何にしたらいいと思う? AdvancedFoo とか ExtendedFoo とか考えたけど、あまりいい名前じゃないといわれた。 かといって、雑多な機能をいくつも付け加えたから、これといって名前をつけにくいんだよな。 なんかいい名前ない?
291 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 18:26:58 ] 追加する機能をモジュールとして作り、 Fooのインスタンスにextendで機能追加する。 ↑という方法では解決できず、どうしても継承でやる必要があるなら FooWith機能名 とか 機能ableFoo とか。