1 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:21:25 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 ★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。 (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に完全対応していないためです。) 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 を習得すれば将来スムーズに 1.9 系に移行できるでしょう。 関連スレや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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
8 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 15:46:49 ] おまけ ・Rubygem 0.x 極悪動作をすることで有名なRuby外部ライブラリ利用サポートプログラム群のバージョン このバージョンしかパッケージが存在しないUNIX系ディストリビューションがあって結構問題に しかも「rubygem本体の自己更新機能は殺してるのでパッケージから入れてね」とかほざきやがる パッケージがバージョン 1 より前のものしかない場合はソースからインストールするとよい Rubygem は 1.0 も 1.1 も 1.2 も肝心なとこにバグ持ちなので極力 1.3 などの最新を使うこと
9 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 15:51:54 ] >>8 Ubuntu 9.xxでもaptで入れるとbinにパス通ってなかったり、どうしてこうなった?なことになってる 謎過ぎる。
10 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 16:02:10 ] >>9 pkg-ruby-extras.alioth.debian.org/index.html このへん? よく読んでないけど。
11 名前:デフォルトの名無しさん [2009/12/05(土) 17:32:12 ] a = 82.30 b = 80.20 print a - b, "\n" ←こうやると誤差がでますが printf("%.2f\n", a - b) ←修正はこれでいいですか?もっといい方法あります?
12 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 17:44:41 ] irb> a = 82.30 82.3 irb> b = 80.20 80.2 irb> p a-b 2.09999999999999 irb> require 'bigdecimal' irb> a = BigDecimal.new('82.30') irb> b = BigDecimal.new('80.20') irb> puts a-b 0.21E1 nil irb> puts (a-b).to_f 2.1
13 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 18:17:21 ] >>12 なるほど。BigDecimalですか。 そっちの方が推奨されるやり方なんでしょうか? 例えば以下の様な方法だと何か問題はありますか? a = 82.30 b = 80.20 c = nil c = sprintf("%.2f", a - b).to_f
14 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 19:00:05 ] >>13 それで問題があるかどうかはその数値の使われ方を知っている君が知ってるはず
15 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 20:02:12 ] >>14 という事は単純な桁数指定と切り上げ処理に限っていえば この方法でも問題ないという事ですね?
16 名前:デフォルトの名無しさん [2009/12/06(日) 01:38:06 ] character = Array.new character << {alph => "a", hiragana => "あ"} 上記のようなコードを書いた後に、katakana => "ア" を、 配列 character の中のハッシュの末尾に追加するには、どうすればよいでしょう character[[alph => "a", kana => "あ", ]] ^^^^^^^^^^^^^^^ ここに katakana => "ア" を追加したい。
17 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 01:46:15 ] >>16 alphaとかhiraganaというのはローカル変数なのか、 シンボルの記述ミスなのか # あまり本質的ではないけど一応確認。 character[-1].update(katakana => 'ア') character[-1]で配列の最後の要素にアクセスできる。 返ってくるのは該当要素それ自体(コピーではなく) これに破壊的メソッドを作用させればよい。 これ、ハッシュの「最後」に追加されるかどうかはバージョンによる。 MRIの1.9ではキーの追加順になるけど、ハッシュの本義に照らせば どこに追加されるかは仮定できない。
18 名前:デフォルトの名無しさん [2009/12/06(日) 01:53:27 ] >>17 > alphaとかhiraganaというのはローカル変数なのか、 > シンボルの記述ミスなのか 記述ミスです。。。 ありがとうございます!できました。
19 名前:デフォルトの名無しさん [2009/12/06(日) 02:19:04 ] なにこのキモいスレ
20 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 08:05:03 ] YARVの1.9からはハッシュの順番が保証されてるんだっけ?
21 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 08:12:15 ] なんか微妙な表現だがおおむねYESだ それがなくなることもない
22 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 14:05:43 ] injectが遅いんですが何のためにあるとですか? >> RUBY_DESCRIPTION => "ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]" >> Benchmark.realtime{Array.new(1_000_000).inject(0){|r,|r+0}} => 1.62985396385193 >> Benchmark.realtime{sum=0; 1_000_000.times{sum+=0}} => 0.377360105514526
23 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 16:11:36 ] 速くしたいなら速いほうで書けばいいじゃん
24 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 18:27:10 ] >>23 真理だな
25 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 18:31:49 ] (キリッ
26 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 19:42:32 ] >>22 injectは遅いし分かりにくいので、使わずに済むなら使わない方がいいと思う。 1.9にしたらけっこう速くなるけど。
27 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 21:53:15 ] 分かりにくいんじゃなくて、慣れていないだけでは。 なれれば、すぐ読めるよ。 injectは式一個でかけるし、メソッドチェーンも作れるってのがいいんじゃないかな。
28 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 22:50:01 ] >>22 injectは遅いけど、比較のしかたが違ってるんじゃ? injectを使うってことは配列とかをイテレートしたいってことだろうから require 'benchmark' hoge = Array.new(1_000_000) a = Benchmark.realtime{sum = hoge.inject(0){|r,e|r+0}} b = Benchmark.realtime{sum=0;hoge.each{|e|sum+=0}} print "#{a} / #{b} = #{'%1.5f'%[a/b]}" くらいが比較なんじゃないだろうか ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mingw32] 2.03125 / 0.21875 = 9.28571 ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32] 0.15625 / 0.078125 = 2.00000 1.8だと9倍おそいけど 1.9だと2倍のコスト しかも1.9のinjectの方が 1.8のeachより速い
29 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 22:51:50 ] ためしに配列を5倍にしたら ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mingw32] 34.421875 / 1.109375 = 31.02817 ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32] 0.640625 / 0.359375 = 1.78261 1.8のinjectがすごく遅くなった
30 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 22:58:04 ] さらに1.9だと p が引数をそっくり返り値にするので 前スレの [1,2,3,4,5].inject(0) {|result, item| p result += item } はそのままで動く puts とかprintfみたいに値を返さないメソッド使いたい場合 破壊的変更が出来るのなら each_with_object も使える [1,2,3,4,5].each_with_object('') {|item,result| printf("%10s\n",result << item.to_s) } injectと違い最後にresultを返り値に置かなくてもいい でも数値だと破壊的変更が出来ないので普通にinjectを使うしかないような
31 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 23:02:50 ] なんだかパッとしないな < each_with_object
32 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 00:00:35 ] hs = (0..5).map do |n| (0..5).map do |m| 0 end end 二次元配列を生成する方法にこんなものを知ったんですが もっと短くかけないんでしょうか?
33 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 00:04:21 ] 多次元配列というものは Ruby にはそもそもない つまり、ネストした配列で代用するしかない map でもいいんじゃね
34 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 01:29:14 ] hs = Array.new(6){Array.new(6){0}} hs = (0..5).map{|n|(0..5).map{|m|0}} hs = (0..5).map{(0..5).map{0}}
35 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 02:33:01 ] 理解困難 >> a1=Array.new(2) => [nil, nil] >> a1.map{|e|e.object_id} => [4, 4] >> a1[0]=:test => :test >> a1 => [:test, nil] >> a2=Array.new(2,Array.new(2)) => [[nil, nil], [nil, nil]] >> a2.map{|e|e.map{e.object_id}} => [[2983450, 2983450], [2983450, 2983450]] >> a2[0][0]=:test => :test >> a2.map{|e|e.map{e.object_id}} => [[2983450, 2983450], [2983450, 2983450]] >> a2 => [[:test, nil], [:test, nil]]
36 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 02:49:23 ] >>33-34 そうですかぁ 残念です
37 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 02:53:32 ] >>35 × a2.map{|e|e.map{e.object_id}} ○ a2.map{|e| e.map{|e| e.object_id}}
38 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 03:01:59 ] 把握
39 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 03:52:50 ] s = "aaa bbb ccc:ddd eee" if s =~ /ccc:(\S+)/ t = $1 s.gsub!(/ccc:(\S+)/, "") # この二度手間な記述をもっと簡潔に書くやり方はないですか? end p s # "aaa bbb eee" p t # "ddd"
40 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 05:06:06 ] こう? s = "aaa bbb ccc:ddd eee" t = s.gsub!(/ccc:(\S+)/, '') ? $~[1] : ''
41 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 05:10:30 ] >>39 これくらいしか思い付かん s = "aaa bbb ccc:ddd eee" t = s[/ccc:(\S+)/,1] s.gsub!(/ccc:(\S+)/,"") 又は s,t = "aaa bbb ccc:ddd eee" s.gsub!(/ccc:(\S+)/) { t = $1 ; "" } もしくは s = "aaa bbb ccc:ddd eee" s,t = $`+$',$1 if s =~ /ccc:(\S+)/
42 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 05:12:15 ] >>40 ここで $1 ではなく $~[1] を使う理由はある?
43 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 10:18:05 ] というか特段二度手間でもない 簡潔でわかりやすくていいじゃん
44 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 11:08:35 ] attr_* をそのままライブラリ外に公開する理由ってたいていの場合薄いよね?
45 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 11:16:10 ] >>44 そういう考え方もある 内部変数名と同じ名前のpublicなメソッドを外部提供する理由は本来無い ユーザーに提供されるべきは、もっと一段上の名称&機能なメソッドであるべき attr_writer :username, :password ではなく def user_info(h={}) @username, @password = h[:username], h[:password] end とかのほうがいいんじゃね、みたいな考え オープンクラスだし堅いこと言うなJava使えJavaって感じではあるが
46 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 16:30:36 ] >>39 gsub!を使うということは複数回の置換が想定されるのか? tの値は置換が起こらなければ保存しておきたいのか? 置換でも$1は得られるので 複数回の置換がおこなわれるうちの最後の$1が取れればいいだけなら >>40 でいい 置換が起こらなければtを変更したくないのならば t = $1 if s.gsub!(/ccc:(\S+)/, '') とか、置換が起こらなければt=nilになってもいいのなら t = s.gsub!(/ccc:(\S+)/, '') && $1 複数回置換のうちの最初の $1 が得たいのなら 置換が起こらなければt=nilになりますが >>41 の二番目をちょっと変えた t = nil s.gsub!(/ccc:(\S+)/) { t ||= $1 ; "" } とか t = nil t ||= $1 while s.sub!(/ccc:(\S+)/,'') #gsub!と違って置換した結果をさらに置換していくので結果が変わることもある とかですかね でも、巨大文字列内の大量置換を一気にやり、なおかつ最初の$1を得たいのなら>>39 が一番速いかな >>41 の最初のでもいいけど tが変更されるし>>39 の方がわかりやすい
47 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 19:14:47 ] ttp://itpro.nikkeibp.co.jp/article/Interview/20090106/322300/ 今年はじめのこんな記事を見つけたんだけど、仕様書草案ってもうどこかで見られる?
48 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 19:19:46 ] RubySpecかな
49 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 19:31:48 ] >>47 Rubyについて Part 38 pc12.2ch.net/test/read.cgi/tech/1257079004/ 261 名前: デフォルトの名無しさん Mail: sage 投稿日: 2009/12/01(火) 19:36:45 ruby-std.netlab.jp/
50 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 19:39:59 ] ddd! ありがとうございます!
51 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 21:34:59 ] Rubyのテスト用フレームワークっていくつかあるみたいですが何がいいでしょうか? 場合による、という結論かもしれませんが みなさんは何を使ってますか?
52 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 21:45:45 ] 目的によるし、おおむね目的ごとに分かれてると思う 自分で使ってテストの方向性に合うものを選択するといい テストフレームワークを1種類しか使えない、という人は少ない よーわからんがテストってあると便利そうじゃね、というのなら RSpec から始めるといいんじゃね
53 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:19:44 ] よーわからんがテストってあると便利そうじゃね、というレベルなら、 標準添付のtest/unitがいいんじゃね
54 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:34:53 ] テストっちゃ、「ファイルに保存されたかどうか」のテストってどうやるん
55 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:44:51 ] >>52-53 アドバイスありがとうございます そうですね、もう少し調べたりいろいろ使ってみて決めたいと思います
56 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:47:08 ] ・ 書き出し先ファイルがあれば削除 ・ ファイル保存を含んだメソッドを実行 ・ 例外が起こらないことをテスト ・ ファイルの中身が期待通りであることをテスト ・ 書き出し先ファイルがあれば削除 書き出すファイルを削除できないという場合は知らん 「きっと保存されるはず」みたいなテストするしかなくね
57 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 03:20:32 ] 最終手段的には、事前にFile.openやFile#writeをフックとか・・・
58 名前:デフォルトの名無しさん [2009/12/08(火) 11:45:06 ] FTPでディレクトリの更新日時が知りたいのですが取れません 一般的に、FTPではLSコマンドの結果を解釈するしかないのでしょうか? (net/ftpを利用してます)
59 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 11:55:44 ] MLSDとか送ればいいんじゃないの
60 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 13:17:10 ] >>58 一般には自力で解析するしかない。 MDTMというコマンドもあるがすべてのftpサーバが実装しているわけではない。
61 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 14:02:01 ] >>54 class Publisher def initialize(p) @text, @from, @to, @path = p[:text], p[:from], p[:to], p[:path] end def publish output = replace(@text, @from, @to) save(output, @path) end def replace(text, from, to); text.gsub(/#{from}/){to}; end def save(str, path); File.open(path, 'wb'){|f| f.print(str)}; end end # Publisher.new(:text => 'ruby大好き!', :from => 'ruby', :to => 'オブジェクト指向スクリプト言語Ruby', # :path=> 'ruby_love.txt').publish #=> "オブジェクト指向スクリプト言語Ruby大好き!" これの Publisher#save をテストしたいとかそんなの?
62 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 14:29:56 ] >>61 こう囁く 「なー、そのsaveするときの文字列がクラス本体にpとか追記せずに画面に表示できたら便利だと思わね?」 そしてこうする class Publisher def initialize(p) @text, @from, @to, @path = p[:text], p[:from], p[:to], p[:path] end def publish output = replace(@text, @from, @to) save(io, output) end def io case @path when IO, File then @path when "$stdout", nil then $stdout when "$stderr" then $stderr else File.open(@path, 'wb') end end def replace(text, from, to); text.gsub(/#{from}/){to}; end def save(io, str); io.print(str); io.close if io.kind_of?(File); end end Publisher.new(:text => 'ruby大好き!', :from => 'ruby', :to => 'オブジェクト指向スクリプト言語Ruby', :path=> $stdout).publish これなら Publisher#save に StringIO を渡せばテストできるはず 保存時ファイル操作のエラーのときに独自処理したい場合はこれでは駄目だけど
63 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 16:17:20 ] JRubyとRubyの違いについて調べてみたのですが、 いまいちわからなかったのでここで質問してみます。 JRubyはコーディングの仕方が、Rubyと同じなだけであり、 それ以外の部分は全く別なものという解釈でいいのかな? 根本は全く違うものではあるが、コードレベルでは 同じ内容で動くものなので、移植する場合は、 コードのコピペでおk・・・かな?
64 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 17:29:49 ] >>59 , 60 ありがとうございました
65 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 19:03:00 ] >>63 普通のRubyはCで書いてある Cで書いてあるので拡張ライブラリはCで作るとよく動く 現在のCのバイナリはだいたい同じように動作することが期待できるのでRubyスクリプトを一度書けばどこでも動く JRubyはJavaで書いてあるというかJavaで動くというかJava仮想マシンJVM上で動作する Javaで書いてあるので拡張ライブラリはJavaで作ると普通に動く おまけにJavaプログラムの一部として埋め込むことも実行することもJavaのライブラリを呼ぶこともできる 通常のRuby(Cで書かれているので区別のためにCRubyと呼ぶ)と同じように動作するように作ってあるものの たまーに動作が違う部分が混じってることもないわけではないんだが いちいちスクリプトレベルで対処するのも面倒だしそれこそ煩雑なので無視 本質的にはJVMのぶんだけJRubyのほうが遅い ただ、JVMを常に起動してる場合は遜色ないか、JRubyのほうが処理が速いこともある
66 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 06:11:28 ] ,―ヽ____、― ,/ ノ ヽ ~\ / ノ IPA ヽ ~\ / ノ ヽ、 `ヽ | ノ / ̄\ / ̄~ヽ ヽ i | ノ | ノ \ | <●> <●> ( ) \ | | | i / | / ヽ レ i (●_●) / i、 ,-――-、 ・ / i、 <(EEEEE)> ∵/ まピョーん☆ IPA Rubyをこれからもよろしく i、 \___/ _/ \ ,ノ ,,.....イ.ヽヽ、ー-―一ノ゙-、. : | '; \_____ ノ.| ヽ i | \/゙(__)\,| i | > ヽ. ハ | ||
67 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 10:43:59 ] おまえら1.9.1更新しろー ttp://sourceforge.jp/magazine/09/12/08/1011230 と思ったがインストーラつきを公開してる人はまだいないのね
68 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 10:47:19 ] みんなに広まってからアップグレードする どうせチェックにしか使ってないし、自分だけ「みんなと違って最新」だと意味ないし
69 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:01:47 ] >>68 安心しろ 1.9.1を普段使ってる奴は普通にアップグレードするし、 1.9.1を自分のスクリプト用のチェックにしか使ってない奴は 「この人のスクリプト俺の1.9.1-p0(しかもmswin32)だと動かないんすけどー」とか言ってきたりはしない とっととアップグレードすれ
70 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:14:16 ] head使いには関係ないしな。
71 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:19:29 ] というか、パッチレベル0を鬱陶しいと思ってる人にこそ、 「1.9.1は最新版でしかチェックしてません」と公言するのをお勧め そうしないといつまでたってもだらだら残るぞ 自分のサイトに最新版へのリンクでも張っとけ
72 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:25:34 ] ~/work/source/ruby-1.9.1-p243$ make uninstall make: *** ターゲット `uninstall' を make するルールがありません. 中止. ぬう てか前回のconfigureにどんなオプションつけたか忘れたしどこにインストールされたか調べるのめどい
73 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:45:58 ] 「引数はHashの入ったArrayにしろ」って英語の警告でどう言えばいい?
74 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:54:23 ] raise ArgumentError, "invalid argument, RTFM"
75 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:12:55 ] ArgumentError を出したなら「引数が不正です」は言う必要なくね
76 名前:デフォルトの名無しさん [2009/12/09(水) 12:35:33 ] >>73 スレ違い。 このへんで聞け。 pc12.2ch.net/test/read.cgi/tech/1193554741/
77 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:37:03 ] URLを間違えた。こっちだ。 pc12.2ch.net/test/read.cgi/tech/1224696505/
78 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:44:01 ] >>73 Hashを要素にしたArrayって英語でなんて言うんだろうね よく使われるんだから呼び名がありそうだけど
79 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:45:27 ] >>78 Hashを要素にしたArrayって日本語でなんて言うんだろうね よく使われるんだから呼び名がありそうだけど
80 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:55:43 ] >>78 Hashed Array
81 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 13:25:14 ] 初心者以前の入門者の質問で申し訳ないのですが Rubyの絵本で勉強を始めましたところ 「配列要素の代入と参照」の項のサンプルコードで躓きました。 n cats = [] = 1 cats[0] = "Kuro" cats[1] = "Tama" cats[2] = "Mike" cats[3] = "Tora" puts cats[n] cats[0] = "Shiro" このサンプルの1行目で以下のようなエラーが出てしまいます hello.rb:1: syntax error n cats = [] = 1 ^ ググりまして「syntax error」が文法だということは分かりましたが 文法はまだ「文字列表示」と「変数」と「文字列」しか学習出来ていません 本の通りに入力しただけで、この1行目について本には一切説明がないので どのように文法が違うのかも分からない状態です この1行目がどのような意味なのか教えていただけないでしょうか よろしくお願いいたします 環境 CentOS 5.3 ruby 1.8.5 (2006-08-25) [x86_64-linux]
82 名前:81 mailto:sage [2009/12/09(水) 13:28:11 ] >n cats = [] = 1 >^ スペースが省略されて「^」の位置がずれてしまいました 「^」は=と1の間にあるスペース部分を指しています
83 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 13:31:59 ] 本書くとき間違えたんだろうな 売れてないのか何なのか正誤表にはとくに載ってない おそらくこれが正しい n = 1 cats = [] cats[0] = "Kuro" cats[1] = "Tama" cats[2] = "Mike" cats[3] = "Tora" puts cats[n] cats[0] = "Shiro" putsでは cats[1] の Tama が表示されるはず
84 名前:デフォルトの名無しさん [2009/12/09(水) 13:38:25 ] 質問 メソッドの中から、そのメソッドを呼び出しているメソッドの名前を知りたいのですが、 Kernel#caller以外の方法はありますか? 現在、caller が返す配列の中身に大してパターンマッチングを行って メソッド名を切り出しているのですが、もっとよい方法がありそうな気がしまして
85 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 13:42:44 ] 個人的には、空の配列に添え字代入のサンプルを書く本はあんまし好きじゃない せっかくのRubyなんだからもっとコレクションとしての扱い方から見せたほうがいいと思うなあ cats = [] cats << "Kuro" cats << "Tama" cats << "Mike" cats << "Tora" p cats puts cats[1] cats[1] = "Shiro" p cats こっちのほうがきっと驚いてもらえるぞ 「配列ってなんかざくざく入るんだね!」みたいな
86 名前:81 mailto:sage [2009/12/09(水) 13:43:10 ] >>83 ありがとうございます 無事Tamaを表示することができました。
87 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 13:58:35 ] >>80 うそをいうな。
88 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:02:07 ] >>87 では真実を
89 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:20:00 ] Hashed Array = Associative Array = rubyのHash
90 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:20:08 ] array of hashes じゃないの?
91 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:57:30 ] array containing hash
92 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:59:57 ] 泣きながらF5連打してたらこまるので >>84 それが普通の手段
93 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 15:03:04 ] >>84 ,92 1.8.7以降を使ってるなら、__method__で。
94 名前:93 mailto:sage [2009/12/09(水) 15:04:07 ] あ、ごめん、見間違えた。 呼び出し元を知るには、当然callerですね。
95 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 05:12:13 ] 独習Rubyってどうよ?
96 名前:デフォルトの名無しさん [2009/12/10(木) 08:41:52 ] Googったんですけどわかんなかったんで教えてくださいおながいします。 「AはBクラスのインスタンスである」ってのは A === B って書きますが、「AはBクラスの インスタンスでない」ってのはどう書けばいいでしょうか?
97 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:16:33 ] === の否定はないから全体を !
98 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:20:24 ] > 「AはBクラスのインスタンスである」ってのは A === B って書きますが いいえ a.kind_of?(B) とでも書いてください 特定クラスのインスタンスでないということをチェックしたい場合は unless a.kind_of?(B) と書くか、または if !a.kind_of?(B) と書きます
99 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:22:57 ] >>96 A === B というのはA(レシーバ)の持つ===というメソッドに引数としてBを渡すということ(A.===(B)と同じ) メソッド===はレシーバのクラスによって意味が違う ttp://www.ruby-lang.org/ja/man/html/Object.html#self.3d.3d.3d Classクラス(の親クラスであるModuleクラス)の===メソッドは以下の意味 ttp://www.ruby-lang.org/ja/man/html/Module.html#self.20.3d.3d.3d.20obj だから「AはBクラスのインスタンスである」を書くとするならBのメソッドなので B === A としなければならない 目的のはinstance_of?の否定かkind_of?の否定か ttp://www.ruby-lang.org/ja/man/html/Object.html#instance_of.3f
100 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:37:35 ] >>99 初心者に instance_of? を勧めるのは正直あまりお勧めしない irb> p 12.instance_of?(Integer) false irb> p 12.instance_of?(Fixnum) true irb> p 10000000000.instance_of?(Fixnum) false irb> p 10000000000.instance_of?(Bignum) true irb> require 'uri' irb> p URI.parse("example.com/ ").instance_of?(URI) false irb> p URI.parse("example.com/ ").instance_of?(URI::HTTP) true 間違ってないけどー 動作合ってるけどー でもー
101 名前:96 [2009/12/10(木) 09:50:45 ] みなさんありがとう。Googり方が悪いんだよカス!とか言われると思ってました。
102 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:52:57 ] === が検索できるようになってたら罵倒されたと思う
103 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:53:39 ] >>101 いちいちスレあげんなカス!
104 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:57:37 ] >>65 分かりやすい解説ありがとうございました。 イメージがつきました。
105 名前:デフォルトの名無しさん [2009/12/10(木) 14:00:10 ] >>103 うるせーバカ
106 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 16:30:19 ] 2chブラウザ使っている人で、スレッドの位置を気にしている人はいるの? 俺は履歴とかブックマークからスレッドにたどり着いているので、板一覧とか 見ていないし、スレッドの位置も特に気にしていない。 そもそも、こういう掲示板のage/sageって自由であるべきで 他人が強制するものではないと思う。
107 名前:デフォルトの名無しさん [2009/12/10(木) 19:27:14 ] aというハッシュのキーにclassがあったらその値に " button"を追加して、なかったら"button"だけ、という記述を 下記のように書いたのですが、 もうちょっといい書き方ないもんでしょうか? [{}, {:class => "hoge"}].each do |a| a[:class] = (a[:class] ? a[:class] + " ": "") + "button" #←ここをなんとかしたい p a end
108 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 19:48:10 ] マジレス if a[:class] a[:class] += ": button" else a[:class] = "button" end ネタレス a[:class] = [a[:class], "button"].compact.join(": ")