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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
82 名前:デフォルトの名無しさん [2009/04/05(日) 21:04:00 ] OpenStructクラスで、[]、[]=、count(from Enumerable)などのメソッドを使いたいのに 定義されていない場合は、OpenStructを継承して派生クラスで定義してくれってことですか?
83 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 21:47:41 ] >>77 pid=fork if pid==nil then exec('やりたいコマンド') else sleep 動かしたい時間 # まずはSIGINTで止めてみる Process.kill(pid,'INT') stat=Process.waitpid(pid,Process::WNOHANG) if stat==nil then # ダメなのでSIGTERMで Process.kill(pid,'TERM') stat=Process.waitpid(pid,Process::WNOHANG) if stat==nil then # これもダメだったのでSIGKILLで。これなら確実に終了できる Process.kill(pid,'KILL') stat=Process.waitpid(pid) end end end 確かforkは失敗すると例外を投げるはず
84 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 21:48:40 ] >>82 他にどーしろと… st[0] でも st[:hoge] でも st.hoge でも st.each でもアクセス可能なコレクションというのは デフォルトでは添付されてない どれか諦めてくれ
85 名前:77 mailto:sage [2009/04/05(日) 22:44:07 ] >>80 >>83 有り難うございます 別のプロセスをforkで作り、子供側にはnilを返し親にはpidを返すので 下に分岐を入れて子供には外部コマンド実行、親にはスリープしたのちkillさせる、ってことですね。 確かにrubyはあんまり関係ない処理だなあ・・・。unixの勉強がいるなあ。
86 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 22:45:57 ] >>83 pid = fork {exec('...')} とブロックのほうがいいんじゃまいか 1.9ならspawnがあるんだが。
87 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 22:51:45 ] それから、シグナル送ってからちょっとくらい待ってやれよ。 以下、Bourne Shell版。 #!/bin/sh やりたいコマンド & pid=$! sleep 動かしたい時間 kill -INT $pid 2>/dev/null && { sleep 1; kill -TERM $pid 2>/dev/null; } && { sleep 1; kill -KILL $pid 2>/dev/null; } wait
88 名前:デフォルトの名無しさん [2009/04/06(月) 01:21:04 ] クラス名を文字列で受け取ってnewしたいとき、どのようなコードになりますか。 いろいろ試してみたけど最終的にはシンプルにevalしか思い当たらないんですが、漠然と他にありそうなような。 classname = "SomeClass" require classname #ファイル名とクラス名が同じと仮定した場合 obj = eval("#{classname}.new")
89 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 02:36:15 ] >>88 classnameが::を含まない前提? > require classname #ファイル名とクラス名が同じと仮定した場合 普通は require classname.downcase > obj = eval("#{classname}.new") obj = Object.const_get(classname).new のほうが速い active_supportあたりにそんな機能があるよ、確か。
90 名前:88 mailto:sage [2009/04/06(月) 06:20:11 ] >>89 ありがとうございます! >>88 の例では明示的にrequireしていますが、実際にはオートロードするように書いていたため evalしかダメでした。(evalした時点で暗黙に読み込まれる) const_getだと、すでに読み込まれている定数に対してですが、 そのことに気づかずにあれやこれやと・・・orz 現在は修正してうまくいっています。 active_supportは使えない環境なんですが、ファイル名のことなども参考になりましたm(_ _)m
91 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 10:55:14 ] >>90 > >>88 の例では明示的にrequireしていますが、実際にはオートロードするように書いていたため > evalしかダメでした。(evalした時点で暗黙に読み込まれる) > const_getだと、すでに読み込まれている定数に対してですが、 > そのことに気づかずにあれやこれやと・・・orz > 現在は修正してうまくいっています。 バージョンとエラーメッセージは? $ echo 'class C; end' > c.rb $ /usr/bin/ruby -ve 'autoload :C, "c"; p Object.const_get(:C); p $"' ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0] C ["c.rb"]
92 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 18:37:54 ] Rubyプログラミング入門 ?はじめてのプログラミング、はじめてのRuby ttp://www.bnn.co.jp/books/title_index/web/ruby_ruby.html サンプルコードを読む限りはまー最初ならこんなもんじゃねーの、と思った 少なくとも同時期のナントカの冒険よりは読む価値があると思う サンプルコードのダウンロードURLが書いてあったんだけど まさかサイトに書いてない購入者限定の代物だとは思わなかったので記憶してくるの忘れた サンプルコード公開すれば売上伸びる系統の本だと思うのに
93 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 19:10:52 ] Rubyの冒険とかめちゃくちゃ懐かしいんだが それとは関係ないんだな
94 名前:90 mailto:sage [2009/04/06(月) 20:43:51 ] >>91 いただいたコードを見ると、const_getでautoloadしないわけではなかったのですね。 今一度自分のコードを見直してみたところ、const_getでautoloadできました。(解決!) 最初、Javaのように文字列からクラスを生成する書き方ばかり想像していて >>88 で説明のための適当なコードを載せたばかりに、余計な手間をおかけしました。 いまさらですができているコードを書いておきます。 #testfactory.rb module TestFactory #モジュール内のメソッドは公開済み autoload :TestClass1, "testclass1.rb" autoload :TestClass2, "testclass2.rb" def get_instance(classname, *args) #インスタンスを返す # eval("#{classname}.new(*args)) #>>88 の時点のコード # require classname.downcase #>>90 の時点のコード(レシーバ違いでrequireが必要だった) # Method.const_get(classname).new(*args) #requireしないと=> uninitialized constant Method::TestClass1 self.const_get(classname).new(*args) #現在のコード(問題なし) end #その他の同種のメソッド def get_class(classname); self.const_get(classname); end #クラスを返す def method_missing(classname, *args); self.const_get(classname).new(*args); end #同じくインスタンスを返す end
95 名前:90(続き) mailto:sage [2009/04/06(月) 20:45:03 ] #test.rb require "testfactory" #ファクトリモジュールを読み込み classname = get_classname #あるメソッドによりクラス名(文字列)を決定 obj = TestFactory::get_instance(classname, arg1) #OK! Rubyのバージョンは以下のとおりです ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32] ありがとうございました!
96 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 21:15:58 ] ruby:1.8.7 rails:2.1.0 でやってるんだけどto_dateって使えないの? ググったら1.8.6だとprivateメソッドで定義されて〜 とか書いてたけどto_datetimeやto_timeとかもundefind methodになる…
97 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 21:19:21 ] >>96 Railsのライブラリで定義されてるメソッドの話はスレ違い 【Ruby】Ruby on Rails Part6 pc11.2ch.net/test/read.cgi/php/1224838013/
98 名前:96 mailto:sage [2009/04/06(月) 21:24:10 ] >>申し訳。 そっちで聞いてみます。
99 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 21:27:17 ] スレ的にはRailsをRuby初学者が使うのは全くお勧めしない
100 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:46:32 ] 「Rubyレシピブック 第2版 268の技」を買いたいと思ってるんですが レシピブックって言うのはもっといたほうがいいんですかね? 言語挫折厨なもんで、、、便利なら買いたいと思っています。
101 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:52:58 ] >>100 対象がほんのり古いが、「Rubyは実際にどう書くのが一般的と考えられてるのか」がたくさん載っててとても便利 95%くらいは今でも使える、基本ライブラリを使うときはこう書いておけばとりあえずは恥ずかしくない、というコード片が満載 独学可能な領域なので無理してまで買わなくてもいいが、買うと勉強が早く済むよ
102 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:56:49 ] 間違いなく買い 初版持ってるけど、よれよれになってるよ
103 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:58:48 ] ありがとうございます、買い、みたいですね。 参考にさせていただきます。
104 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:17:10 ] WindowsのRuby/TKで簡単なランチャを作って使ってるんですが Rubyから別コマンドを実行するのがsystemしかなく ふつうにsystem使うと、コマンド終了待ちでRubyが止まっちゃうので Thread.new{system 'ほげほげ.exe 引数'} としてます 外部コマンド一つ起動するごとにスレッドが増えるけど 外部コマンドが終了すればスレッドも終了するだろうし 同時に起動することなんて多くても数十程度だろうから 大丈夫かなと forkしてexecするのが普通の同期しない外部コマンド起動のさせかたなんですか? Windowsなんでforkできないのです 1.9だとspawnが使えるんですけど
105 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:30:02 ] >>104 win前提ならstartコマンド経由で呼べばすぐ戻ってくる system "start ruby -e 'sleep 10'"
106 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:35:32 ] startはcmd.exeの内部コマンドなので GUIから呼ぶと一瞬cmd.exe起動の為に コマンドプロンプトウィンドウが出てしまうのです rubyw -e "system('start winver')" とかするとわかります
107 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:47:02 ] >>106 これはどうよ? require 'win32ole' wsh = WIN32OLE.new('Wscript.Shell') wsh.Run('cmd /c echo', 0, false)
108 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:51:39 ] ああ、wsh 厨が来た ってか Windows の cmd.exe の肝心なときに使えない度は異常
109 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:11:46 ] >>106 忘れてたorz Thread.new{system 'ほげほげ.exe 引数'}.kill というのは?スレッド殺してもプロセスまで殺さないはず。
110 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:19:59 ] >>108 ゲイツソフトに無理言うなよw
111 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:26:10 ] win32api使えばいいんじゃ ttp://d.hatena.ne.jp/mokehehe/20070812/createProcess
112 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:51:25 ] ちゃんとするならWin32APIなんでしょうね でも、お手軽じゃないなぁと Thread.new{system 'hoge.exe'} で、動いちゃってるので まあいいかなとそのままです >>109 すいません 私の場合は非同期に外部コマンドを起動したいだけなので 後々のコントロールできなくてもよいのです でも、Windowsで >>77 みたいなことをRubyにさせようとすると どうすればいいのでしょうね Win32APIを駆使? めんどくさそうだなぁ
113 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 01:17:57 ] >>112 CreateProcessするんじゃね? 使ったことないけど
114 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 09:31:01 ] 1.8で、コマンドプロンプトを見せるな、という制限を課されるといろいろつらいな。 CreateProcessなりShellExecute(Ex)なりを直接叩くしかないと思う。
115 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 09:36:05 ] IO.popen(program, "w") とか
116 名前:デフォルトの名無しさん [2009/04/07(火) 13:30:59 ] すみません。Cで拡張ライブラリを書くためにREADME.EXT.jaを 読んでいるのですが、次のような箇所があります。 > 既に『1.5 Rubyのデータを操作する』で一部紹介したような関数を > 使えば,Rubyの機能を実現している関数を直接呼び出すことが出来 > ます. > # このような関数の一覧表はいまのところありません.ソースを見 > # るしかないですね. これが書かれてから15年近く経った今でもそうなんでしょうか? 日本語・英語問わず、どこかに一覧表があれば欲しいのですが・・・。
117 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 18:07:07 ] rspec で BDD だとかなんかそんなのやってみようかなーと思ってるんだけど、 これってパブリックなメソッドの返り値しかチェックできないの? いくつも小さなメソッドに分割された、ある程度フクザツなメソッド作ってる最中は役に立たない?
118 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 18:22:29 ] >>117 逆 「作り始め」のメソッドの大きさはみんな一緒
119 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 18:34:39 ] tdiary 以外でテーマやスキンの充実した ruby アプリって何かありませんか。
120 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 19:31:53 ] Hiki
121 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 19:34:59 ] >>116 スレ違い
122 名前:119 mailto:sage [2009/04/07(火) 19:55:35 ] tdiary と同じテーマやスキン以外でお願いします>< MT や WP、Xoops みたいにド派手に変えられると嬉しいです。 Ruby ベースの CMS ttp://diaspar.jp/node/79 をみてもテーマ公開しているの少ないよね…。
123 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 20:01:41 ] >>117 RSpecでテストとか勉強しようと思ってずっと待ってるんだけど、そういう解説は見たことないね なんかテストのなんたるかを知ってる人が自由に使ってる感じがして、ちょっと寂しい 個々のマッチャとかの動作はわかりやすいんだけど、実際にこれどう使うのよみたいな
124 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:08:10 ] モデル・ビュー・コントローラの知識がないとたぶんダメ
125 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:27:18 ] >>122 PinkyBlog
126 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:29:47 ] >>123 TDDは俺もよくわからんので勉強中。 書籍だと「10日でおぼえる Ruby on Rails入門教室」がTDDやりながら開発する解説があるらしい。 rspecかどうかはわかんないけど Amazon.co.jp: 10日でおぼえる Ruby on Rails入門教室: arton: 本 www.amazon.co.jp/dp/4798114723 images-jp.amazon.com/images/P/4798114723.09.MZZZZZZZZZ.jpg
127 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:43:56 ] RSpecでBDDやって遊んでるだけでも、17インチ液晶の左右分割では幅が足りないと強く思う 家でだらだらスクリプト書いてるだけだしこれくらいでいいじゃんとこれまでは思ってたけど、ちょうど足りない 少なくとも19が欲しい 大きめフォントをちょっと小さくしたけど、やっぱ足りん うおー
128 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 01:22:05 ] >>116 ttp://doc.loveruby.net/refm/capi/ ずっと503 ttp://www.ruby-doc.org/doxygen/1.8.4/index.html doxygenの自動生成だからヘッダ読むのとほとんど変わらない ttp://www.nilab.info/docs/Ruby1.6.8/refm364.html かなり古い、1.6.8 こちらの知る限り現状はこんなところ loveruby.netが直れば一番いいんだろうけどずいぶん前から503のままなので期待薄
129 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 07:49:58 ] csvをMySQLに食わせるtsvにしたくてモゾモゾやってるんだけど a = ["mesi", "kue", "", "unko"] として a.map do |x| if x == "" x = "\N" end end の結果が [nil, nil, "\N", nil] となるのは何でなんでしょう。eachじゃダメだし。 つーか、["mesi", "kue", "\N", "unko"]にするステキな方法を 教えてくだしゃんせ。
130 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 08:12:54 ] ブロックつきの map{} は、ブロックの返り値で要素を置き換える で、 irb> p (if 1 == 2 then "true!" end) nil else 節がない if 文で条件が偽だった場合の文そのものの返り値が nil だ else を明示的に書くのがよい a.map{|e| if e.empty? then "\n" else e end}
131 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 08:24:47 ] x = "\N" は x = "\N" の返り値がたまたま "\N" だったからたまたま動作しただけだな ブロックつきメソッドは仮引数に代入することで動作するわけではない [1,2,3].map{|x| x = x*2} というような書き方は誤りで、 単に返り値だけを [1,2,3].map{|x| x*2} のように書く
132 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 08:37:27 ] △ ブロックの返り値で要素を置き換える ○ ブロック内で最後に評価された値が要素と置き換わる ブロックつきmapの「ブロックの返り値」は変換後の配列だ ブロックで最後に評価された値のことをブロックの返り値と呼んではいけない
133 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 08:53:51 ] × if 文 ○ if 式 公式でも if 文って書いてしまってるけどな 既存言語の影響は強い
134 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 09:30:31 ] Rubyでは文も式なだけであって、文を文と呼ぶのが誤りなわけではない。
135 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 09:59:47 ] 最新のparse.yを見る限り、 symt→expr→arg→primary→if という流れになってるので、 ifは式です。
136 名前:119 mailto:sage [2009/04/08(水) 10:30:51 ] >>125 ありがと。 「CSS着せ替えテンプレートプロジェクト」の存在も知ることができて感謝。
137 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 10:49:01 ] 少々お聞きします。 以下のソースにて、Ctrl+Cをトラップしようとして、 trap 'INT' do puts "TRAP!!" raise "ctrl+c" end loop do Kernel.sleep 1.5 end 実行してみたんですが、 Ruby win32 + コマンドプロンプト : OK Ruby win32 + コマンドプロンプト + cygwin bash: OK Ruby win32 + cygwin terminal + cygwin bash: x Ruby cygwin + cygwin terminal + cygwin bash: OK という結果になってしまいました。 Ruby win32 + cygwin の bashでCtrl+Cをトラップすることはできないのでしょうか?
138 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 11:10:14 ] >>133-135 Rubyでの文は「カッコなしのメソッド呼び出しの引数よりも優先順位が低い式」のこと。
139 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 11:12:34 ] >>137 > Ruby win32 + cygwin の bashでCtrl+Cをトラップすることはできないのでしょうか? できてるだろ。 > Ruby win32 + コマンドプロンプト + cygwin bash: OK 非cygwinプログラムからはcygwin terminalはttyには見えないので、 Ruby win32 + cygwin terminal ではできない。
140 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 11:25:04 ] >>139 ごめん。コピペミス・・・ > Ruby win32 + コマンドプロンプト + cygwin bash: OK Ruby win32 + コマンドプロンプト + cygwin bash: x ていうか、調べてたら cygwin から nativeアプリに(non-cygwin app) Ctrl+Cは鬼門みたいですね…。
141 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:04:44 ] >>133 ○if文 ◎if式 こうでしょ? 例えば関数呼び出しは式であり文でもあり。
142 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:07:16 ] とりあえず一つだけ。 初心者スレに過度の原理主義はあんまりよくない。 やりたいなら、本スレにコピペでも持って行って存分にやればいいと思うんだ。
143 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:19:15 ] すまんかった。正直ifの扱いはどうでもいいんだけど 「文は返値を持たないものだけを指す」と言わんばかりなのが気になって。 初心者スレだけになおさらね。
144 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:20:23 ] 文が値を返すのって感覚的にも不自然だと思う if は if 式と意図的に呼ぶべき 初心者スレならなおさら、初期の用語の統一は非常に重要 ttp://www.google.com/search?hl=ja&safe=off&num=50&q=Ruby+%22if%E5%BC%8F%22&lr=lang_ja ttp://www.google.com/search?hl=ja&safe=off&num=50&q=Ruby+%22if%E6%96%87%22&lr=lang_ja うおー負けてるー
145 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:20:39 ] 式の一部になれないのが文だっけ?
146 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:22:08 ] ifが式ってのが、Rubyの特徴のひとつだもんな。
147 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:27:06 ] 「if 式」のほうが実態をよく表してるし勘違いの元にもならないし興味の取っ掛かりにもなる つい口に出るもんなので仕方ないが、なるべく式と言うべきだと思った ちなみに、 for なんかは式だったかどうかをよく覚えてないので 「制御構造 for」とかいう表現で逃げたりする 大人は汚いね!
148 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:30:52 ] >>145 あっちにレスした pc12.2ch.net/test/read.cgi/tech/1238194350/50
149 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:31:38 ] >>145 pc12.2ch.net/test/read.cgi/tech/1238194350/50 > ( ) で囲めばなんでも式の一部 (primary) になる。
150 名前:149 mailto:sage [2009/04/08(水) 14:31:58 ] >>148 ごめん_| ̄|○
151 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:40:39 ] Cなどの既存言語の経験者が戸惑わないようにif文って呼んでるのに その辺の事情を無視してif式って呼ぼうってのは、悪しき原理主義だよなあ そういやこの前「関数って言うな」なんてのもあった あれも根っこは一緒か
152 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:41:59 ] >>151 既存言語の経験者が同じだと勘違いするほうが問題とか、 少しも思わない?
153 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:44:53 ] 初心者が引かない程度に抑えるのが肝要ってことでどうだろうか スレの使い分け大事
154 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:55:49 ] >>151 なんで違うものをわざわざ同じ名前で呼んで混乱させようと思うわけ?
155 名前:129 mailto:sage [2009/04/08(水) 15:14:57 ] >>130-131 thx!
156 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 15:38:31 ] マニュアルの最初の説明でそう書いてある場合は、Rubyでは 無理せずに そう呼べばいいじゃんね 無理して別の名前で呼ぶ理由もなかんべ
157 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 15:48:45 ] >>117 で話が出たので自分用スクリプトでちょっとやってみた 小さなメソッドひとつにつき正常と境界と例外で8つくらいずつテスト項目作る羽目になって非常にめんどくさい 別なとこ改造してもspecのテストさえ通ればとりあえず他への影響を忘れて次のことをしていいというのは気楽
158 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 16:45:49 ] a.map!{|s| s.sub(/var/, 'foo')} をもっと短く書く方法ってありますか? なくてもいいのですが、なんか ruby ならありそうな気がして。
159 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 17:01:14 ] >>158 特にない あと String#sub 系列はできれば sub(/var/){'foo'} と書いてくれ これは Ruby の構造的欠陥だが
160 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 17:03:10 ] 何十万回も置換を行うような場合は sub のブロック生成コストが気になるお年頃
161 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 17:04:58 ] {'foo'}あるいは{"foo#{1}bar"}程度のような単純なブロックは最適化してほしいもんだ
162 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 17:11:09 ] >>159 その構造的欠陥について詳細キボンヌ
163 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 17:51:27 ] 後方参照するときに$1か\1か迷ったり \をいくつ重ねればいいのか非常にわかりにくいという問題はある。 後方参照しないときまでブロックで書く理由は知らない。 転ばぬ先の杖じゃないかと思うけど、それなら理由書いたほうが。
164 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:01:30 ] 単に構造的欠陥と言ってみたかっただけです。
165 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:09:02 ] ユーザーは何も悪くない以上、構造上の欠陥ではあるような気はする
166 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:31:02 ] そんなことよりもさー require 'spec' require 'logger' class C attr_accessor :log def err log.info('error!') if log raise end end describe "C" do before :each do @obj = C.new end describe "#err" do it "ログにエラーの旨が記録されランタイムエラーが発生する" do sio = StringIO.new ; @obj.log = Logger.new(sio) lambda{lambda{@obj.err}.should change(sio, :to_s).from('').to('error!')}.should raise_error(RuntimeError) end end end これをかっちょよく書く方法教えておくれよ 最初は lambda{@obj.err}.should change(sio, :to_s).from('').to('error!') lambda{@obj.err}.should raise_error(RuntimeError) って書いて上の行で例外が飛び出てうまくいかないって質問しようと思ってて、 書き込む寸前に lambda を2重にすることに思い至ったんだけど、なんかあんま普通っぽくないんだよねこれ
167 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:57:00 ] > これをかっちょよく書く方法教えておくれよ 高いスーツを買って、ポルシェで高級ホテルに乗り付け、 最上階のレストランでノートPCを開いて書く。
168 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:59:25 ] 何という昭和w
169 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:02:56 ] > これをかっちょよく書く方法教えておくれよ 走ってくるトラックの前に飛び出して、 僕は死にません!Rubyが好きだから!僕は死にません! で、泣き止んで家に帰ってから書く。
170 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:05:35 ] 何という昭和からの平成w っていうか平均年齢おかしいだろこのスレ
171 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:12:38 ] いま従事している ruby のプロジェクトで、 ソースファイルの改行コードがばらばらになっていることに気づきました。 開発は Windows、本番環境はLinuxです。 Linux の LF に合わせようと思いますが、質問です。 Ruby は、ソースコードの改行コードがばらばらだったり、プラットフォームにあっていなくても動きますか? たとえば、Windows 上で、改行コードが LF のソースを動かす、など。 もし問題ないのならば、そのままにしてしまおうかなとも考えています (sed で置換しようと考えたが、sed の式をミスってソースの関係ないところも変えてしまったらどうしよう、と思っている)
172 名前:デフォルトの名無しさん [2009/04/08(水) 19:20:16 ] なんか精神的に嫌だな。
173 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:31:29 ] >>123 RSpecの書籍がでるらしい。今はpdf版が無料で読めるみたいだ。 RSpec 本 1 章のメモ - たかみやの日記 d.hatena.ne.jp/ytakamiya/20090407/1239078380
174 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 20:58:07 ] 質問させてください、Rubyで日本語を扱いたいと考えています Rubyのバージョンは1.9.1です("ruby -v"を実行すると"ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]"とでます) PCはWindowsXPHomeEditionSP3 を利用しています(Vistaでも使いたいです)、コードの実行はコマンドプロンプトで行っています やりたいことは日本語と英語の文字列の含まれたファイルから特定の文字列を正規表現で指定し置換することです しかし、最初からいきなりつまずいてます まず、以下のコードが実行できません puts "あ" 実行すると、"invalid multibyte char (US-ASCII)"と表示されます rubyのソースコードはUTF-8で保存しています また、日本語の含まれたファイルを読み込み中身を表示しようとして以下のコードを実行しました filename = ARGV[0] puts filename File.open(filename, "r:utf-8") do |file_input| file_input.each do |line| puts line end end しかし、日本語の部分が文字化けして表示されてしまいます(puts filenameの部分は日本語でも正常に表示されます) ソースコード、読み込むファイルともUTF-8で保存しています、また、読み込むファイルはファイル名に日本語を使っています 基本的な部分かもしれませんが、ネットで検索しても対策が良くわかりません アドバイスや情報をいただけると助かります、よろしくお願いいたします
175 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 20:59:49 ] >>166 あ、それ逆 「例外 E と変化 C が起きる」場合は lambda{ obj.should change(C) }.should raise_error(E) ではなく lambda{ obj.should raise_error(E) }.should change(C) の順番で書いてくれ 前者は raise_error が満たされた時点で終了してしまって change が検証されないよ それが証拠に、StringIO#to_s は StringIO オブジェクトを返して change(sio, :to_s) は失敗するはずなのに 何も起こってない
176 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:00:39 ] >>174 Ruby1.9.1 をアンインストールして Ruby 1.8.7 を使え
177 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:00:44 ] >>174 ttp://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l18 マジックコメントを書きましょう
178 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:11:56 ] サポートしてくれるものが無い場合は>>176 が正解 1.9.1を解説してくれる何かを頼りに学習してる場合はここで躓く可能性はないわけで、 つまりは1.9.1を教えてくれる教科書に該当するものを持ってないってことで そういう場合は無理せずに1.8.7を使ってRubyに慣れるのが吉 一生のうちに1種類の言語しか学習できない呪いがかかってるとかそういう場合は別途相談
179 名前:174 mailto:sage [2009/04/08(水) 21:14:45 ] レスありがとうございます >>176 できれば最新版を使いたいのですが、1.8系は1.9系より日本語の使用が楽なのでしょうか? >177 マジックコメントを記述した結果 puts "あ" は実行できました! しかし、残念なたら表示は文字化けしたままです また、日本語を含むファイルの文字化けも直りません 表示するときに、文字コードを指定するような方法はないのでしょうか? よろしくお願いいたします
180 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:21:43 ] 最新版だって判断できるくらいRubyに習熟してるなら自力でやれ
181 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:24:37 ] >>179 Ruby1.9では文字列はそれ自身がエンコードを持っていて 入出力などで必要なら自動で文字コード変換が走る しかし、コンソールへの標準出力では自動変換はなされないので 必要なら(Shift_JIS以外の文字列を出力するなら)自分で変換する(1) あるいは、自動変換が走るようにIOの設定を変える(2) のいずれかの対処が必要 らしい (1) puts line.encode("Windows-31J") (2) $stdout.set_encoding(Encoding.default_external) $stderr.set_encoding(Encoding.default_external)
182 名前:181 mailto:sage [2009/04/08(水) 21:29:30 ] 結果は同じだけど、(1)のほうも puts line.encode(Encoding.default_external) のほうがいいかな