プログラミング言語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つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す
http://www.ruby-lang.org/ja/man/ ・FAQを一応読む
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
バージョンに関するよくある質問 ・Ruby 1.8.5 レンタルサーバ等にいまだに残ってる非安定な古いバージョン 1.8.6 にすらなってない理由はたぶん管理の手抜きなので怒ってよい ・Ruby 1.8.6 過去の長期政権と数の暴力で一大勢力圏を維持中の旧安定版 公開スクリプトはこれでも動作するべきではあるんだがそろそろ 1.8.7 に譲ってくれ ・Ruby 1.8.7 1.9 シリーズの機能をいくつか足したハイブリッドなバージョン、初学者にこそお勧め 1.9 系機能は 1.8.6 では動かないが「えーマジ1.8.6!? 1.8.6が許されるのは小(AA略」と煽ってよい ・Ruby 1.9.0 不安定にして先鋭機能が超満載の開発版バージョンだったもの 1.9.x は本来全てが開発版の呼称だったのだが、事情が変わって(ここ笑うところ)1.9.1 は安定板に ・Ruby 1.9.1 満を持して登場の 1.9 系列安定板(本体は 1.8.6 程度には使えるということになっている) 本体と添付ライブラリの動作は問題がないのだが外部第三者ライブラリが全く追いついていない 初心者を脱した人が外部ライブラリの開発コミュニティに参加してくれたりすることを期待中
前すれ
>>999 確かにこれでもいいが、メソッドチェーンできねえからな・・・
p {"a" => 1, "b" => 2, "c" => 3}.map{|x|x[1]}
SyntaxError: compile error
>999 名前:デフォルトの名無しさん[sage] 投稿日:2009/12/05(土) 14:16:08
>
>>989 >中カッコを外すとかは?
>
>p "a" => 1, "b" => 2, "c" => 3
おまけ ・Rubygem 0.x 極悪動作をすることで有名なRuby外部ライブラリ利用サポートプログラム群のバージョン このバージョンしかパッケージが存在しないUNIX系ディストリビューションがあって結構問題に しかも「rubygem本体の自己更新機能は殺してるのでパッケージから入れてね」とかほざきやがる パッケージがバージョン 1 より前のものしかない場合はソースからインストールするとよい Rubygem は 1.0 も 1.1 も 1.2 も肝心なとこにバグ持ちなので極力 1.3 などの最新を使うこと
>>8 Ubuntu 9.xxでもaptで入れるとbinにパス通ってなかったり、どうしてこうなった?なことになってる
謎過ぎる。
11 :
デフォルトの名無しさん :2009/12/05(土) 17:32:12
a = 82.30 b = 80.20 print a - b, "\n" ←こうやると誤差がでますが printf("%.2f\n", a - b) ←修正はこれでいいですか?もっといい方法あります?
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
>>12 なるほど。BigDecimalですか。
そっちの方が推奨されるやり方なんでしょうか?
例えば以下の様な方法だと何か問題はありますか?
a = 82.30
b = 80.20
c = nil
c = sprintf("%.2f", a - b).to_f
>>13 それで問題があるかどうかはその数値の使われ方を知っている君が知ってるはず
>>14 という事は単純な桁数指定と切り上げ処理に限っていえば
この方法でも問題ないという事ですね?
16 :
デフォルトの名無しさん :2009/12/06(日) 01:38:06
character = Array.new character << {alph => "a", hiragana => "あ"} 上記のようなコードを書いた後に、katakana => "ア" を、 配列 character の中のハッシュの末尾に追加するには、どうすればよいでしょう character[[alph => "a", kana => "あ", ]] ^^^^^^^^^^^^^^^ ここに katakana => "ア" を追加したい。
>>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
なにこのキモいスレ
YARVの1.9からはハッシュの順番が保証されてるんだっけ?
なんか微妙な表現だがおおむねYESだ それがなくなることもない
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
速くしたいなら速いほうで書けばいいじゃん
(キリッ
>>22 injectは遅いし分かりにくいので、使わずに済むなら使わない方がいいと思う。
1.9にしたらけっこう速くなるけど。
分かりにくいんじゃなくて、慣れていないだけでは。 なれれば、すぐ読めるよ。 injectは式一個でかけるし、メソッドチェーンも作れるってのがいいんじゃないかな。
>>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より速い
ためしに配列を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がすごく遅くなった
さらに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を使うしかないような
なんだかパッとしないな < each_with_object
hs = (0..5).map do |n| (0..5).map do |m| 0 end end 二次元配列を生成する方法にこんなものを知ったんですが もっと短くかけないんでしょうか?
多次元配列というものは Ruby にはそもそもない つまり、ネストした配列で代用するしかない map でもいいんじゃね
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}}
理解困難 >> 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]]
>>35 × a2.map{|e|e.map{e.object_id}}
○ a2.map{|e| e.map{|e| e.object_id}}
把握
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"
こう? s = "aaa bbb ccc:ddd eee" t = s.gsub!(/ccc:(\S+)/, '') ? $~[1] : ''
>>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+)/
>>40 ここで $1 ではなく $~[1] を使う理由はある?
というか特段二度手間でもない 簡潔でわかりやすくていいじゃん
attr_* をそのままライブラリ外に公開する理由ってたいていの場合薄いよね?
>>44 そういう考え方もある
内部変数名と同じ名前のpublicなメソッドを外部提供する理由は本来無い
ユーザーに提供されるべきは、もっと一段上の名称&機能なメソッドであるべき
attr_writer :username, :password
ではなく
def user_info(h={})
@username, @password = h[:username], h[:password]
end
とかのほうがいいんじゃね、みたいな考え
オープンクラスだし堅いこと言うなJava使えJavaって感じではあるが
>>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 の方がわかりやすい
RubySpecかな
ddd! ありがとうございます!
Rubyのテスト用フレームワークっていくつかあるみたいですが何がいいでしょうか? 場合による、という結論かもしれませんが みなさんは何を使ってますか?
目的によるし、おおむね目的ごとに分かれてると思う 自分で使ってテストの方向性に合うものを選択するといい テストフレームワークを1種類しか使えない、という人は少ない よーわからんがテストってあると便利そうじゃね、というのなら RSpec から始めるといいんじゃね
よーわからんがテストってあると便利そうじゃね、というレベルなら、 標準添付のtest/unitがいいんじゃね
テストっちゃ、「ファイルに保存されたかどうか」のテストってどうやるん
>>52-53 アドバイスありがとうございます
そうですね、もう少し調べたりいろいろ使ってみて決めたいと思います
・ 書き出し先ファイルがあれば削除 ・ ファイル保存を含んだメソッドを実行 ・ 例外が起こらないことをテスト ・ ファイルの中身が期待通りであることをテスト ・ 書き出し先ファイルがあれば削除 書き出すファイルを削除できないという場合は知らん 「きっと保存されるはず」みたいなテストするしかなくね
最終手段的には、事前にFile.openやFile#writeをフックとか・・・
58 :
デフォルトの名無しさん :2009/12/08(火) 11:45:06
FTPでディレクトリの更新日時が知りたいのですが取れません 一般的に、FTPではLSコマンドの結果を解釈するしかないのでしょうか? (net/ftpを利用してます)
MLSDとか送ればいいんじゃないの
>>58 一般には自力で解析するしかない。
MDTMというコマンドもあるがすべてのftpサーバが実装しているわけではない。
>>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 をテストしたいとかそんなの?
>>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 を渡せばテストできるはず
保存時ファイル操作のエラーのときに独自処理したい場合はこれでは駄目だけど
JRubyとRubyの違いについて調べてみたのですが、 いまいちわからなかったのでここで質問してみます。 JRubyはコーディングの仕方が、Rubyと同じなだけであり、 それ以外の部分は全く別なものという解釈でいいのかな? 根本は全く違うものではあるが、コードレベルでは 同じ内容で動くものなので、移植する場合は、 コードのコピペでおk・・・かな?
>>63 普通のRubyはCで書いてある
Cで書いてあるので拡張ライブラリはCで作るとよく動く
現在のCのバイナリはだいたい同じように動作することが期待できるのでRubyスクリプトを一度書けばどこでも動く
JRubyはJavaで書いてあるというかJavaで動くというかJava仮想マシンJVM上で動作する
Javaで書いてあるので拡張ライブラリはJavaで作ると普通に動く
おまけにJavaプログラムの一部として埋め込むことも実行することもJavaのライブラリを呼ぶこともできる
通常のRuby(Cで書かれているので区別のためにCRubyと呼ぶ)と同じように動作するように作ってあるものの
たまーに動作が違う部分が混じってることもないわけではないんだが
いちいちスクリプトレベルで対処するのも面倒だしそれこそ煩雑なので無視
本質的にはJVMのぶんだけJRubyのほうが遅い
ただ、JVMを常に起動してる場合は遜色ないか、JRubyのほうが処理が速いこともある
,―ヽ____、― ,/ ノ ヽ ~\ / ノ IPA ヽ ~\ / ノ ヽ、 `ヽ | ノ / ̄\ / ̄~ヽ ヽ i | ノ | ノ \ | <●> <●> ( ) \ | | | i / | / ヽ レ i (●_●) / i、 ,-――-、 ・ / i、 <(EEEEE)> ∵/ まピョーん☆ IPA Rubyをこれからもよろしく i、 \___/ _/ \ ,ノ ,,.....イ.ヽヽ、ー-―一ノ゙-、. : | '; \_____ ノ.| ヽ i | \/゙(__)\,| i | > ヽ. ハ | ||
みんなに広まってからアップグレードする どうせチェックにしか使ってないし、自分だけ「みんなと違って最新」だと意味ないし
>>68 安心しろ
1.9.1を普段使ってる奴は普通にアップグレードするし、
1.9.1を自分のスクリプト用のチェックにしか使ってない奴は
「この人のスクリプト俺の1.9.1-p0(しかもmswin32)だと動かないんすけどー」とか言ってきたりはしない
とっととアップグレードすれ
head使いには関係ないしな。
というか、パッチレベル0を鬱陶しいと思ってる人にこそ、 「1.9.1は最新版でしかチェックしてません」と公言するのをお勧め そうしないといつまでたってもだらだら残るぞ 自分のサイトに最新版へのリンクでも張っとけ
~/work/source/ruby-1.9.1-p243$ make uninstall make: *** ターゲット `uninstall' を make するルールがありません. 中止. ぬう てか前回のconfigureにどんなオプションつけたか忘れたしどこにインストールされたか調べるのめどい
「引数はHashの入ったArrayにしろ」って英語の警告でどう言えばいい?
raise ArgumentError, "invalid argument, RTFM"
ArgumentError を出したなら「引数が不正です」は言う必要なくね
76 :
デフォルトの名無しさん :2009/12/09(水) 12:35:33
>>73 Hashを要素にしたArrayって英語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど
>>78 Hashを要素にしたArrayって日本語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど
初心者以前の入門者の質問で申し訳ないのですが 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 :2009/12/09(水) 13:28:11
>n cats = [] = 1 >^ スペースが省略されて「^」の位置がずれてしまいました 「^」は=と1の間にあるスペース部分を指しています
本書くとき間違えたんだろうな 売れてないのか何なのか正誤表にはとくに載ってない おそらくこれが正しい 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 が返す配列の中身に大してパターンマッチングを行って メソッド名を切り出しているのですが、もっとよい方法がありそうな気がしまして
個人的には、空の配列に添え字代入のサンプルを書く本はあんまし好きじゃない せっかくのRubyなんだからもっとコレクションとしての扱い方から見せたほうがいいと思うなあ cats = [] cats << "Kuro" cats << "Tama" cats << "Mike" cats << "Tora" p cats puts cats[1] cats[1] = "Shiro" p cats こっちのほうがきっと驚いてもらえるぞ 「配列ってなんかざくざく入るんだね!」みたいな
86 :
81 :2009/12/09(水) 13:43:10
>>83 ありがとうございます
無事Tamaを表示することができました。
Hashed Array = Associative Array = rubyのHash
array of hashes じゃないの?
array containing hash
泣きながらF5連打してたらこまるので
>>84 それが普通の手段
>>84 ,92
1.8.7以降を使ってるなら、__method__で。
94 :
93 :2009/12/09(水) 15:04:07
あ、ごめん、見間違えた。 呼び出し元を知るには、当然callerですね。
独習Rubyってどうよ?
96 :
デフォルトの名無しさん :2009/12/10(木) 08:41:52
Googったんですけどわかんなかったんで教えてくださいおながいします。 「AはBクラスのインスタンスである」ってのは A === B って書きますが、「AはBクラスの インスタンスでない」ってのはどう書けばいいでしょうか?
=== の否定はないから全体を !
> 「AはBクラスのインスタンスである」ってのは A === B って書きますが いいえ a.kind_of?(B) とでも書いてください 特定クラスのインスタンスでないということをチェックしたい場合は unless a.kind_of?(B) と書くか、または if !a.kind_of?(B) と書きます
>>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("
http://example.com/ ").instance_of?(URI)
false
irb> p URI.parse("
http://example.com/ ").instance_of?(URI::HTTP)
true
間違ってないけどー
動作合ってるけどー
でもー
101 :
96 :2009/12/10(木) 09:50:45
みなさんありがとう。Googり方が悪いんだよカス!とか言われると思ってました。
=== が検索できるようになってたら罵倒されたと思う
>>65 分かりやすい解説ありがとうございました。
イメージがつきました。
105 :
デフォルトの名無しさん :2009/12/10(木) 14:00:10
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
マジレス if a[:class] a[:class] += ": button" else a[:class] = "button" end ネタレス a[:class] = [a[:class], "button"].compact.join(": ")
デフォルト値が設定されてるとおかしなことになりそうな気が…
デフォルト値を設定すること自体がおかしいだろ
二時間近く
>>108 に突っ込む奴がいないわけだが
年末でいつもの人は忙しいのかw
デフォルト値は設定しちゃダメなの?
配列aとbが対等な関係にある場合に、 a.zip(b) とするのは対称でなくて見た目が悪いと思うのですが、どう思いますか?
それ感じたことがある。けれど代替案が見つからない。
別にどうも思いませんが まあ気になるならArrayクラスのクラスメソッドにでもしてしまうとよろし Array.zip(a, b) みたいなのなら問題あんめえ
>>115 それいいね。それなら、3項間以上でもすっきりかけるね。
Array.zip(a, b) みたいな形だとどう?
ついでにEnumeratorを返すようにしてほしいと思いませんか?
つーとむしろ Enumerator.zip(a,b) なんか変か?
>>107 [{}, {:class => "hoge"}].each do |a|
a[:class] &&= a[:class]+" button"
a[:class] ||= "button"
p a
end
[{}, {:class => "hoge"}].each do |a|
begin
a[:class] += " button"
rescue
a[:class] = "button"
end
p a
end
def space_add h,s
return nil if h.nil?
h.replace( h+" "+s )
end
[{}, {:class => "hoge"}].each do |a|
space_add(a[:class],"buttom") || a[:class] = "button"
p a
end
>>113 ですが、新しいメソッド付加するほどでもないと思っていたら困ったことに・・・
ちなみに本当にほしいものは、長いほうに合わせて
[[3, 1], [4, 2], [5, 2], [6, 2]]
です。メソッド追加しないと無理ですかね?
################################
irb(main):005:0> a = [1,2]
=> [1, 2]
irb(main):006:0> b = [3,4,5,6]
=> [3, 4, 5, 6]
irb(main):007:0> a.zip(b)
=> [[1, 3], [2, 4]]
irb(main):008:0> b.zip(a)
=> [[3, 1], [4, 2], [5, nil], [6, nil]]
追伸: しかも欲しいものは配列じゃなくてEnumeratorです。 > zip(a,b).each{|e| p e} [1,3] [2,4] [2,5] [2,6] みたいに。
twitterとかで、投稿時刻を HH:MM:SS ではなく、「約15分前」「約2時間前」というふうに表示してますけど、 これをやってくれるRubyのライブラリはありますか。 ついでにJavaScriptのライブラリもあるとうれしいです。
ありません。自分で書いてください。 (Time.now.to_i - time.to_i) を適当に加工したらできるし。
railsならdistance_of_time_in_words
>>125 >distance_of_time_in_words
Thank you very much!
>>124 F***!
RubyはLispの替わりで使えるのか?
文法が全然違うからLispのソースはまず動かないよ
130 :
デフォルトの名無しさん :2009/12/11(金) 12:04:28
>>125-126 RailsのActionPackのActionViewっぽいね。これだけ使えないのかな
RailsはRailsで
>>130 require 'active_support'
require 'action_view/helpers/date_helper'
include ActionView::Helpers::DateHelper
あー、あとI18n関係の設定がいるかな。以外と面倒かも。
そもそも単独で使うようにできてないからな たった一つの処理のために本質でないファイルをウンコのごとく読まなきゃならんし割に合わん
>>133 「ウンコのごとく読む」っていう比喩がわかんない。
どんな風に読むことを「ウンコのごとく」って言うの?
>>129 Railsだと分かっていたら答えられたとでもいうのかよwwww
たぶんYESなんじゃないかな
,―ヽ____、― ,/ ノ ヽ ~\ / ノ Ruby ヽ ~\ / ノ ヽ、 `ヽ | ノ / ̄\ / ̄~ヽ ヽ i | ノ | ノ \ | <●> <●> ( ) \ | | | i / | / ヽ レ i (●_●) / i、 ,-――-、 ・ / i、 <(EEEEE)> ∵/ 楽しいプログラミング言語はIPA Rubyだけ i、 \___/ _/ \ ,ノ ,,.....イ.ヽヽ、ー-―一ノ゙-、. : | '; \_____ ノ.| ヽ i | \/゙(__)\,| i | > ヽ. ハ | ||
モジュールの定義の有無を確認する方法ってありますか? method_defined?のモジュール版みたいなのを探しているのですが・・・
>>138 require 'net/http'
Object.const_defined?(:Net) #=> true
Net.const_defined?(:HTTP) #=> true
メソッド中で変数を書き換えられる場合と書き換えられない場合の区別がいまだに分からないのですが、 X=[1,2,3] def f X[1]=4 end 大文字(const配列?)のくせにこれは書き換え成功する。 x = 1 def g x=2 end これはスコープ内で局所変数と解釈されて、書き換えられない。 Y=1 def h Y=2 end これは定数書き換えが不正と解釈されて通らない。 h()は仕方ないとしても、g()と同じ動作は欲しいので、どう実現すればいいか教えてください。 ポインタっぽいのがあると一番いいのですが・・・。
>>140 >X=[1,2,3]
>def f X[1]=4 end
>大文字(const配列?)のくせにこれは書き換え成功する。
前後にX.object_idを表示してみると、「同じオブジェクト」を
指したままであることが確認できるはず。
配列のような内部に状態を持つオブジェクトの状態を変更することは
定数という観点でいうと「書き換え」ではない。
>x = 1
>def g x=2 end
>これはスコープ内で局所変数と解釈されて、書き換えられない。
>h()は仕方ないとしても、g()と同じ動作は欲しいので、どう実現すればいいか教えてください。
>ポインタっぽいのがあると一番いいのですが・・・。
オブジェクトと変数の区別を理解してから出直しておいで。
返信ありがとうございます。 オブジェクトと変数の区別があるのは分かりますが、 X = Integer(1) と Y = [1,2,3] はどちらも 定数=「オブジェクトのインスタンス」 に見えるのですが。
irb(main):001:0> CONS = [0, 1, 2] => [0, 1, 2] irb(main):002:0> CONS = ["A", "B", "C"] (irb):2: warning: already initialized constant CONS => ["A", "B", "C"]
定数は参照の付け替えが出来ないだけで 参照先のオブジェクトが内部状態を変えることには関知しない
では class Integer def f self = 8 end end X = Integer(3) X.f() p X みたいな感じで内部状態を変えることは原理的には可能でしょうか?
>>145 オブジェクトと変数の区別を理解してから出直しておいで。
いや、もちろん @なんとか=8 でしょうけど。
オブジェクトと変数の区別を理解したいので 質問を続けます。
149 :
デフォルトの名無しさん :2009/12/13(日) 00:29:25
>>145 Integerのような組み込みのクラスだとそれできないから、i++とかインクリメンタル演算子が実装できないんだよね・・・
>>149 selfを変更できるクラスはRubyにはないぞ
データ格納領域がRuby的に保護されてて触れない
selfはたんに気分で書いてしまったので気にしないでください。 (私のミスです) 自分で定義したクラスなら class MyInt def initialize(i) @i=i end def ++() # 前置演算子の定義の仕方はしらないですが・・・ @i+=1 end end でいいわけですよね。
もとのxの件はオブジェクトと変数の違いではなく ローカル変数のスコープの問題だねえ。
>>152 そうですね。本当はそれが知りたかったわけですが・・・。
グローバル変数にすればいいんだけど、なんか気持ち悪い。
なんか引数で参照渡して、それを書き換えればいいんだよ〜 みたいなのはないんでしょうか? ・・・たぶんないんでしょうね
引数で渡していいならArrayみたいな内部状態を持つオブジェクトに包んで 渡すくらいかね。
初心者なんで間違っているかもだけど、参照渡しだから引数に渡された オブジェクト自体を書き換えることはできるよね? def method(str) {str.gsub! /a/, '!'} x = "katakana" puts x #=> "katakana" method x puts x #=> "k!t!k!n!"
やっぱそれですか。 議論によって問題の所在がはっきりしてきました。 おつきあいありがとうございます。
>>156 それはたぶん文字の配列わたしてるですね。
えっ?
そうだ、eval使おうか(笑)!
161 :
156 :2009/12/13(日) 00:54:39
>>158 Ruby のStringオブジェクトの内部ってArrayで表現されていたんですか?
知りませんでした。><
C言語みたいですね。
158ですが、私も初心者なので、フォローお願いします。 普通の言語なら文字列の扱いはそうなってるんじゃないかなぁ?
何の意味があるか分からない思いつきだけど通りました。 X='12' def f X.gsub!('12','2') end f() p eval(X)
>>162 文字列がイミュータブル(変更不可)な言語は普通にあるよ
Pythonなんかもそう
>>> s = 'abc'
>>> s[0] = 'A'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
上のごちゃっとしたところをまとめると
* 変数はオブジェクトに付けられた矢印(あるいはラベル)。例: a = [1,2,3]
* 変数を通じてオブジェクトを操作することが出来る。例: a[0], a[1]
* Rubyの文字列はミュータブル(変更可能)なので
変数が指すオブジェクトの中身を書き換えることができる。例: a[1] = 20 # [1,20,3]
165 :
156 :2009/12/13(日) 01:24:26
>>162 自分なりに調べてみました。
def method(obj)
obj.object_id
end
str = "katakana"
p str.object_id #=> 69877275538400
p method str #=> 69877275538400
この結果から分かりますが、上記の変数 str と obj は同一のオブジェクトを指しています。
したがって、変数 obj に対して破壊的なメソッド(オブジェクト自体を変更するメソッド)を使うと
str が指しているオブジェクトも同一ですから、objに対して行った操作が反映されている、というわけですね。
あってますか?
あと、Stringオブジェクトの内部表現については詳しくしりません。
Rubyのソースを読んでみればわかると思うのですが、まだそこまでのレベルではないので...
スレ汚し失礼しましたです。
166 :
164 :2009/12/13(日) 01:27:10
例が文字列じゃなく配列になってた。それぞれ以下に読み替えて
例: s = '123' # sは文字列 '123' を指す
例: s[0], s[1] # sの一文字(バイト)目と二文字目を取得
例: s[1] = '5' # sの一文字目を '5' に変更
>>165 あってるお
内部表現なんて実装次第なんだから
出来ることを正確に把握するほうが大切
カビの生えた例だけどこんなのも貼っとく a = [0, 1, 2] b = a b[1] = 10 これでaが何になるのかわからなかった人は横着しないで入門書嫁
168 :
140 :2009/12/13(日) 08:24:28
昨日の者ですが、 結局クラスでラップする感じになるのかなぁ。 下は意図した通りに動きます。 def State(val) Monad.new(val) end class Monad def initialize(val) @val=val end attr_accessor :val end def f(st) st.val += 1 end X = State 1 f(X) p X.val
169 :
140 :2009/12/13(日) 08:30:00
なるほどRubyって関数型言語だったのか!
Dir.globが探索するファイル/ディレクトリの条件って何ですか? i=0 Dir.chdir("C:\\"){Dir.glob('**/*'){i+=1}} p i =>150660 dir c:\ /s /b /a|find /c /v "" =>154483 C:\の全ファイルを選択→プロパティのファイル数+フォルダ数 =>153390 1〜2違うどころではないんだが・・・('A`)
>>170 DOSのコマンドを知らないから憶測だけど、
"."と".."を含めてる含めてないとか?
172 :
デフォルトの名無しさん :2009/12/13(日) 09:40:23
173 :
デフォルトの名無しさん :2009/12/13(日) 11:00:49
るびまのページいま停止中?
Ω ∅
p "あ" とすると、 "\202\240" 8進数で返ってくるのでわかりにくいです。 16進数で帰ってきて欲しいのですが、どうすればいいのでしょうか?
String#inspect の定義を変更すれば良い。 class String; def inspect; "\""+ self.each_byte.map{|c| "\\x%02x" % c }.join + "\""; end; end
0x20...0x80はそのままにした方が目に優しそうだ あと?\と?"は別扱いでとか考え出したら面倒くせええ
>>176 それ、他のオブジェクトをinspectするときに影響が出ちゃわない?
8進表記されてるのだけ、16進に直すのはどう? class String alias _inspect inspect def inspect self._inspect.gsub(/\\(\d+)/){ "\\x{%02x}" % $1.oct } end end
文字列を16進表記にする関数的メソッドを定義するべきだと思うなあ
直前の式の返り血が入ってる組み込み変数とかってないですか? Rubyを関数電卓代わりに使いたいんですけど
>>181 irb
irb> 1+2
3
irb> _ +4
7
まあ返り値ならなんでもいいんだけど
irb> Time.now
Sun Dec 13 13:40:19 +0900 2009
irb> _.year
2009
ありがとうございます できればirbじゃなくても使いたいんですが無いですか
関数の戻り値は最後の参照みてるんだし @かなにかに保持してくれるといいと祈り続けて早10年
>>179 俺もそれ考えたけど"\\1000"とかで困る
>>180 こうするのが一般的?
p "あ".unpack("H*")
PHPのcall_user_funcにあたる機能はRubyでも実現できますか? 実行時に呼び出すメソッドを切り替えたいのです。
異なる文字コードの文字列を同時に出力するとかじゃない限り 適切に漢字コードを指定しておけばちゃんと日本語表示されるんじゃないの? $KCODE = 'S' p "あ" > "あ" 文字じゃないバイナリ列とか表示させるときに16進文字列がいいのなら そういう出力メソッドを作るなりすれば
1.9 なら encoding を文字列が持ってるからできるが、1.8 なら無理だね。 あと $KCODE は 1.9 じゃ廃止だ
module Hoge def f1 end def f2 end ・・・ってかんじでメソッドがたくさんあったときに module_function :f1,:f2,... って全部書くしか、外からアクセスする方法はないでしょうか? end
include Hoge で f1 や f2 を取り込めるよ
名前空間は汚染したくないので Hoge::f1 というアクセスだけ許したいのですが・・・ いちいち書くのは保守が面倒だと思ったので。 いま考えてるのは module_function self.methods.join(' ') #未完成 みたいな怪しい方法です。
module M def m1; "m1"; end extend M end M.m1 #=> "m1"
どんぴしゃです! ありがとうございます。
メイン関数は書いた方が良いのでしょうか?
>>198 リファレンスより
If used with no arguments,
subsequently defined methods become module functions.
モジュール定義の頭に module_function と引数なしで書いておけば
以後に定義するメソッドにはすべて module_function が適用される。
public, private とかと同じだよ。
>>199 メイン関数って
スクリプトを実行した時に処理系が最初に呼び出すメソッド、という意味?
そういう意味なら、書けない、でFA
そんな取り決めないし
>>199 def main() しとけばRubyがエントリポイントとして呼んでくれる、とかいうことはないよ
ただ if __FILE__ == $0 ... って常套句を使って少し似たようなことはできる
俺最初なんとなくmainてメソッド書いて if __FILE__ == $0 main end って書いてたな
206 :
デフォルトの名無しさん :2009/12/14(月) 11:43:32
>>199 いろんなソース読んだ限り、
Rubyではこんな感じで書いている人が多い。俺も習ってる
class Application
def initialize
end
def run
# ここにメイン処理
end
end
if __FILE__ == $0
Application.new.run
end
待て、$0って廃止予定じゃなかったか
心配なら$PROGRAM_NAMEを使っておけ。
あと10年は1.8使い続けるから無問題
まあ、$0 が動かなくなる頃にはそのスクリプト本体もどっか手入れしないと動作しないとは思う そのときにその人に直してもらうことにして $0 は使ってもよし $PROGRAM_NAME はバージョンによらず使えるんだっけ?
質問が有ります。 引数があれば引数で指定したファイルに 引数がなければ標準出力(もしくはエラー出力)に文字列を出したい場合はどのように書いたものでしょうか?
そのまんま if とかで書けばいいと思うよ!
if (ARGV[0]) $stdout = File.open ARGV[0] end こんな感じニカ ?
こんな感じか if ARGV.length > 0 f = open(ARGV[0], "w") else f = $stdout end f.write "hello"
>>211 def output
if filename = ARGV[0]
File.open(filename, "w"){|f| yield f }
else
yield $stdout
end
end
output{|io| io.write "a"}
closeめんどくせえ
> closeめんどくせえ うむ $stdout.close がIOError で拒否られたときは軽く眩暈がした
>>211 個々のプログラムでそういうことをするより
シェルのリダイレクトやパイプを使いなさいと言いたいのだが
出力先をプログラムの引数として受け取らなければならない理由はなんだろう?
STDOUT にログ出力をするタイプのプログラムはたいてい引数指定 たとえば wget
219 :
211 :2009/12/14(月) 19:36:53
>>212-215 ありがとうございます、ありがとうございます
いろいろ方法ありますね。
>>217 事の発端は、最初は標準出力に出してリダイレクト(?でしたっけ)でファイルに書いていたのですが、
ファイルには出したくないBenchmarkとかで計測した結果も表示したくなってそうすると、
どうしたものかって感じになりました。
こういう時って計測結果などはエラーに出せばいいもんですかね?エラーに出していいものかどうか。
>>218 wgetは引数でファイル指定でしたっけ
wget -O
質問です。 時間の計算するにはどのクラスを使えばいいでしょうか? 具体的には時間の差分を加算したりしたいのです。 例えば、 elapsed_time += Time.local(2008,12,14,1,50,10) - Time.local(2008,12,10,1,50,10) のような感じ(実際にはTime.localの中身は可変) elapsed_timeをTimeにする場合だと初期化にTime.at(0)しても Thu Jan 01 09:00:00 0900 1970 になったり、 0からの時間を考えられていないようなのです。
>>221 基本的には「ない」
61s が 1m1s になるような、秒数のみを表すクラスというようなのは標準では存在しない
225 :
221 :2009/12/14(月) 20:35:18
ありがとうです ないですかー。 何が困るかというと、加算した差分の時間を例えば書式で出力するときにstrftimeみたいなのを自前で書かないといけないってことですよね。 誰かそういうの作ってないか探してみたんですがどうも無いようで・・・。 active_supportとかの日付の拡張あたりでなんとかならないもんですかね。
time = 100000 sec = time % 60 min = (time / 60) % 60 hour = (time / (60 * 60)) % 24 day = time / (24 * 60 * 60) puts "%dday %d:%d:%d" % [day, hour, min, sec] こんなんでいいか?
227 :
221 :2009/12/14(月) 21:01:02
>>226 ずばりそのまま書いてくださってありがとうさんです。
使わせていだきます。
ActiveSupport使ってもこんな感じですか。かわらないやw
time = 100000
sec = time % 60
min = (time / 1.minute) % 60
hour = (time / 1.hour) % 24
day = time / 1.day
puts "%dday %d:%d:%d" % [day, hour, min, sec]
二年ほど前にdevでTimeSpanというクラスが提案されたことはあるみたいだねー。 立ち消えしてるのかな、これは。
.NETからそのままいろんなクラスパクってくりゃいいのに
やだあんな使いにくいAPI .NET好きな人はIronRuby使ったらいい
数値積分や微分できるようなライブラリとかってないですか? Rubyを関数電卓代わりに使いたいんですけど
パッチレベル上がったのにmingwでmake通らん
GSL(GNU Scientific Library)のRubyバインドがあるようだ。 詳しくは見ていないけど、数値積分や微分はあるみたい。 ただし、最後のリリースが約2年前というのが気掛かり。 十分枯れているのだろうけれど、新しめのRubyで動くかは不明。 ところで、本格的な数式処理なら、Maximaとか使ったほうがいいんじゃない?
かぶりんこ。
ありがとうございます 導入めんどくさそうですけど頑張ってみます
数値積分や微分できるような関数電卓を持っていたら、それを使う。 でなければ、カシオの計算センターとか。 自前のコードからコールしたいなら、ついでにそっちも自分で書いてしまう。 てのは、いかがでしょう。
いわゆる数値計算には向かないよね、Ruby
しかし、「5分で作って5秒で実行させる」ような、「計算機なんだから計算できてもいいんじゃね」という カジュアルなデータ計算をさせることが期待されるプログラミング言語のトップグループにいることは間違いない 専門数値計算ソフトやC(やJava)を持ち出さなくてもいい程度の計算なら、もっと気楽にできてもいい 高校や大学1年教養の宿題をうっかり解けてしまうような、そんな用途があってもいいはず
そういう用途ならあるげぶらーじゃね
Rでもいいしますまてぃか覚えるのでもいいしいっそExcelでも充分使える範囲である可能性も高いな
カタカナでおk
アールやエクセルってなんか変だろ
245 :
221 :2009/12/15(火) 15:52:28
>>238 ああ、その手もありました!その名のとおりログのこりますしLoggerいいですねw
数値計算したいんなら構文的にPython+numpyのほうがいいよ。Rubyには不向き。
>>221 ワンライナーで時間の計算をする時に24時間以内なら
ruby -rtime -e "a=Time.parse('09:08:20')-Time.parse('01:40:02');puts Time.at(a).utc.strftime('%H:%M:%S')"
とかしたりしますな
ていうか、やろうと思えば結構できるんだよ でも自己責任の域を出れない
name=gets puts "私は#{name}です" nameに日本語を入力するとエラーが出てしまいます C:/My Documents/g/Ruby/test.rb:4:in `<main>': incompatible character encodings: ASCII-8BIT and Windows-31J (Encoding::CompatibilityError) これはどういったエラーなんでしょうか?
>>249 初心者は Ruby1.9 使うなってこれだけ言われてるのになんでわからんのだエラー
それってスクリプトつーか内部文字列がWindows-31Jで標準入力がASCII-8BITってこと? Windows-31Jがロードできたら標準入力もそっち使うようになってなかったっけ どういうときにそんなことになりえるのか知りたい、誰か教えて
スレタイに【1.9】 【使うな】っていれとけよ
【Windows】【使うな】とか
順番からいって標準入力がWindows-31Jか、なんでスクリプトがASCII-8BITになったんだろう?
とりあえず
>>249 は1.9使い続ける気ならマジックコメントを使えるようになるべき
MCって一番やっちゃいけないタイプの変更だよな
>>255 じゃあファイルごとに違う文字エンコーディングをインタプリタに知らせる方法を考えてくれ
いいこと考えた、ファイルは全部ASCII-8BIT相当にするってのはどう
これでますますPythonへの移行が加速しちゃうな。 マイナー環境に媚びすぎるあまり全員が等しくLoseしちゃうなんてあまりにも悲しい。
やっぱ今からでもせめてデフォルトUTF-8に
UTF-8-MACはUTF-8じゃありませんっていうか今すぐ滅びてくださいお願いします
>>264 Pythonはもろそれにぶつかったな。よくそれではまったよ。
あのさ、require 'foo' したときの、foo.rb または foo.so の在処をしるにはどうしたらいいんだっけ。
よく聞かれる質問だと思うけど、だれか教えて。
1.8.6と1.8.7の違いってどこかにまとめられてますか?
>>265 前スレでみたのは
gem which foo
$" または $LOADED_FEATURES
>>267 それは求めるものじゃないなー
>>268 それはファイル名だけだよね。ディレクトリ名も含めたパスが欲しい。
それは提供されてない
>>265 結局こうしました
$ ruby -r nkf -e 'puts $:.map {|x| Dir.glob("#{x}/nkf*") }.flatten'
/usr/local/lib/ruby/1.8/i686-darwin10.0.0/nkf.bundle
>>272 Thanks.
わーおEnglishじゃん!開発者は日本人が多いのに、ぷんぷん!
>>272 ていうか、これ読んで分かるの開発陣だけだから。
Ruby利用者がよんでもわけわからん。
これを元にした噛み砕いたユーザー向け解説というのを誰か第三者が作ってきちんとフォローすべきなんだ でも、Ruby(特に日本の)ではそういうのが特にないんだよね 商売っけがないというか、目立ちたがり屋がいないというか ちなみにオフィシャルの仕事ではないのでこれ以上は望んじゃ駄目よ 取り巻きの役目
user visible feature changes と書いてあるんだが…
これとRubyリファレンスマニュアルを併用すればきっと・・!
Andrew Kuchlingは取り巻きどころかPythonの主要開発者だな Python3.0のWhat's newはGuido書き下ろしだし ドキュメントは取り巻きに任せろってのはガンかもしれないね でもこれ本スレでやったらいいよ 初心者にはいい迷惑だ
>>280 人材が究極的に少ないから
現状に加えて一般向けにドキュメント揃えろなんて言ったらどんどんリリースが遅くなる
当事者だからという理由だけでできない人に無理やりやらせる理由はない
得意な人に任せておけばいい
まあ初心者スレ向けでないのとドキュメント揃ってるほうだと言ってる人間が障害になってるのには同意
rubyの勉強をしろと言われ、perlのプログラムを渡された 雰囲気は似てるからrubyに書き換えて動作させてみろという perlもrubyもほとんど触ったことない俺にどうしろっていうんですか… 書き換え方にコツとかあるんでしょうか?元のperlプログラムにはサブルーチンにハッシュやら配列やらが結構混ざって泣きそう
>>283 とりあえず元のプログラムが何をするものなのか理解しないことには
始まらないと思われ
285 :
221 :2009/12/16(水) 11:02:32
>>247 ありがとう。24時間は超えてしまうのでTimeはやはり使わない方向でいきます
質問です。
Rubyで簡単なGUIアプリを作ろうとしているのですが、現在何がオススメでしょうか?
環境は、Ruby 1.8.7、Windowsです。
できれば、あくまでできればですが、実行環境では追加のリソース(ランタイム)が必要ないものがよいのですが…
例えばexeに固めれば単体で実行できる、もしくはRubyとそのライブラリがあれば動くと言ったようなものです。
下記サイトでは、shose(why氏とともにサイト死んでる?)、Ruby-GNOME2、wxRubyがよく使われているとありますが、
みなさんは何を使われてますか?
Ruby GUI調査2008
http://www.pressure.to/ruby_gui_survey/index-ja.html
>>286 > Rubyで簡単なGUIアプリを作ろうとしているのですが、現在何がオススメでしょうか?
RubyではGUIアプリケーションは作らない
Windowsで1.8でexe単体なら自分だったらvruby+Exerb+UPX でも上の縛りがなければwxRuby+Ocra あとやったことないけどWebアプリ+RubyStationも面白そう
289 :
286 :2009/12/16(水) 11:24:17
shoesはgithubにありましたけど、Javaのprocessingみたいな感じなんですね。ちょっと用途が違うとおもた
samples at master from shoes's shoes - GitHub
http://github.com/shoes/shoes/tree/master/samples/ >>287 (´;ω;`)ブワッ
昔Delphi使ってたんでそっちでもいいんですが、できれば最近なれたRubyでGUI作れたらなとか思うわけですよ…
>>288 必ずしもexe単体でなくてもいいです。
webアプリは面白そうなんですが、とりあえず、vrubyとwxRuby試してみます
たぶん、GUIというイベントドリブンな概念とRubyの記法が合わないんだと思う
イベントハンドラにprocオブジェクトを登録することがごく自然に出来るわけで。
実装の便利度に差がありすぎるんだよな 中にはHSPからシェル経由でスクリプト呼んで引数連携させたほうがマシといゲフンゲフン
>>293 一般に使ってもらうならともかく、自分の用が果たせたならそれでいいんじゃないか?
wxRubyをgemで入れてみたのですが、wxruby-2.0.1-x86-mswin32-60がインストールされたのですが、 これて古くないんでしょうか?wxWidgetの0.6.0だったりしませんか? ruby -v #=> ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32] 古いな…
純粋にrubyのレベルをあげたいです 小さなツールとWebアプリケーションとGUIゲームくらいならrubyで作れるようになったんですが ルビリストと呼ばれるようになる為の次のステップ教えてください
いろいろな言語を使う。 とくにRubyのバックグラウンドを育んだLispやSmalltalkを。
Lispやれ(EmacsLisp以外ならなんでもいい) PerlがまだならPerlも齧れ オブジェクト指向の関係でJavaもできるといいんだが
>>296 もの凄い勢いでRuby初心者スレ/本スレ/ruby-list等
あらゆるサイトの質問にコテハンで答えまくる
質の高い回答が数千溜まるとGoogleに雇ってもらえる
ルビリストってなんですか?
googleって実際優秀な人材だけってわけじゃないんだよねぇ 広告塔の人間もたくさんいるし
>>282 >人材が究極的に少ないから
>現状に加えて一般向けにドキュメント揃えろなんて言ったらどんどんリリースが遅くなる
>当事者だからという理由だけでできない人に無理やりやらせる理由はない
>得意な人に任せておけばいい
ばかをいえ、ChangeLogやNEW FEATURESなんて、開発当事者ぐらいしか詳しくは知らないんだから
開発当事者が書くべきだろ。
こんなことすらも嫌がる開発陣ってなんなの?
どうせ開発リソースが増えたところで、ドキュメントに回すつもりないんだろ。
304 :
283 :2009/12/16(水) 19:00:12
昼間は無事だったのに規制が…
283です。
>>284 jcorrectとかいうやつだったかな
プログラムを実行して文章を入力すると、cabochaの解析結果と一緒に文章の校正を促すメッセージが出た
これを実行するためにcabochaとかいろいろ入れてた
プログラムを読んでいると、サブルーチンから値を順に渡していたり$foo->{$var}->とか見たことないのがいっぱいでなんかもうキーーーーってなったんだ…
>>303 言ってること自体には賛同できるけどそういうのは本スレでどうぞ
質問です。 実行環境:Xubuntu9.10、Ruby1.9.1 使用ライブラリ:tk、pty、expect やりたいことは、外部プログラム(対話型のCUIプログラム)をRubyスクリプト内から実行する際に、 外部プログラムの実行結果(標準出力。エラーが発生して終了したならその時のエラー出力) を取得したいのですが、何か方法はあるでしょうか。 ネットを見るとsshやtelnetのサンプルが転がってますが、 sshやtelnetが出力するメッセージ自体やエラー文(はあるのかな?)を処理するようなものがなく、 どうするんだーと悩んでます。
シェルからパイプでつなぐ ` ... ` (バッククォート)でコマンド実行して出力取る 手の込んだことがしたければ require 'open3'
>>307 ありがとうございます。
標準出力と標準エラー出力に違いがあるのを知らなかったですorz
open3は標準入力・出力・エラー出力のみ対応という形だったので、
except実行→出力結果を一時ファイルに出力→実行元プログラムでopen
という形で無事結果を得られるようになりました。
PTYがttyを別個に作ってそっちで実行させるっぽいのでバッククォート使えない(のかなぁ……)
310 :
245 :2009/12/17(木) 11:43:14
logger使ってみているのですが、 Benchmarkの出力結果が余計な改行が入るのですが、これってこんなもん? time = Benchmark.measure do :(略) end logger.debug Benchmark::CAPTION logger.debug time.to_s
そんなの logger は与り知らんよ logger は対象のオブジェクトを to_s しての末尾に改行つけて書き出してるに過ぎない 何か問題あるならそのオブジェクトの to_s 調べれ
312 :
245 :2009/12/17(木) 13:01:09
>>311 舌足らずでごめんなさい。
puts Benchmark::CAPTION
puts time.to_s
だと改行の問題ないんです。気味が悪いんですが、何でなんでしょ
>>312 改行が問題になるときの検証に puts 使ったら駄目
puts は文字列末尾に改行があったら自前で改行をつけない
というかこれはそのまんまで
irb> require 'benchmark'
irb> p Benchmark::CAPTION
" user system total real\n"
そもそも改行が末尾に入ってる
気になるなら Benchmark::CAPTION.chomp を logger に渡す
> puts は文字列末尾に改行があったら自前で改行をつけない 漏れは大変なことを知ってしまった 近いうちに消されるかもしれない
316 :
sage :2009/12/17(木) 21:38:37
>>228 trunk には Date::Delta ってのが入ってるよ
RSpecの用語について質問。 describe ... や it .... で書いたひとまとまりを、なんて呼ぶの? たとえば Test::Unit なら class FooTestCase < Test::Unit::TestCase ← これはテストクラス def test_equal ← これはテストケース assert_equal(2, 1+1) end end のような呼び方をしてると思うんですけど、RSpecの場合は何と呼ぶのかわからないので、教えてください。
現在β版のRSpec本によれば、 We use the describe( ) method to define an example group. The it( ) method defines a code example. なお、 describe(および別名のcontext)メソッドが作るのは Spec::Example::ExampleGroupのサブクラス it(および別名のexample)メソッドが作るのは それのインスタンスメソッド になる
質問です。 001 002 のような、3桁の連番を表示したいんですが、どうやればいいんですか。 for i in 001..100 だと 1 2 になるんですが。
Rubyらしい書き方ではないかもだが for i in 1..100 p '%03d' % i end 数字の頭に0がつくとRubyでは8進数って意味になるので注意
321 :
デフォルトの名無しさん :2009/12/18(金) 06:23:07
('001'..'100').each{|s| puts s}
>>320 見事にできました。
素早い回答どうもありがとうございました。
WEBrickで、 ・Basic認証またはDigest認証 ・IPアドレスによるアクセス制限 を実現したいのですが、サンプルとか参考になるページがあれば教えてください。 「WEBrick IPアドレス 制限」とかでぐぐったけど、それらしいのはヒットしませんでした。
追記。 ちなみに、今使っているサンプルはこんなのです。 require 'webrick' server = WEBrick::HTTPServer.new({ :DocumentRoot => '.', #:BindAddress => '127.0.0.1', :Port => 3000, }) Signal.trap('INT') { server.shutdown } Signal.trap('TERM'){ server.shutdown } server.start
認証 WEBrick::HTTPAuth::BasicAuth WEBrick::HTTPAuth::DigestAuth IPアドレスでの制御は HTTPRequest#addr あたりを見て403を返せばいいんじゃない?
{1=>[2]}となる事を期待したけど、この方法では駄目みたいですね。 % irb1.9.1 irb(main):001:0> h=Hash.new([]) => {} irb(main):002:0> h => {} irb(main):003:0> h[1] => [] irb(main):004:0> h[3] => [] irb(main):005:0> h[1] << 2 => [2] irb(main):006:0> h => {} irb(main):007:0> h[1] => [2] irb(main):008:0> h[3] => [2]
>>326 そりゃArrayやHashの初期値つきnewは毎回初期値のオブジェクトを生成するからな
irb> p h[2].object_id == h[2].object_id
false
irb> h=Hash.new([])
{}
irb> h[1]=[2]
[2]
irb> h
{1=>[2]}
>>328 > p h[2].object_id == h[2].object_id
これうち(1.8.7cygwin)でやるとtrueになるんだが1.9で変わったとか?
>>326 それだとh[1]の参照先(初期値オブジェクト[])に2を入れてることにしかならない
h[1] = ほげほげ
としない限り
{1=>ほげほげ}にはならない
$ rvm use system <i> Now using system ruby. </i> $ irb --prompt simple >> RUBY_DESCRIPTION => "ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]" >> h = Hash.new([]) => {} >> [h.default, h[0], h[1]].map(&:object_id) => [2156963800, 2156963800, 2156963800] $ rvm use 1.9.1-head <i> Now using ruby 1.9.1 head </i> $ irb --prompt simple >> RUBY_DESCRIPTION => "ruby 1.9.2dev (2009-12-11 trunk 26067) [x86_64-darwin10.2.0]" ruby-1.9.1-head > h = Hash.new([]) => {} >> [h.default, h[0], h[1]].map(&:object_id) => [2151892720, 2151892720, 2151892720]
>>331 みたいな人ってソース中のコメントもほぼかかなそうだよな
まあ初心者スレだしな
new(初期値)で生成されたハッシュに存在しないキーでアクセスした場合の挙動は、 同じオブジェクトが返るというのが正しく、 毎回異なるオブジェクトが返るというのは誤り。
質問するならリファレンスマニュアルくらい読んでからこい
初心者スレ的には 「マニュアルのここ読めわかりやすくて疑問の余地無し氏ね」 と言える環境を揃えるほうが先な気もする
>>328 それは初期値じゃなくて初期ブロックじゃないのか?
h = Hash.new{|hash,key| [] }
p h[2].object_id == h[2].object_id # => false
未設定のキーを指定された時に、そのつどブロックを実行した結果を返す
よって同じキーでも毎回違うArrayが帰ってくる
>>338 ようやくたどり着いたと思ったら、
xxxx()
執筆者を募集中
おい、コードを書いたのはどこに行ったの?
採用した人は?
なので、動かないものは、自分で書き直すことにしてる。
一から一人でするより、ちょっと近道。
>>337 >質問するならリファレンスマニュアルくらい読んでからこい
おまえは書き込むまえに
>>1 を読んでこい
そんなことより俺のIDを見てくれ。どう思う?
見えない
まあバカスレだしな
教えてください Hpricotで日本語テキストのリンク検索が上手く動きません どうすればNokogiriと同じ動きになるのでしょうか #!ruby -Ku require 'hpricot' require 'nokogiri' html = "<html><a>りんく1</a><a>りんく2</a><a>りんく3</a></html>" doc = Hpricot(html) print doc.at("a[text()*='りんく2']"); # エラー発生 doc = Nokogiri(html) print doc.at("a[text()*='りんく2']"); # こちらは正しく動く エラー内容 /usr/local/lib/ruby/gems/1.9.1/gems/hpricot-0.8.2/lib/hpricot/elements.rb:486:in `index': incompatible character encodings: ASCII-8BIT and UTF-8 (Encoding::CompatibilityError)
>>347 初心者は Ruby1.9 使うなってこれだけ言われてるのになんでわからんのだエラー
>>348 が FA なのだが
というか何もわからず動かしていることが原因で、
Nokogiri が動いたのはただの偶然に過ぎない
むしろ「Nokogiri が動いたのは何故ですか」という質問になるべき事象
無理しないで Ruby 1.8.7 使え
1.8.7 を理解したあとで差分学習で 1.9.1 を習得するのが一番早い
了承、1.8.7にする
hpricotはコンパイルが通る程度に1.9対応されてるだけ。 作者の _why the lucky stiff はネット上から失踪しているので、事実上塩漬け状態。
352 :
デフォルトの名無しさん :2009/12/20(日) 16:02:52
質問 rdoc が生成する HTML について、特定の要素(例えば <pre>タグ)のスタイルだけ いじりたいという場合はどうしたらいいのでしょうか?
>>352 ちょっと見た感じでは rdoc に --template オプションで
自作のテンプレートを指定してやればいいんじゃまいか
既存のテンプレが rdoc/genarators/template/html に入ってるから
それを部分的に書き換えて使えばよさそう
whyさん死んじゃったからNokogiri推奨だと思うけど、
>>347 がhpricot使いたいと思った理由はなんだろ
え、whyって死んじゃったの? もしそうならHpricotきめえとかdisるのやめて冥福を祈る
356 :
352 :2009/12/20(日) 19:31:28
>>353 ありがとうございます。
ベースになるテンプレートを選んで、それに改変を加えたものを使おうと思います。
ネットワーク的に、ね。 自分できれいさっぱり痕跡を消していった。
358 :
352 :2009/12/21(月) 15:57:51
追記 rdoc の --style オプションにスタイルシートのパスを渡すことで HTML生成時に自前のスタイルシートを読み込ませることができました。 テンプレから CSS の部分だけ切り出して編集して、 rdoc --style=path_to/hoge.css でうまくいきました。 というか、manページに普通に書いてあったorz
hpricot でも nokogiri でもいいんですが、 doc = Hpricot(open(uri).read) (doc/:a).each do | link | if link[:href] == '#' p "設定し忘れ => #{link[:lineno]}" end end みたいに、行番号を取得することって出来ませんか?
行番号というメタ情報があれば取得できるよ ないならできない 自分で行番号だと思うものを作って数えるしかない
>>359 その程度なら普通に正規表現でよさそうだね。
File.open(filename) do |f|
i = 0
f.each_line do |line|
i += 1
puts "#{filename}:#{i}: 設定し忘れ" if /href=("¥#"|'¥#¥')/
end
end
jrubyでmechanize使えている人います?hpricotのjava版使うしかないんでしょうか?
>>361 欲しいのは行番号であって、例文なんかどうでもいいんだが
例題コードを添削するのはどうかとw
作業ディレクトリの変更って出来ませんか? ./data/a.rb ./data/1.txt ./main.rb ってあったときに main.rbからa.rbをrequireするんですけど a.rbは open("1.txt","r") これで読めるようにしたいです
save = Dir.pwd Dir.chdir "./data" # 作業 Dir.chdir save とかかな 同じディレクトリにあるファイルを使うってことなら open(File.dirname(__FILE__)+"/1.txt") でもいいかも
Pythonのdirみたいに、あるオブジェクトが持ってるメソッドと変数を一覧するものってありますか?
>>367 それでいけそうです
ありがとうございます
puts Object.methods ソートするとなおみやすい puts Object.methods.sort
Object#methods Object#instance_variables
>>359 Nokogiriの要素は #line メソッドがあるはず。
>>367 Dir.chdir "./data" do
# 作業
end
でもいけるよ。
>>374 おお知らなかった
もっかいリファレンス見直すことにしよう
ねー、 hoge/lib/ ← 自作ライブラリの rb ファイル hoge/test/ ← lib のファイルに対応するテストスクリプト という一般的なディレクトリ構成で test/test_hoge.rb を実行する場合、どうするのが「ふつう」なんだ? :~/hoge$ ruby test/test_hoge.rb :~/hoge/test$ ruby test_hoge.rb :~/hoge$ testrb test/test_hoge.rb :~/hoge/test$ testrb test_hoge.rb
コマンド直叩きするときは ruby -Ilib test/test_xxx.rb とする気がするが、 普段はrakeのTestTask任せだから、どうやってるか意識してないわ。 TestTaskの中をみてみたけど、testrbを使うことも使わないことも可能みたい。 (デフォルトはrakeのライブラリ内の機能を使う) なお、rakeの場合、test/ の中で起動しても、ディレクトリを遡ってRakefileを 探して、見つかったディレクトリで動くので、hoge/Rakefileとして置いている 場合は、実質的には hoge直下でやってることになるはず。
ruby test/test_hoge.rb とかやりたいなあ テストするためだけに test/ に降りてしまうのは、どうも…
そのへんは、helper.rb をどうやって読むかの一点にかかってる気がしてならない
ファイルいっこテストするだけなのにrakeはないわー
rake test TEST=test/test_hoge.rb でファイル一個か。
テスト実行するのにコマンド売ってるのかよ。 autotestでファイル保存と同時に自動でテスト実行だろJK
383 :
362 :2009/12/23(水) 13:40:52
JRuby 1.4でNokogiri対応になったみたいですね。失礼しました。
>>382 テストが通らないタイミングでファイルを保存したりしないの?
というか編集途中で保存し辛くなりじゃん
なるじゃん
ファイルいっこのテスト方法がないわけじゃなかろう autotestを使うかどうかとはまた別の議論だと思う
>>382 コードを保存したいタイミングと、テストを走らせたいタイミングは別じゃね?
エディタからテストを実行させられればそれでいいけどなあ。
わざわざ保存したときに勝手にテストが走ってほしくないよ。
かりに毎回毎回コマンドラインからテストするとしても シェルの履歴ぐらい使うだろう。
秀丸とかサクラエディタとか外部コマンドを 実行できるテキストエディタを使うがよろし。 俺はVim使ってるけど。
俺はタブ機能付きの端末エミュレータ使って 右端のタブをテスト用に使ってる タブ切り替えにキーを割り当ててやるとかなり快適だ 同じ用途で GNU Screen とか使ってる人もいるのでは?
auto-save-buffersつかってるとautotestは使えない
>>387 そうかー、その品は人それぞれだな。
autotest連携で結果をSnarl(今ならGrawlか?)で通知出したり、サウンド出したりしてるけど
けっこう快適よ?
ただ、coLinuxで動かすとその辺の連携がしにくくて困る
さらに、AutoHotKeyで保存キー入力と同時にブラウザリロードとかもやってる。
自動保存+すきあらば無意識で手動保存してるから、 保存とか意識したことがないなー。
warning: Insecure world writable dir /home in PATH, mode 040777 という警告がでて困ってます。 この警告だけを出さないようにする方法があれば教えてください。 home のパーミッションが 777 なのがおかしい!といわれればそうなんですけど、 下請けにはそんなことすら変更する権限がないんです。
>>394 知らんよ
RailsはRailsスレで
>>394 環境を詳しく
もしRailsなら権限くれっていえ。まともに開発できんから
>>394 ENV['PATH']から /home を抜け。
ENV['PATH']つーか、rubyを実行する前だからシェルの環境変数PATHね。
>>395 なぜRails?
>>396 環境はlinux 2.6.9-89.EL, ruby 1.8.7-p174です
>>397 $PATHには/homeがないけど、/home/username/binがあります。
これを除くことはできないので、どうしたもんか困ってます。
フルパスで実行するようにすれば除けるんじゃないの?
あくまでrubyに伝わるPATHだけ変わればいいので、 * コマンドの環境だけ変える。 PATH=/usr/bin:/bin(などなど) ruby 引数 とか * 一度変えて戻す OLD_PATH=$PATH PATH=/usr/bin:/bin(などなど) ruby 引数 PATH=$OLD_PATH とか * サブシェル内で変える ( PATH=.... ruby ) とかでもいい。
RubyGemsで依存関係を調べる方法ないですか? gem dependency を使ってみているんですがうまくいきません。 $ gem dependency mechanize -v "0.9.3" --remote Gem mechanize-0.9.3 nokogiri (>= 1.2.1, runtime) hoe (>= 1.12.2, development) $ gem dependency mechanize -v "0.9.0" --remote No gems found matching mechanize (= 0.9.0) $ gem dependency mechanize -v "<0.9.0" --remote Gem mechanized_session-0.0.2 mechanize (>= 0.9.3, runtime) hoe (>= 2.3.3, development) 何がやりたいかというとmechanizeでnokogiri非依存のバージョンを探したいのです。
>>402 WWW::Mechanize.html_parser = Hpricot
>>402 libxml2 に依存したくないというのなら
>>403 Nokogiri のインストール自体を dependency 経由で行って欲しくないというのなら、Mechanize 0.8.4 かそれ以前が必要
405 :
402 :2009/12/24(木) 17:13:20
即レスありがとうございます。
>>403 あー、いや、Bundlerで利用しようとしておりまして、
実行環境ではNokogiriが動かないため依存段階そのものから外したいのです。
# 実際はappengine-jrubyでmechanizeを使いたいという難儀なアレなのです
# jruby版Nokogiriはffi依存のせいでappengineでは動かんのですわ・・・
appengine-jruby - Project Hosting on Google Code
http://code.google.com/p/appengine-jruby/ >>404 ありがたい
0.8.4ですね、試してみます。
後学のために聞きたいのですが、こういうのってどうやって調べられるもんなんでしょうか?
以前はgemコマンドでgemのパッケージ時の設定を見る方法があったような気がしたのですが、どこいったんでしょう?
406 :
402 :2009/12/24(木) 17:16:34
>>405 の前半の説明が足りないので補足。
mechanize 0.9.3では
>>403 したいところなんですが、
require 'mechanize'
するだけでffiねーぞゴラァ(appengine版のjrubyでは含まれてないためらしいです。pure java版Nokogiriが望まれます)
のエラーがでてしまうのです。
>>405 何もしてない
賞味3分の力技
add_dependency から Nokogiri が消えるまで mechanize.gemspec の github 履歴を直接調べて遡った
408 :
デフォルトの名無しさん :2009/12/24(木) 18:55:35
参考までに聞きたいのですが、 長くなり過ぎたメソッドチェーンの途中に改行を入れる場合、 皆さんはどこで改行するのが適切だと思いますか? 1) ピリオドの後に \ value = this.is.a.\ very.long.method.chain 2) ピリオドの前に \ value = this.is.a\ .very.long.method.chain 3) そもそも途中で改行しない value = this.is.a value = value.very.long.method.chain
>>408 長くなりすぎたと感じる時点で「よくないコードの匂い」なので、リファクタリング開始
>>408 メソッドチェーンでは改行は入れない
今更80文字制限などとは言わないが、メソッドチェーンで長い場合は途中変数で分ける
該当するとすれば3
411 :
408 :2009/12/24(木) 19:16:52
>>409 長くなり過ぎた場合という表現にちょっと語弊があったかも知れません。
実際にはメソッドのブロック付き呼び出しが2〜3続くような場合で
どうしても1行には収まらない場合、です。例をあげると
files = Dir.glob("**/*.rb").select {|file| ... }.reject {|file| ... }.map {|file| ... }
のようなパターンです。
412 :
402 :2009/12/24(木) 19:18:31
>>407 ΩΩΩな、なんだってー。恐れ入りました。そんな手がw
gem dependencyやgem specコマンドは--remoteのときには最新版からしかとれないんですね。
一旦gemをインスコしたらOK見られるようですが・・・
>>408 >>411 files = Dir.glob("**/*.rb").select {|file| ... }.
reject {|file| ... }.map {|file| ... }
って俺はやってるな
>>410 > メソッドチェーンでは改行は入れない
>>411 であげたようなパターンでもそうなのですか?
自分はああいうパターンだとピリオドの後で改行しちゃうのですが、
一般的には推奨されない(マナーの悪い)書き方なのでしょうか
415 :
408 :2009/12/24(木) 19:24:34
>>413 ピリオドの後は \ なくてもいいんですよね。
自分の場合意図的な改行であることを明示するために \ を付けてます。
というか、
>>411 の例は最後の map が意味的におかしいですね、しまったorz
files = Dir.glob("**/*.rb").select{|file| ... }.reject{|file| ... }.map{|file| ... }
ワンライナー書いてるならともかく、どっかで区切れよと なぜそんなにつなぎまくるのかと
>>417 自分の場合はつなぐというより、
つながっていくという感じでついつい長くなってしまうw
返値を無駄にしたくないというか
変数の名前を processed_values とかにした場合も名前に引きずられて
途中の状態を入れたくないという雑念が生じ、無理してでも一連のチェーンで書いちゃう
Ping打ちたいんだけどどう書くの?
俺もそれ出そうかと思ったけど、ICMP使わないんだよな
わかりやすくていいじゃん
files = Dir.glob("**/*.rb") files.reject! {|file| ... } files.map! {|file| ... }
実際には存在しないメソッドを使って質問したほうがいいな
別にいいんじゃない? 破壊的メソッドが使える状況なのに気づかなかった初心者がいてもおかしくないし 役に立たないならスルーすればいい 回答者にエスパーを要求するっていうのはそういうことだと思う
1.9 だと メソッドのピリオド前でも改行できるようになった 複数行のメソッドチェーンのピリオド位置をそろえられるらしい if とか class とか直後に識別子や式が必須のところは改行しても行が継続するとか そういう行継続のルールってマニュアルあるの?
従来のルール 「改行までの箇所を読んで完結していると見なされる(パースできる)ことがないなら改行OK」 に追加されたのは「メソッド呼び出しのピリオドの前もOK」だけのはず。
あれ、
>>428 のルールだけでは
class Hoge
で改行が許されるのは説明できないのか。
>>429 ん? 説明できてるように思うけど
class Hoge って end で閉じるまで完結しないでしょ
1.8.7p174 puts 1+ 2 これは3と出る。+がまだ完結していないから2までがまとまって解釈される。 puts(1+ +2) 同じく3。 puts 1 +2 これは1までで完結しているから1と出て、+2は単項演算して捨てられる。 puts(1 +2) これは unexpected tINTEGER, expecting ')' 次の行まで見て完結させてくれないのはどうして?
パーサをそんなにいじめるなよ
>>431 パーサには puts (1 2) と見えてる(+ は単項演算子と解釈されてる)
puts (1
+ 2)
だといけるかなと思ったが syntax error, unexpected '+', expecting ')' だった
ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]
> puts 1 > +2 > これは1までで完結しているから1と出て、+2は単項演算して捨てられる。 ↑ここまできたら > puts(1 > +2) これは駄目ってわかりそうなもんだろw
puts(1\ +2)
()の構文は(式)。 (1 と書くと1は完結した式と解釈され、次の行には残りの)しか書けない ってことでok?
ずいぶんしみったれてるな。 '('が出て来たら')'の直前までを式と解釈してくれても良さそうなもんだが
Rubyのパーサは(人間にすると)曖昧な解釈だからなw
>>437 puts 1
+2
が駄目なので、演算子を行末におかない場合は次行と連結されないため、式として認識しない、までは認識できるだろう。
なので、次の
puts (1
の時点で次行とは連結されないでその行までで解釈される、と考えられるので、
閉じ括弧がその行にないのでエラーとなる、と
そういうふうに頭がさっと回らない、ということならばあなたがRubyに慣れていないか、
もしくは俺が長い行を複数行に分割するのに慣れすぎているのでそう感じてしまうだけかw
441 :
デフォルトの名無しさん :2009/12/25(金) 21:24:09
puts((3 + 4)) # => 4 とかRubyって面白いね
えっ? ここ初心者スレなんですけど
>>443 初心者にも有益な話題じゃない?
式が完結してしまうところで不用意に改行して構文エラーも出なくて
なんでうまく動かないんだみたいな落とし穴を回避するにはこういう知識も必要
バッドノウハウに近いと思う 改行が有効な個々の場合を記憶する理由はない
初心者は構文解析何それおいしいのだし 妙なところで改行打つような真似もしないだろう
結論 とても長い式文でもない限り途中で改行すると見づらいし誤作動の原因になりかねないからやめれ。
メソッドチェーンはとても長い式文に入りますか?
449 :
デフォルトの名無しさん :2009/12/25(金) 23:54:41
>>444 >>443 は
>>440 に対して
初心者スレで何で
>そういうふうに頭がさっと回らない、ということならばあなたがRubyに慣れていないか、
なこと言うのってことだ
puts (3;+4) はエラーで puts((3;+4))は通るのは何で?
前者、おそらく”(”がメソッド引数の括弧だと読まれている 引数部に”;”があるのはおかしいからエラー 後者、(3;+4)は4に等しいから、 puts(4)と同じ。もちろん文法的に正しい
なぜこんな仕様にしたし
括弧の省略を可能にするため、とマジレス
456 :
デフォルトの名無しさん :2009/12/26(土) 21:00:18
質問です。 include して使われることが想定されているモジュールを書いているのですが 非公開の下請けメソッドの扱いについて悩んでいます。 include先で名前の衝突が起こらないようにするため、以下の方法を考えたのですが…… 1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw 2、モジュールメソッドにしちゃう → 非公開じゃなくなるw 3、モジュール内部に Privateモジュールを作り、Private.method でアクセス → Privateモジュール自体は非公開にできないけど、includeする側からアクセス されることはまずないだろう 他にもっとよい方法というか、こういう場合のイディオム、定石のようなものが あったら教えて欲しいです。
>>456 実用上は
>1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw
で十分。それでも心配なら接尾辞もつけるといい。
(もちろん衝突しやすい接頭辞は避けてね)
458 :
456 :2009/12/27(日) 08:57:11
>>457 わかりました。接頭辞をつけておくことにします。
あまり長すぎるとうるさくなるんで、
アンダースコア+モジュール名を3文字くらいに圧縮したもの ぐらいでいいかな。
インスタンスメソッドである必要がないなら非公開にする必要もないと思うんだけど 個人的には3かな、Hoge::Utilsとか
>>456 >1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw
スクリプト言語は変数の型についてはいいかげんだし、カプセル化についてだけ厳密性を求めてもしょうがないと思う。
もともとそういう言語じゃないんだよ、スクリプト言語は。
接頭辞や接尾辞をつけるだけでは衝突する可能性はゼロにできないけど、実用上は問題ないから、それでよしとしてください。
461 :
456 :2009/12/27(日) 17:37:52
>>459 > インスタンスメソッドである必要がないなら非公開にする必要もないと思うんだけど
> 個人的には3かな、Hoge::Utilsとか
Helpers とかもそうですね。
外部から利用しても役に立ちそうなメソッドなら積極的にそうすべきかも
>>460 > カプセル化についてだけ厳密性を求めてもしょうがないと思う。
> もともとそういう言語じゃないんだよ、スクリプト言語は。
そういうもんですか。
サブクラスに対して閉じるアクセス制御って今後もできないんですかね
>>461 たぶんRubyでのprivateを勘違いしている。
Javaと違うから、マニュアルを読むことをお勧めする。
>>462 名前の衝突を懸念している時点で勘違いはしてないと思うのだが
>>464 「サブクラスに対して閉じるアクセス制御」と言ってる時点で勘違いしてると思う。
あればいいのにって話だろ
Rubyではアクセス制御はそもそもできない 可視性を決めるだけ
↓ 本質的にはオープンクラスを諦めないといけない ↓ 再オープンできる時点で制御も何もねえよ ↓
本質的にはMatzの設計次第
サブクラスに上書きされない為にどうしたらいいかって質問なのに 勘違いしてるとか不要とか諦めろとかどーゆー事よ 質問者の方がよっぽどrubyの事を理解してると思うわ
Matzに聞いたら、 サブクラスで気をつけれ っていうに決まってそう
>>471 だからシステム的にできねえって
新しいRuby実装を自分で作れば無論可能だが、そういう回答を求めているわけではあるまい
set_position x, y, z get_positionX みたいなget,set関数を作りました。 setはともかくgetはつけずに positionX の方が良いですか。どちらがよりRubyっぽいか教えてください
x メソッドや y= メソッドだと都合が悪い?
ziki.position = [x,y,z] puts ziki.position_x ですか??? そっちの方がRubyっぽいならそれでも良いです
混乱してきたので質問を変えます。 AとBについてどちらが良いですか? A: (1) my.position = [1,2,3] (2) my.set_position 1, 2, 3 B: (1) puts my.position // 配列 (2) puts my.position_x
>>478 [x, y, z] の組が頻出なら Struct を使ってもいいかも
Point = Struct.new(:x, :y, :z)
my.position = Point.new(x, y, z)
my.position.x
>>478 attr_accessor, attr_writer, attr_reader とかは知ってる?
>>479 のPointを使って
class My
attr_reader :position
def initialize ; @position = Point.new ; end
def position=(xyz)
@position.x,@position.y,@position.z = xyz # 要引数チェック
end
end
my = My.new
my.position = [0,0,0]
pos = my.position
my.position.x = pos.x + 1
初心者スレでStruct使うアホは即爆発していいよ
483 :
478 :2009/12/28(月) 22:11:56
そんな難しい文法使わないでください。 初心者には理解できません。
>>482 お前は永遠に配列の添字アクセスでもやってろ
ハッシュで複雑なデータ構造を表現するのは悪らしい。。
>>485 Javaの人は引数にハッシュを使うことを理解できません
Struct使う人間の95%がRubyをJavaと勘違いして使っています
質問です [1,2,3] * [2,2,2] = [2,4,6] と書ける裏技無いですか。 ようは2つの配列を要素毎掛け合わせて欲しい
>>488 とくにないです
require 'enumerator'
a1 = [1, 2, 3]
a2 = [10, 20, 30]
p a1.enum_with_index.map{|e,i| e*a2[i]} #=> [10, 40, 90]
>>488 class Array
def * other
m = []
each_index{|i| m << self[i] * other[i]}
m
end
end
裏技だからね。既存の Array#* を使ってるコードがどっかにあって
何が起きても知らないよ。
>>487 は x, y, z の組をどう扱うの?
492 :
488 :2009/12/29(火) 09:38:30
>>490 いやそれはちょっと……
>>489 うーん、やっぱり無理そうですね。
C++みたいに Array& operator* (const Array& a1, const Array& a2) が定義できると便利なのに
a1 = [1, 2, 3] a2 = [10, 20, 30] p a1.zip(a2).inject([]){|r,(x,y)| r << x*y} とか
>>491 配列とかでいいんじゃねえの
組として外部に持ち出さなければならないなら
クラスか何か作って名前付けることをそのときに考える
eclipseで開発できますか?
def foo= end と同様に def foo<< end を定義するとコンパイルエラーになるのですが、もしかしてこれはダメなんでしょうか。 その場合はどうすれば???
foo= のようなメソッド名は、 obj.foo = ... のような式のために特別に許されている。 (foo に代入するためには、obj.foo ではなく obj そのものを呼び出す必要があるため) obj.foo << のような式は、obj.foo の << の呼び出しと解釈されるので、 そういうようなメソッド名はない。 ていうかどういうことがしたいわけ?
obj.foo = # 代入 obj.foo << # 追加 がやりたいです。 fooは仮想的な配列でメンバー変数ではありません。
Ruby ではオブジェクトの外からインスタンス変数を直接参照したりはできません。 obj.foo は obj.foo() というメソッド呼び出し(が返す値の参照)です。 obj.foo() を定義して、それが返すオブジェクトの << メソッドでなんとかするしかないと思います。
あーなるほどそういうふうに見えるのか
この場合は変数操作でこの場合変数に偽装したメソッド呼び出し
みたいな使い分けで引っかかるのは理解する
>>495 あまり楽しくない
eclipseで開発したとして、実行はどうするんだろうね Runとかやって、スクリプトが動いても なんかな、って感じになりそう
<<を定義して配列のように見せかけている例としてはRailsの ActiveRecordのhas_many関連がありますな。 .classですらArrayと返ってくる徹底ぶり。
506 :
デフォルトの名無しさん :2009/12/30(水) 15:20:41
def foo= x, y, z end を定義して bar.foo = 1,2,3 と呼び出すと ./main.rb:25:in `foo=': wrong number of arguments (1 for 3) (ArgumentError) というエラーが出るのですが、なぜ引数3つで呼び出しているのに引数の数が間違えている(1?)とか うちのRuby様はふざけた事を言い出すのでしょうか
bar.foo = a, b, c は bar.foo=([a, b, c]) だからです。 bar.foo=(a, b, c) で呼び出してください。
syntax error, unexpected ',', expecting ')' bar.foo=(1, 2, 3) 末尾= の場合は引数1つに限定かしらね? bar.foo=[1, 2, 3]は wrong number of arguments (1 for 3) (ArgumentError)
>507 それウソ
たぶん
>>508 が言うように末尾=の場合は引数1個限定だと思う
けど自信ない
puts RUBY_DESCRIPTION #=> ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mingw32] plus = "a".method(:+) #=> #<Method: String#+> p plus.("b") #=> "ab" この3行目のシンタックスについてparse.y以外でどこかにドキュメントありませんか? Method.instance_methodsにそれらしきメソッドが見当たらないのですが,Methodオブジェクトに特有なものなのでしょうか?
メソッドじゃなく、文法(構文)の範囲だから instance_methods では出てこないよ。 Procでも使える。
>>509 やはり、呼び出すときには引数が一つしか取れないのだろうか?
でも、定義では3つの引数が必要なので、引数の数が合わないと怒られる
bar.send( :foo=, 1,2,3 )
で、引数三つ与えて呼び出せないこともないけど
なんだか、無意味な感じ
514 :
デフォルトの名無しさん :2009/12/31(木) 06:56:22
515 :
デフォルトの名無しさん :2009/12/31(木) 08:32:35
>>511 >>512 なるほど。
指摘していただいたドキュメントも拝見いたしました。
#callをできるだけ通常のメソッド呼び出しの記法に近づけるため
#[]をオーバーライドするといった努力をしているというのは
耳にしたことがあったのですが,.()もその一環のようですね。
ありがとうございました。
Ruby1.9で正規表現のエンコーディングにShift_jisを指定するには どうすればいいんでしたっけ? オプションでsを指定すればよかったような気がしたのですが、 p /hogehoge/s.encoding で#<Encoding:Windows-31J>が帰ってきます。 WindowsXPで ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mswin32] です。 よろしくお願いします。
Regexp.new('あ.い.う.え.お’.encode('Shift_JIS')) かなあ。
明けましておめでとうございます。
>>518 /\p{ASCII}/ という表現を使いたいのでその手法は難しいんです。
今回は関係ありませんが/\x82\xA0/
という表現もその手法だと難しいですね。
マジコメでソースエンコーディングをsjisに指定するって手もあるのですが、
大人の事情でこの手法も避けたいのです。
ハチドリ本を読み返したのですが、p.335には"SJISは、s"って書いてありますね。
なんだかなぁ。
引き続きよろしくお願いします。
失礼しました、
>>518 さんの方法でできますね。
もっとスマートな方法があればいいと思うのですが、とりあえず解決です。
お騒がせしました。
521 :
デフォルトの名無しさん :2010/01/01(金) 14:23:19
SJISのデータを一度読み込んでUTF-8に変換してごにょごにょ が一番綺麗だと思う。 SJISでしないといけない理由は実はなかったりしないかい?
rubyのアンインストール方法ってどうするんでしょうか。 ./configure --prefix=/usr/local make sudo make install でインストールしたのを、事情によりきれいさっぱり削除したいです。
>>522 特に手段は用意されてない
make -n installでファイルリストを作ってぶん回すぐらいしか思いつかないな
524 :
デフォルトの名無しさん :2010/01/02(土) 02:18:44
標準ストリームに対する文字コードについて教えて下さい。 まだRubyの問題なのか、OSの問題なのかも上手く切り分け出来ていません。 m(__)m TCPでクライアントと通信するプログラムを作っています。 環境はサーバー側(作っている側)がDebian Lenny(5.03)で、文字コードはUTF-8です。 クライアントはWindows2000のマシンで、文字コードはShift JISです。 コードは次のような感じです。 他にも色々な処理が入っていますが、話を簡単にするため、コードを思いっきり削っています。 > hoge.rb #! /usr/bin/ruby -Ku while receive = STDIN.gets # コマンドを受信した msg = "受信しました" # UTF-8 # 送信処理 # STDOUT.puts( NKF.nkf('-Ws', msg)) # これだとWindows側にパケットが全く返らない STDOUT.puts( msg) # これだとWindows側で漢字は化けるけどパケットは返る end というような感じです。 何かパケットが来たら、メッセージを返すものです。 (実際にはPostgreSQLを呼び出し、コマンドの結果を得て返しています。)
525 :
524 :2010/01/02(土) 02:19:24
このコードはinetdから起動されます。 inetd.confはこんな感じ。 4142 stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/hoge.rb Rubyで扱っているUTF-8の日本語文字列を、標準ストリームにShift JISで流したいだけなのですが、上手くいきません。 Shift JISで出力しようとすると、STDOUTするところで、何事も無かったかのようにパケットが送信されません。 Rubyはエラーにもならず、その行を飛ばしたかのような挙動になります。 UTF-8のままでSTDOUTへ出力すると、Windows側で文字化けしますが、パケットは返ります。 事情により、Windows側のプログラムには手を入れられません。 どこらあたりから、見直していけば良いでしょうか? この件の調査修正で、お正月休みも返上です。(TT) よろしくお願いします。
526 :
524 :2010/01/02(土) 02:48:40
あ、ごめんなさい、すっかり書き忘れていました。 Rubyのバージョンは1.8.7です。 よろしくお願いします。
527 :
デフォルトの名無しさん :2010/01/02(土) 04:37:19
require 'kconv' STDOUT.puts(msg.tosjis)
528 :
524 :2010/01/02(土) 12:29:54
>>527 ありがとうございます、しかし状況変わらずです。
NKFとkconvは、挙動が違うのでしょうか??
529 :
524 :2010/01/02(土) 12:53:11
>>527 再び524です。
申し訳ありません、確認が足りませんでした。
このmsgには”人の名 ”(漢字3文字+空白14)というように、
ASCIIで20Byte毎に区切って送るという仕様です。
ですが、Windows側には”人の名 ”(漢字3文字+空白11文字)として
届いていて構文チェックで跳ねられていました。
ちょうど空白が漢字の文字数分足りません。
UTF-8からShift JISに変換する時に、漢字とスペースの扱いはどうなるのでしょうか?
何か、特別な処理が必要でしょうか?
以前、EUC-JPとShiftJISでやったときは、問題無かったのですが。
なんとなく光が見えてきました、引き続きよろしくお願いします。
どっかに全部コード貼ってから来なさい
531 :
デフォルトの名無しさん :2010/01/02(土) 15:32:50
532 :
524 :2010/01/02(土) 17:35:34
>>531 ありがとうございます、解決しました。
結局、SJISに変換してから加工するようにコードを変えました。
UTF-8では、漢字は3バイトなんですね。
勉強になりました。
お騒がせしました。
533 :
524 :2010/01/02(土) 22:50:27
>>530 524です、今、デバッグを終えて、正常動作を確認しました。
決め手は
>>532 さんの「漢字は3バイト」でしたが、結構ポカミスもしてまして、今まで掛かりました。
ごめんね、プロジェクトの規模が大きすぎて、コードは晒せないの…
某自動車会社で、国土交通省に提出する書類を作成するためのシステムです。
Rubyの案件としては、中くらいの規模なんじゃないかな。
わりと重要なシステムで、止まると車が作れません。
Rubyはミッションクリティカルでも大丈夫、信頼が置けます。
pgsqlだったかな、DBIになる前の古いやつ。
それからDBIへの移植だったのですが、なかなか…
pgsqlでEUC-JPだから動いてたっていうコードが結構あって、
思っていたより全然はまりました。
何処へ質問を投げようかと思案したのですが、おまいらに聞くのが一番良い気がして
ここに書かせて貰いました。
あとは1月4日の総合テストを待つのみです。
実際に車を測定する設備が無いので、うちの社内では完全なテストは出来ないんですよ。
何はともあれ、おまいらのお陰で解決しました。
本当にありがとう。
それでは、名無しに戻ります。 m(__)m
>>533 身元と案件を特定出来る情報を2chに書くなよ・・・
535 :
531 :2010/01/03(日) 00:20:53
>>533 いまのご時勢でRuby/DBIを選択しちゃうセンスは大いに疑問だが、問題が解決してよかったね。
> いまのご時勢でRuby/DBIを選択しちゃうセンスは大いに疑問だが kwsk
通報。
HTTPProxyを作りたいので
WEBrickでプロキシサーバを作って遊ぶ
ttp://jp.rubyist.net/magazine/?0002-WEBrickProxy を参考に
require 'webrick'
require 'webrick/httpproxy'
s = WEBrick::HTTPProxyServer.new(
:BindAddress => '127.0.0.1',
:Port => 8080,
:Logger => WEBrick::Log::new(nil, WEBrick::Log::DEBUG),
:ProxyVia => false
)
Signal.trap('INT') do
s.shutdown
end
s.start
と書いて実験してみたところ
リモートからのデータをいったんメモリに貯めてからクライアントへ渡す動作をするようです
この場合巨大なファイル(結構大きいファイルを扱うProxyを作る予定です)を通したときにメモリ消費が
洒落にならないので、読み込んだデータから逐次クライアントへ渡すような動作にしたいのですが
そのような設定は可能ですか?可能であればその方法を教えてください。よろしくお願いします
以前、どこかのスレで python -i と同じことをする方法を見たのですが、どうやるんでしたっけ?
$ irb
ver #=> Microsoft Windows XP [Version 5.1.2600]
ruby -v #=> ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mingw32]
以下の簡易wget風ワンライナをより短くできませんか?
ruby -ropen-uri -e"$><<URI(*$*).read"
http://www.example.com/ >output
ruby -ropen-uri -e"$>.binmode<<URI(*$*).read"
http://www.example.com/hoge.zip >output
短くならなければ「短くならないよ」というご意見や
よりスマートな代替案もいただけたら幸いです。
>>543 早速のレスありがとうございます。
ライブラリ案・バッチ案は個人で使う分にはアリですね。
コマンドもすっきりしますし。
個人的には何もライブラリやファイルをインストール(作成)せずに
Ruby単体で簡易wgetを実現できればいいなと思っています。
あまり実用的な場面はありませんが ^^;
>>538 データをストリーミング中継したいということでしょうか?
私はネットワークプログラミングに詳しいわけではないのでアドバイスはできませんが,
googleで "webrick ストリーミング" で検索してみてください。
1件目のブログが参考になるかもしれません。
>>539 対話型debugが目的なら -rdebug
対話型インターフェイスが目的なら
while true
print ">"
input = $stdin.gets.rstrip
break if input == "\x04" # ^D
puts input
end
もしくは(GNU Readlineが必要)
require "readline"
while input = Readline.readline(">")
puts input
end
pythonなんて知らんよ
OpenGLってDirectXに比べるとプリミティブすぎるというか機能足り無くない? 標準のシーングラフとかあっても良いと思うのだが…… 何か無いですか?
548 :
538 :2010/01/03(日) 13:46:23
>>545 レスありがとうございます
探していた情報はまさにそれです、ストリーミングも含めて考えていました
逐次転送するような動作は不可ですか・・・(´・ω・`)
以前にsocketで似たような物を実装しようとしたことがあったけどリクエスト/レスポンスの
終了を検出する方法が判らなくて断念・・・il||li ○| ̄|_
>>548 webrickを改造する場合にはリファレンスの以下の項が参考になるかもしれません。
Net::HTTPResponse#read_body {|str| .... }
「エンティティボディを少しづつ取得して順次ブロックに与えます。」
TCPSocketを使う場合でも
socket.gets until $_ == CRLF
でヘッダを切り離して
while data = socket.gets
...dataを料理...
end
ではダメですか?
Rubyで終端を気にする必要はなかったように思います。
他に思いつくにはヘッダのContent-Lengthを信用してそのバイト数だけ読み込むとか。
TCP/IPの規格に詳しくないので当てずっぽうですが。
windows機でタイマーを実装しようとしてます。 マルチスケジューリングなキッチンタイマーのようなものです。 問題がありまして、 例えば60分後にアラームを鳴らせるというタイマーのプログラムを行ったときに やっぱりその30分前にもう一個のプログラムを追加したいと思ってもそれを行うためには 常に入力待ち状態である必要があります。 その一方で常に出力待ち状態でないと指定時刻にタイマーを実行することができません。 今は タイマー入力(空入力も化)待機モード→ 1分間のタイマー実行待機モード→ その1分の間に起こるべきイベントがあれば指定時刻にイベントを起こす→ またタイマー入力待機モードに戻る→ 以下ループ というようにユーザに入力によって待機モードを切り替えることでそれらしい動作をさせています。 どのようにすればもっとスマートにこのタイマーを実装できるでしょうか? 一つのスマートじゃない方法はテキストエディタと外部ファイルを使ってこのタイマー入力を行うことかなと思うんですが。(非排他モードでファイルの書き込み読み取りする) forkがwindows rubyでは使えなくて、そもそも子プロセスを使ったことがないので悩んでいます。
552 :
538 :2010/01/04(月) 03:29:30
>>549 レスありがとうございます
WEBrickはソースコードを理解するだけで時間が相当かかりそうな感じなので
改造はあきらめます・・・
バイナリデータをgetsで読み出そうとすると最悪の場合、最後まで読み込んで
しまうように思いますが・・・
Socketの終了が判らない件ですがノンブロックモードで読み出す方法
(sysreadを使う。getsが使えなくなるけど・・・)が判ったのでひとまず解消しました
普通にreadを使うとブロックモードなんで帰ってこない・・・(TT
しかし1セッションに複数のホストへのリクエストとかマンドクセ(´・ω・`)
>552 getsはバイト列に$/(普通は0x0A)がでてこなければ 最後まで読み込んでしまうけれど、その確率は気にするほどのものかな ミッションクリティカルなアプリケーションならしかたないとは思うけど
>>550 つ Thread & ConditionVariable
puts uri if /pc11/ =~ uri.to_s
>>555 URI.extract の返値(URI の配列)に対し find_all でいいんじゃない?
str = open(url).read
URI.extract(str, ['http']).find_all {|uri| uri =~ /pc11/ }
正規表現マッチの部分はもう少し厳密にした方がいいと思うので適当に
558 :
557 :2010/01/04(月) 13:13:58
返値を変数に格納するの忘れてたw
str = open(url).read URI.extract(str, ['http']).grep(/pc11/)
「特定のURLを抜き出す機能」と考えるからわからなくなるんだと思う 配列から特定の条件を満たす要素を抜き出す方法とか URIオブジェクトのURI構成要素を返すメソッドは何かとか そういうの調べていったほうがたぶん早い
御託はいいから妥当解とっとと出せカス
「手抜き」じゃね? いつ動かなくなるのか不安だ。。
どうでもいいけど、 普通はstr = open(url).{|io|io.read}じゃね? それかstr = URI(uri).readか。
>>561 require 'open-uri'
url = "
http://menu.2ch.net/bbsmenu.html "
purls = URI.extract(open(url).read, ['http'])
uris = purls.map{|url| URI.parse(url)}.find_all{|uri| /\Apc11\.2ch\.net\Z/ =~ uri.host}
ただ、
「URLを抽出したあとそれに対して何をしたいのか」
「本当に抽出したいのは本文のURLではなくて<a href>のリンクなのではないか」
「貴様は次のレスで「あっあと
ttp://も抽出したいです 」と言うッ!」
とかいうような危惧がないわけでもない
普通にHTMLパーサ通したほうが近道だったり
一般的な適当範囲の正規表現を通したほうがマシな処理だったりしなくもなくもないかも
関係ないけど、2chのAPIは糞。
そりゃ急いで突貫工事したものをずっと継ぎ接ぎで使ってるからな これがめちゃくちゃ洗練されて、2chアクセス者全員にdat直読みだけをされるようになっても 本当は運営的にはちょっと困るのよ
datはまぁ良いとして、bbsmenu.htmlだけはどうにかして欲しいな。
>>566 APIが洗練されたとしても利用者全員がdat読みすることなんてありえんから
後半は全然関係ないだろw
>>568 本当に洗練されたWeb経由APIはJavaScriptのみでの実装を許す
API経由で広告を見せて有効に動作させるロジックはまだ発明されていない
今の2chから広告収入外されたら傾くぞ
なんかこう物理的にナナメに傾くだけで済む気もするのがなんか謎な収益だが
>>563 まあなんか非常にめんどくさいのだけど
open(path).read は close 忘れが多いので推奨されない書き方
(open(path){|f| f.read} を強く推奨、File.read(path) は Windows のバイナリスイッチが入らなので非推奨)
ただ、open-uri を読み込んだ URL や URI に限っては、
open(uri).read は IO#close 相当を必要としないので妥当安全にたまたま動作する
いや、ブロックつきで書いてもいいけど
っていうかレスしてて気づいたけど本当にたまたま動くんだなこれ
ローカルのファイルを読むことがなくて、簡便な HTTP アクセサとしてしか使用しないのなら
あなたの言うように URI.parse(url).read するのがいちばんではあるっていうかお前ら初心者スレで手を抜くな
>>570 手を抜くな、と言われましても、2chの手抜きAPIに対して
真面目にプログラミングする気がしませんん。
手抜きAPIを調教して俺色に染めてやんよ
そもそも2ちゃんのそれはAPIなんかじゃない無いだろw 一時期XML吐こうぜみたいな動きがあったみたいだけど、 「やっぱだりぃわ」で自然消滅した?w
>>571 URLにアクセスしてHTMLを取得するという根幹部分すらまともに書けませんと素直に言ったら
>>574 は?HTTPのライブラリぐらい作ったことあるから w
しっかし、open-uriって、 open(path)ってしただけでゴリゴリとTempfileをディスクに書いちゃうのね。 大量のURIを扱うならopenは使うべきじゃないな。
>>571 のような open(file).read と open(file){|f| f.read} の違いがわからないような人間にはなりたくないと思う
>>576 f = open(uri) が open として何を返すべきかを考えたら、
StringIO が返ってくる低サイズ帯のほうがむしろ特殊というか変
無圧縮のzipを作成したいのですが ziprubyもrubyzipも無圧縮オプションが見当たりません この2つは無圧縮zipの作成をサポートしていないのでしょうか? あるいはlibtarで作成すれば無圧縮zipと同じものが出来ますか?
open-uriだけでよくここまで話せるな
>>579 ヒント
Zlib::NO_COMPRESSION
>>579 オレも気になったので調べてみたけど見当たらないね、実装されてないのかな?
おそらくPKZIP形式を求めていると思ったので
偽Zip32J.DLLてのを使ってやってみた
require 'dl/win32'
zip = Win32API.new("Zip32J.DLL","Zip","lppl","l")
p zip.call(0,"-q -0 out.zip 1.txt 2.txt", "" , 0)
拘り無いならtarでいいと思う
rubyzipのZip::ZipOutputStream#put_next_entry見ろよ。 どこ見てんのよ。
a='/' a.sub!(/\//, "\\") p a これで出力は \ 1個を期待したのだけど \\ 2個になってしまう a.sub!(/\//, "\") こうすると怒られるし どうしたらいい?
>>584 irbでinspectの結果を見てないか?
ごめん、pか。 pはinspectの結果を出すので、そうなって当然。 putsせよ。
subとgsubはブロックを使えと先生から習わなかったか
しかしそれ以前の問題だからのう。 どうでもいいけど、個人的には正規表現に / が入るときは %r が見やすい
590 :
584 :2010/01/06(水) 14:48:46
>>585-589 あざーした!
pの方が短くてうちやすいので
ついputs代わりに使ってました
今度から気をつけます!
exerb 使う時って open-uri 使っちゃいけないの?
WindowsでRubyを使うこと自体が既に初心者レベルを超えてる
いや、逆じゃないのか。。
RumixってOne-Click Installerとなにがちゃうんや!
One-Click Installer 海外版Windows向けRubyパッケージ(ただしRuby古い) Rumix 日本語版Windows向けRubyパッケージ
597 :
デフォルトの名無しさん :2010/01/09(土) 19:02:01
rubyはメモリをたくさん食うと聞いたことがあるのですが解決方法などはありますでしょうか?
>>597 Rubyを使わない
Rubyはメモリを多めに使うことで、Rubyであるということの意味を保っている
(そもそも言語レベルでそのように作られている)
メモリを大量に消費するということがネックなのなら、その用途にRubyを選ぶべきではない
ほんとカス言語だな
>599 suck but ruby just sucks less.
sorry!! this site is japanese only!!
rubygemsの開始読み込みのへちょい構造はどうにかして欲しいと思うことがある あれはRubyらしさとかそういうの抜きで単にミスだろう
メモリを大量に食うこと自体が設計ミス
>>603 お前気楽な人生送ってるな
反対のことだけ書いてりゃ爽快なんだもんな
CPU時間でQuotaや課金があるようなサービスがもうちょっと一般的になると Rubyは再度日陰になるのかね どっちにしても初心者スレの話題じゃねーな
Ruby1.8 for WinでインタプリタがCUIかGUIかを簡単に判別する方法ってありますか? exerbでexeファイル化する予定なので出来れば自動で判別したいです
空間計算量と時間計算量を犠牲にしてMatz好みのOOとプログラマの幸せを手に入れたいらしい
609 :
デフォルトの名無しさん :2010/01/10(日) 18:15:55
rubyかpythonどちらを初めに勉強しようか悩んでます どなたかアドバイスお願いします
はいはいpython、python いいからさっさと消えてくれ。目障りだ
611 :
sage :2010/01/10(日) 18:40:42
rubython
Rubyを256倍使うための本ってどうですか? オクにいくつかでてるんで、買おうか迷ってるので教えてください。
>>612 古書
Rubyの過去を知るために有意義
質問です。 hamlで以下のような定義のときに、ruby本体でどのようにしたらいいのか教えてください。 %table != header = capture_haml do %tr %th Name %th TimelogUrl %th Status - @users.each do |u| %tr %td u.name %td u.link != header この中で、@usersをどのように定義したらいいのかが分かりません。 バージョンは以下のものを使っています。 ruby 1.9.1 haml 2.2.16
>>614 そのときのコンテキストにおける self に対して。
たとえば instance_eval { @users = ... }
>>615 レスありがとうございます。
すいません、もう少し詳しく教えてもらえると嬉しいです。
@users = [
[
name => "aaaa",
link => "link1"
],
[
name => "bbbb",
link => "link2"
]
]
こんな感じのを想定しているんですが、全く違うようなそうでないような・・・
そんなレベルです。すいませんorz
もしかしてRailsのビューにhamlを使ってみようとかそういう話?
あの〜、Rubyってブラウザ上で動くアプリは作れないのですか?
ブラウザ上で動くアプリってたとえばどんなんだ HTMLと画像とJavaScriptで構成されているWebアプリケーションなら サーバを用意してサーバ上でRubyを頑張って動かせば作れないわけでもない Flashなどを利用するタイプのは、そりゃバックグラウンドサーバでRuby動かすことはできるけど それより先にFlashで普通に作らないといけないぞ 何の話をしてるかわからないのなら、Webアプリケーションについての概略知識が足りない
>>617 先に書くべきだったでしょうか?
Sinatraを使ってPassenger経由で表示させようとしています。
index.hamlという名前でhamlを使って別ファイルに保存していて、それをstart.rbから読み込んで表示させようとしています。
>>621 はい。そのページは知ってるのですが、実際に定義する場合にどのようにしたらいいのか?
というところで悩んでます。
テストデータを仮に組もうとして、どう「書いたら」良いのか分からないという orz
>>622 こんな感じか
TestData = Struct.new(:name,:link)
@users = [ TestData['aaaaa','link1'], TestData['bbbbb','link2'] ]
>>623 ありがとうございます。
おかげさまで動きました。
ただ一つだけ修正が
>>614 の所は
%td u.name
%td u.link
は
%td= u.name
%td= u.link
でしたorz
【レス抽出】 対象スレ:Ruby 初心者スレッド Part 33 キーワード:orz 抽出レス数:7
R Language Ruby
Pで始まってLで終わる言語っていう表現があったな。 文脈によって指すものは変わる。
質問です 同じ名前のチェックボックスから複数の値をとりだすにはどうしたら よいのでしょうか? require "cgi" cgi = CGI.new check1 = cgi["check"][0] とかで個別には取れますが、選択できる数が固定でない場合、 どのように書けばよいのでしょう? 配列の数さえわかればできるのですが cgi["check"].lengthとかで配列の数がとれないようですし困っています。
629 :
628 :2010/01/11(月) 17:58:49
自己解決しました くだらない質問してすみませんでした
cgiは残念だがゴミ。
zsh で rake を実行するときに、desc がある task だけしか、 task が補完されない。Rakefile 中の全 task を補完させたいのだけど、 どうしたらいい??
rubyはjis規格で規定されていますか?
>>631 zshの設定を変える
rake専用の補完関数を書けばいい
誰かが作ってるのではないかな
635 :
デフォルトの名無しさん :2010/01/12(火) 22:17:37
Ruby と IPA はどのような関係があるのですか?
情報処理技術者試験の午後問題になる日も近いな
Ruby/GSL
http://rb-gsl.rubyforge.org/ のWindowsバイナリってないです?
gem install gslしようとしたら、native libraryでコンパイルしようと下ので、
VC++2008環境でやってみたんですが、エラー吐いてダメポです。
どなたかコンパイルしたバイナリか、コンパイルの仕方教えてください。
mingwとかでもコンパイルできますか?
C:\Program Files\Microsoft Visual Studio 9.0\VC>gem install gsl
Building native extensions. This could take a while...
ERROR: Error installing gsl:
ERROR: Failed to build gem native extension.
C:/ruby/bin/ruby.exe extconf.rb
checking for sys/types.h... yes
checking for u_int8_t... no
checking for int16_t... no
checking for int32_t... no
checking for u_int32_t... no
creating narray_config.h
creating Makefile
nmake
(つづく)
(つづき) Microsoft(R) Program Maintenance Utility Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. cl -nologo -I. -I. -IC:/ruby/lib/ruby/1.8/i386-msw in32 -I. -MD -Zi -O2b2xg- -G6 -DHAVE_SYS_TYPES_H -c -Tcnarray.c cl : コマンド ライン warning D9035 : オプション 'Og-' の使用は現在推奨されていま せん。今後のバージョンからは削除されます。 cl : コマンド ライン warning D9002 : 不明なオプション '-G6' を無視します narray.c c:\ruby\lib\ruby\1.8\i386-mswin32\config.h(2) : fatal erro r C1189: #error : MSC version unmatch NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN \cl.EXE"' : リターン コード '0x2' Stop. Gem files will remain installed in C:/ruby/lib/ruby/gems/1.8/gems/narray-0.5.9.7 for inspection. Results logged to C:/ruby/lib/ruby/gems/1.8/gems/narray-0.5.9.7/src/gem_make.out
>>630 cgi.rbがゴミなのでしょうか?
他に使いやすいCGIライブラリってありますか?
643 :
640 :2010/01/13(水) 00:32:06
こういったライブラリはmingw32でコンパイルできるものなのでしょうか?
>>642 いまのところの本命はRackやRackに基づいたもの。
.. (. . ) ,―ヽ__(__、― ,/ ノ ヽ ~\ / ノ IPA ヽ ~\ / ノ ヽ、 `ヽ | ノ / ̄\ / ̄~ヽ ヽ i | ノ | ノ \ | <●> <●> ( ) \ | | | i / | / ヽ レ i (●_●) / i、 ,-――-、 ・ / i、 <(EEEEE)> ∵/ RubyはIPA Rubyになったピョん☆ i、 \ ./ / \ ーー ,ノ ,,.....イ.ヽヽ、ー-―一ノ゙-、. : | '; \_____ ノ.| ヽ i | \/゙(__)\,| i | > ヽ. ハ | ||
初心者には Ruby 1.8.7 を強くお勧めします。とありますが、
公式から初心者のためのRubyインストールガイドに飛んで、
<URL:
http://rubyforge.org/projects/rubyinstaller/ >でダウンロードできます。
に行ったところ、1.8.6と1.9.1しか見当たりません
ど初心者なので安心な公式からのリンクのインストーラを使っておきたいところなんですが
興味を持っていざ足を踏み入れてみたものの、いきなり迷子になってます
>>640 rubyをコンパイルしたのと違うバージョンのコンパイラを使うと
ランタイムライブラリが衝突する関係上、拡張ライブラリはコンパイルできない
ただしVC6とMinGWは同じランタイム使うのでそこの互換性はあり
つーことで、
>>643 はrubyがVC6かMinGWでコンパイルされている条件付でyes
>>648 ありがとうございます
教えてもらったRumix - Ruby Starter Package with Installer
でインストールして初めてみたいと思います
651 :
640 :2010/01/13(水) 01:48:30
ありがとうございます。 RubyはVC6版(ActiveScriptRubyのだと思う)のはずなので、MinGWでコンパイル試してみます。
>>650 わざわざありがとうございます
ActiveScriptRubyもチェックしてみたいと思います
環境によってrubygemsがアホみたいに遅くなるのはどのWindows版だっけ
>>653 mswin32が爆弾持ち
絶対にmingwもいれて比較すべき
遅く感じないならどっちでもいい
遅くない人もいるみたいだから
1.8.7のインストーラ用意してないのは、単なる手抜き? まあ教祖自身がウィンドウズ使ってないから放置なんだろうけど。
マストでないので、やる人員が確保できなければ特段用意されない
マイクロソフトあたりが環境用意してくれるのはきっと大歓迎。
>>655 自身が必要なら手を上げれば今なら英雄候補生
arr.insert(0, obj) ってなんか意味あんのかね arr.unshift(obj) と一緒だよね ただのデータ配列なのでキュー関連の物言いを嫌ったのかね
660 :
デフォルトの名無しさん :2010/01/13(水) 16:12:42
floatの内部表現を表す4バイトを指す文字列(ポインター)が欲しいのですが、どうすればいいのでしょうか C言語で書くとこうなります。 float f[] = {1,2,3,4,5,6}; unsigned char* p = (unsigned char*)f; OpenGLを使っていて頂点データをGPUに送るのに配列の生データが欲しいのですが……
662 :
デフォルトの名無しさん :2010/01/13(水) 17:04:11
>>661 .pack("f*")で出来た。まじサンクス。
@@vertices = [1,0,0, 0,1,0, -1,0,0].pack("f*")
@@indices = [0,1,2].pack("f*")
>>659 すまん。レスの趣旨がつかめん。
挿入位置によってメソッド使い分ければいいじゃんてことが言いたい?
スタックとみなしてる意図のメソッドと、キューとみなしてる意図のメソッドってあるよね とかそんなことだと思う
たまたま何処かでそういうコードを見かけて、unshiftで事足りるのに わざわざinsert使っているのは何故なんだっていうところだろうね。
バグを見つけたらどうしたらいいの?
[BUG] と出て落ちたとか Segmentation Fault したとかならまず検索かな たいていは既に報告してて対処待ち Rubygems みたいな外部ライブラリのバグっぽい感じのものならやっぱ過去の報告とか調べて それでもなさそうなら Rubyforge や GitHub のページのバグ報告あたりに出すといい ただ、断言してもいいけど6割はただの勘違いで、残りのうち3割5部は既に報告済みだと思う どこのどのへんが怪しい動作と思えるのかここで言ってみ 報告のためにはそれなりに体裁とか前提条件とか洗い出さないと対処してもらいにくいけど ここで何か言えばそのためのヒントくらいは出るかもよ
>>665 unshift と書いてあったら俺はキューのようなものだとみなす
キューでもないのに unshift と書いてあったらたぶんキレる
先頭に要素突っ込みたいなら insert 使え
最後に要素突っ込みたいなら << か push 使え
沸点低いなー まあ確かに順番必要ないのにArray使ってる例というのは結構あって
バグの情報はどこにあるの? Googleで4・50件ほど見たけど無かった。 win32でコマンドラインに特定の非ASCII文字を含むディレクトリ名を指定するとワイルドカードが展開されない
>>670 非ASCII文字の中に「表」とかの \ で終わる文字が入ってるんだろ
673 :
デフォルトの名無しさん :2010/01/14(木) 23:06:29
674 :
デフォルトの名無しさん :2010/01/14(木) 23:11:49
Rubyでwebアプリ作るときはcgi使うのとERB使うのと お作法的にはどっち?
どっちもつかわねー、というのが答ではあるが 初心者のうちは全部使って長所短所欠点体に刻んどけという気はする どうせ外に出したりしないだろ
何使うの?
>>670 その「特定の非ASCII文字」が何かによって答えは変わる。
シフトJISにない文字なんじゃないかと思うが如何?
>>644 RackやRackに基づいたもので、普通のCGIは作れるのでしょうか?
調べてみても、mod_railsとかmongrelとかの環境を作らないと
動かせないように見えるのですが...
>>678 できる
できるが、rack/cgi はリリースされても全く動かなかったことがある
(つまり誰も本気でテストしてなかった)というヤな過去があって
つまり誰もやってないんだよね
理屈上はできるし理屈上はRackでやるとキレイなんだけど、
CGI作るということ自体がもうあまり流行らないから
>>671 D:\tmp\r>ruby -e "p ARGV" D:\tmp\r\本/*
["D:\\tmp\\r\\本/*"]
D:\tmp\r>ruby -e "p ARGV" D:\tmp\r\表/*
["D:\\tmp\\r\\表/*"]
D:\tmp\r>ruby -e "p ARGV" D:\tmp\r\漢/*
["D:/tmp/r/漢/新規テキスト ドキュメント.txt"]
漢字の2バイト目が\とか{とか
とりあえずバージョンを書いて
1.8.7p160だと問題なかった
pの出力で日本語が出てることをみると1.9系だと思うが
1.9.1p243だと
>>680 と同じ状態
Dir.glob に渡した時はちゃんと展開されるが
コマンドライン引数を展開する時はダメなんだね
UNIXだとコマンドライン引数のワイルドカードはシェルが展開するから、開発者には気付かれにくいのだろう
昔の1.8は Dir.glob自体がSJISに完全対応してなくて、コマンドライン引数にも同様の不具合があったけど
今回のはコマンドライン引数の時だけの不具合なのか
def set_select_quests for i in 0..9 quest_number = rand(10) @select_quests |= quest_number.to_a if select_quests_flag(quest_number) end end def select_quests_flag(index) return false if @select_quests.include?(index) #・・・@ return true end @で@select_questsに同じ要素が入っている場合falseを返す様にしたいのですが この場合include?(val)メソッドしかないですよね? なんかうまく動かないんですがどこか間違ってますか?
>>682 @select_quests << quest_number if select_quests_flag(quest_number)
かな
>>654 え、うそ!!!1
RubyGemsが遅いのってmswin32版のせいなの???
くっそー今まで散々苦労してきたのにー
確かにcoLinuxとかだとめっちゃ早いと思ってたわ。
mingw版だと早い?、とか
とりあえずgemはバージョンが古かったら サーバ側でバージョンが古いと怒って欲しい
>>685 おう、そういう機能入れたから、rubygem をアップデートしてくれ
というわけで鶏と卵だ
>>682 def initialize
@select_quests = Array.new
...
end
def set_select_quests
(0..9).each.do |i|
quest_number = rand(10)
# @select_quests に quests_number が含まれてなかった場合追加する
@select_quests << quest_number if @select_quests.include?(quest_number)
end
end
>>687 のifはunlessの間違いだと思う冬の朝
rubyはwindowsで動かすとどうして遅いの? ずーと前からみたいだけど直すきないの?
開発者がアウトオブ眼中だから
>>689 なんでWindozeを使ってるの?
LinuxやBSDやSolaris使えばいいだけじゃないの?
文句言ってるだけで何も行動しようとしないのはなんでなの?
692 :
682 :2010/01/15(金) 20:46:00
ありがとうございました うまくいきました
>>689 めんどくさいから
いやマジで
誰にでも絶対に起こるなら直されると思うんだが実際はそうではない
694 :
デフォルトの名無しさん :2010/01/15(金) 20:50:00
WindowsOSがやめられないので、ちょっとずつPythonに移行し始めたよ。 既存のクラスにメソッド追加したり、injectとかがちょっと使いづらい以外不満はない。
697 :
sage :2010/01/15(金) 21:29:39
Pythonたんは、純粋なオブジェクト指向じゃないよね。 len() とか気持ち悪い。
>>697 最初はそう思ってたけど慣れればそんなもんかって思えるよ。
あとは、三項演算子やcase文がないのがちょっと残念くらいなもんか。
>純粋なオブジェクト指向 Rubyも「+」とか「end」はオブジェクトじゃないよね
>699 不完全性定理というのがあってだな
文字列をn文字ずつ&1文字ずつに分割したいのですが x = "ABCDEFGHIJKLMNOPQRSTUVWXY" x = x.scan(/.{5}/) x.collect!{|y|y.scan(/./)} p x =>[["A","B","C","D","E"],["F","G","H","I","J"],["K","L","M","N","O"],["P","Q","R","S","T"],["U","V","W","X","Y"]] みたいに書くと都度、正規表現によるマッチが行われるので遅いです もっと高速に実行する方法があったら教えてください。よろしくお願いします
まあ俺は自分の仕事が片付けばいいだけだから オブジェクト指向の純粋さなんてどうでもいいわ
>>701 x.chars.each_slice(5).to_a とか。
Benchmark.bm で1万回ずつやった時間を比較したら半分弱の時間だった。
>>701 x.split(/.{5}/)
x.split(//)
がたぶん一番速い
これでも遅いという場合はそもそもそんな莫大な配列を文字から作る理由は何というとこから
enumeratorと配列の違いって何ですか? なんとなく大体同じもののように思えるんですが
超巨大な集合から1つずつ取り出そうとしたとき、Enumeratorは全部を 覚えていなくてもいいぞ。 alphabets = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z) alphabets.combination(13).first(5) は造作もないが alphabets.combination(13).to_a.first(5) はたぶんメモリ足りない。
>>706 数えられて、返ってくる順番が保証されないのがEnumerator
Enumeratorを継承してるので数えられて、しかも順番情報を保持するようにしたのがArray
こう考えるとSetの出番がないんだがまあ誰も覚えてないし誰も使ってないと思うので気にするな
>>701 シングルバイト文字限定でいいのかな?
であれば
x = "ABCDEFGHIJKLMNOPQRSTUVWXY"
res = [[]]
x.each_byte do |b|
if res[-1] < 5
res[-1] << b.chr
else
res << []
end
end
で,どうでしょう?
\w は Ruby では元々 [0-9A-Za-z_] という意味のメタ文字だったので、 1.9 でもそうなってる。
713 :
710 :2010/01/16(土) 14:58:14
自己レスです # coding: cp932 "日本語" =~ /\p{Word}/s でいけました。
たしか ¥d が漢数字にマッチしてしまって使いにくくなってたので その種のは使い分けるようになったんだっけ?
>>709 1.9系なら↓でマルチバイトもOK
x = 'あいうえおかきくけこさしすせそ'
res = []
x.each_char.each_slice(5){|a| res << a}
これでもできるな x = 'あいうえおかきくけこさしすせそ'.each_char.each_slice(5).map{|a| a}
Windowsのユニコードのファイル名が扱えるライブラリはありますか?
いやいやいやいや、直接API呼べば問題ないからさ そういうライブラリがrubygemsあたりにでもないかという話だろう でもこれで困るの日本人とかだからなー
720 :
701 :2010/01/16(土) 18:50:38
レスありがとうございます
>>703 の方法が一番早いようなのでこれを使わせてもらいます
721 :
デフォルトの名無しさん :2010/01/17(日) 10:37:45
皆さんはRubyのコードを何で書いてるのでしょう? やっぱり、Emacs or vim? 補完が効くのが良いのですが・・・・
Emacsが無難ということに一応なってはいる 適当な統合環境が快適に動作する環境なのなら、エディタ部のコード書きの補完機能だけ使うのも悪くはない Emacsを一度も使ったことがなくて基本キー操作から覚えなければならないというのだとすれば尚更 Emacsが好まれてるのはエディタの軽さの範疇を実際上は超えてないというのが大きい もしEclipseやNetBeansが超サクサク動作だったならEmacsは時代遅れ度を2段階くらい上げていたはず
Emacsは現代的なIDEが提供するところの補完機能を厳密にはもってない …まあ、実用上はそれほど困らないが
拙者は秀丸でござる。 感謝の意を込めてちゃんと送金したでござる。
Emacs で指がつったら vim も試してみてね by vim厨
>>721 主にNetBeans使ってる。IDE厨なのでw
ただし、NetBeansの最新の6.8はいろいろとバグが・・・
俺もいわゆるスクリプト程度しか書かないからEmacsで十分だな でもたしかにIDEがエディタ同様に軽ければそっち使うかも
通常のエディタでは慣れてくると物足りない(プログラミング初心者は補完のないエディタでやること) IDEはおおむね重いし遅いしプロジェクトとかそんなのが必要な大作ばかり作るわけじゃないから邪魔 というところにすこんと入るのがEmacs 全部できるが余分で煩雑で重い、というものを使うよりは、 やや足りなくて手作業が入るが軽快、のほうを選ぶ人は意外と多い
emacs自体あんまり使わないんだけど、ショートカットキー一発で 全体を整形&フィリング(emacsではこういうのかな)できる設定ないかしら。
あるお。 俺はCtrl-x hとかしたあと、Ctrl+Alt+\を押してる。 フィリング?は知らんけど。
class C def hoge とても長いメソッド... local_var = value #<= ここだけを書き換えたい ... end end メソッド定義内のローカル変数たった一行を書き換えたいんです。 とても長いメソッドなので,class_eval{def...無意味なコピペ...end}をしたくありません。 スパッと書き換えることはできませんか? とりあえずSCRIPT_LINES__とripperを使えば20行くらいでできるのですが, もっとストレートな方法があるかもしれないと思い質問しました。 ちなみにbindingを使った実験には失敗しました。 よろしくお願いします。
Emacs が軽快とか隔世の感、とか言うのは多分年寄り。
今は通信速度が速いから、Emacs も簡単にダウンロードできる。 昔はフロッピーで小分けにして、配布してたな。
>>731 >>736-737 あれ、WindowsだとUNICODEファイル名ダメだったのかー
gemでモンキパッチみたいに簡単にWindowsのときだけOKにできるのとかあったら便利そうだね。
システムの根底だから難しいのかね
>>736-738 ありがとう。だが初心者にはハードル高すぎ
1.9.2に期待しまつ。いつごろ出るんだろ?今年の春頃?
一応「もう出てる」レベルではあるんだが、Windowsでは自力でソースからコンパイルしないといかん rubygemsとかも未対応で動作しない可能性も大きい しばらく前の1.9.1状態 来年くらいには使える状態になってるんじゃないかなあ
なんか直接いじればどうにかなりそうな気はするんだけどねえ
>>730 フィリングってのはこういうの。文章の段落内でESC qでできる。
# ながーーーーーい説明文菜がーーー否がーーー否がーーーーーーーーーーーーーーーーーーーーい
↓
# ながーーーーーい説明文菜がーーー
# 否がーーー否がーーーーーーーーー
# ーーーーーーーーーーーい
んで、ソースコード全体を一発で整形&フィリングしたいのんよ。ruby-modeで。
>>742 見てわからんのならスクリプトがすこし違って詰まったときの対処も自力で全然できないということだから
素直に Ruby の勉強を進めたほうがいいような気がしないでもない
前情報として、Ruby の知識が全然ないのなら使えないよ
MySync GoogleContacts でぐぐると唯一出てくるから、
これをしたい場合は Ruby 上でこれを動かすしかないわけだけど、
まったくの一見さんが使えるようなクオリティにはそもそもなってない
を踏まえて
Ruby を適当にインストール、URL の Download からダウンロードして展開して、
au2gcontact.rb をてきとうなとこにコピー
その後、au2gcontact.rb 自身のファイルの文字コードを Shift_JIS というか CP932 に変換
MySync が吐き出したエクスポートの CSV(Shift_JISに変換済)を第 1引数に、
GoogleContacts に食わせたいファイル名を第 2引数にして、
ruby au2gcontact.rb mysync.csv output.csv
と実行
output.csv は ShiftJIS(というかCP932)だが、
これがそのまま GoogleContacts にでインポートできるかどうかまでは知らない
745 :
742 :2010/01/17(日) 22:53:26
なんかよくわからんまま試行錯誤したら一応の目的は達しました。ありがとうございました。以下俺メモです。 rubyをインストール。 ソース(っていうのかな?)をメモ帳にコピペ。拡張子を.rbに変える。 au2gcontact.rbとaddress.csv(←LismoPortが吐き出すやつ)とgcontact.csvをC:\Documents and Settingsに置く。 コマンドプロンプトからruby au2gcontact.rb address.csv gcontact.csv 出てきたのをgmailにインポートでおk。 いやーすごいですね。感動しました。ほんとありがとうございました。
>>743 Emacs のスレで聞いたら adaptive-fill-mode の使い方なり filladapt.el の後継なり
何か情報が入るんでない?
乗り遅れた感あるけど vim+neocomplcacheでやっとります。
> rubyはwindowsで動かすとどうして遅いの?
Ruby 1.8.7-p174 の select が遅かった話じゃなくて?
http://www.garbagecollect.jp/~usa/d/200909c.html Ruby 1.8.7-p249 にすれば直るよ。
> たしか \d が漢数字にマッチしてしまって使いにくくなってたので
Ruby 1.9.1 の初期はそうだったんだけど、この挙動はバグ扱いされて修正されたので、
Ruby 1.9.1-p378 にすれば直るよ。
749 :
742 :2010/01/18(月) 09:33:49
追記。適当なソフトでau2gcontact.rbの文字コード変換をshift jisに変換。
puts "日本語".inspect とすると、"¥123¥456" みたいな表示なりますけど、これを "日本語" のままで表示させることはできませんか。
1.8.7 mswin32の場合 irb(main):001:0> puts "日本語".inspect "\223\372\226{\214\352" => nil irb(main):002:0> $KCODE = "s" => "s" irb(main):003:0> puts "日本語".inspect "日本語" => nil
-Kオプションの方がわかりやすいかもしれないと思い直した >ruby -Ks -e'puts "日本語".inspect' "日本語"
753 :
739 :2010/01/18(月) 18:25:32
1.9.2 preview1で試してみたけどダメだった
だからそういうふうにそもそも作ってないんだから標準で用意されたメソッドをどう使おうと絶対に駄目だって
火急的に困ってる人がいないんだろうね 見なかったことにするわけにもいかんと思うんだが、代替手段は何なのだろう そこだけRubyを使わない?
1.9.2で扱えるようになるかも、ってことらしかったんで
757 :
デフォルトの名無しさん :2010/01/18(月) 20:21:42
#!ruby -Ku require 'win32ole' WIN32OLE.codepage = WIN32OLE::CP_UTF8 fso = WIN32OLE.new('Scripting.FileSystemObject') a = fso.CreateTextFile("♡♥♡♥.txt", true) a.WriteLine("This is a test") a.Close()
笙。笙・笙。笙・.txt というファイルができました先生
u
環境とエディタによってはこのへんきちんと動作するように保存するのは微妙に難しいぞ 慣れればどうということもないんだが
おお! できました!! ありがとうございます!!! これどうすればIOやDirで扱えるんですか?
>>761 扱えない
全部 WIN32OLE 内で完結させる必要がある
必要なのは Ruby の知識じゃないね
ですよねー...
最初と最後にリネーム処理かませば Ruby から扱うのも不可能ではないと思う
先生質問だよ質問 data = {/key/ => lambda{|m| "<#{m}>"}} … data.each_pair do |re, p| file.gsub!(re){|m| p.call(m)} end p file #=> key が <key> になってる というような、 {正規表現 => キーのマッチ結果を便利に利用した結果の返り値またはただの文字列} というデータを用いた連続置換をしたいのです それで、data は外部から自由に与えたいのです でも、よく考えたら lambda を作った時点では gsub の $1 も \1 もまだ無いから利用できないわけで なにかうまい方法ないですか eval ならなんとかなると思ったんだけど普通の置換後に使いたいだけの文字列も eval してしまいます
>>765 m = Regexp.last_match
puts m[0]
とかでできないかな?
あと
data.each_pair do |re, p|
file.gsub!(re, &p)
end
でいいような気がするけど試してはいない。
こういうことだろうか。 to = data.each_pair.inject(from) {|result, pair| result.gsub(pair[0], &pair[1]) }
これではどう? a = 'abc def' data = [['(\w+)', '<\1>'], ['(> <)', '> < \1 > <']] data.each{|reg, rep| a.gsub!(/#{reg}/, rep)} a => "<abc> < > < > <def>"
>>768 なにそのわかりやすくしようとする気概をぜんぜん感じない例
>>765 766-768が書いているようにgsub!の第2引数で置換パターンを書いたほうが
単なるstringでパターンを渡せるので簡単だと思う
766,767が書いてるパターンの前の '&' って
どういう意味?
なるほどProcを渡してるのねthx 俺には768の方がわかりやすいな、例は見づらいが
だって先生が gsub はブロック使えって言ったんだもん言ったんだもん言ったんだもん
>>766-768 irb> data = {/k1/ => 'v1', /k(2)/ => 'v\1', /k3/ => lambda{|m| m.sub(/k/,'v')}}
irb> str = 'k1, k2, k3'
irb> data.each_pair do |re, p| p.kind_of?(Proc) ? str.gsub!(re, &p) : str.gsub!(re, p) end
irb> p str
"v1, v2, v3"
思ったことに近いことができましたーうおー
助かりましたせんきゅうです
1byte文字以外をマッチする方法を教えてください s="123123456456" s.gsub!(/〜/){|c| uni_enc(c) } p s => 123%uFF11%uFF12%uFF13456%uFF14%uFF15%uFF16 みたいに1byteじゃない文字だけ変換して置換したいです よろしくお願いします
$KCODE='s' s="123123456456" s.gsub!(/./){ |ch| (ch.length==2) ? "(#{ch})" : ch } puts s;
1バイトじゃない文字だって言ってるのにわざわざ2バイトをチェックするとはこれいかに
# coding: sjis # Ruby1.9以降か正規表現エンジンに鬼車を使用 s="123123456456" s.gsub!(/[^\p{ASCII}]/){|c| "%u"+c.encode('utf-8').ord.to_s(16) } p s
test = {"うし"=>5, "うま"=>3, "うし"=>1, "うし"=>2, "うま"=>4} test.each{|key, val| } これを実行したら最後二つの"うし"=>2と"うま"=>4しか処理が実行されないんですが キーの要素が一緒だと前にある奴は消されてしまうんですか? またこれをハッシュの数分だけ実行させることはできないんでしょうか?
>778 ハッシュの意味を勉強してこい
配列の配列を使う方法 test = [ ["うし", 5], ["うま", 3], ["うし", 1], ["うし", 2], ["うま", 4] ] test.each {|k, v| use(k, v) } 値が配列になったハッシュを使う方法 test = {"うし"=>[5, 1, 2], "うま"=>[3, 4] } test.each {|k, a| a.each {|v| use(k, v) } }
文字列 a0-0 a0-1 a0-2 a0-3 a1-0 a1-1 a1-2 a1-3 a2-0 a2-1 a2-2 a2-3 から任意が選ばれた配列a a=["a0-0","a2-2","a2-3"] より、 配列bを作成したいのですが、 なにか良い方法はないのでしょうか? b=[[1,0,0,0],[0,0,0,0],[0,0,1,1]]
只今から上位エスパー召喚の儀を執り行う
"a0-0" → [1, 0, 0, 0] "a2-2" → [0, 0, 0, 0] "a2-3" → [0, 0, 1, 1] という対応があるように見えるのだが、2つめは [0, 0, 1, 0] ではない? どういうルール?
こうだな a=["a0-0","a2-2","a2-3"] b = Array.new(3){ Array.new(4, 0) } a.each do |x| if /a(\d)-(\d)/ =~ x b.push[$~[1].to_i][$~[2].to_i] = 1 end end p b #=> [[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 1, 1]]
787 :
785 :2010/01/19(火) 18:00:44
ごめん。こうだったね。 > b.push[$~[1].to_i][$~[2].to_i] = 1 b[$~[1].to_i][$~[2].to_i] = 1
>>783 a0-0 は配列aにあるから 1
a0-1 はないから0
a0-2 はないから0
a0-3 はないから0
これにより[1,0,0,0]です。
a2-0 はないから0
a2-1 はないから0
a2-2 はあるから 1
a2-3 はあるから 1
これにより[0,0,1,1]です。
このようなルールです。
>>785 ありがとうございます。
この方法で問題なく解決しました。
こういう3択クイズで選んだ結果をファイルに出力して、解答ファイルと照らし合わせる場合 どうすればいいのでしょうか? require 'cgi' c = CGI..new hoge = c["va"] print "Content-type: text/html; charset=EUC-JP\n\n" print "<html><head><title></title></head><body>\n" print "<p>" if hoge == 1 print "<p>問題1</p>\n" print"<form method=\"POST\" action=\"./test.rb\">\n" print"<input type=\"radio\" name=\"va\" value=\"2\">ア print"<input type=\"radio\" name=\"va\" value=\"2\">イ print"<input type=\"radio\" name=\"va\" value=\"2\">ウ print"<input name=\"ok\" type=\"submit\" value=\"OK\">\n" print"</form>\n" elsif hoge == 2 略 end print "</p></body></html>\n"
>>790 Rubyは基本、HTTPのクエリ文字列とかを隠蔽しない
そのときどんなデータがどのように送られてくるものなのか、HTTPの勉強をするといいぞ
>>791 ありがとうございます
勉強して何とかやってみます
>>791 事実だから仕方ないが、あんま威張ることじゃないけどねえ
Railsで作ってRailsで表示してRailsで受け取れば抽象度高くできそうだが、もうCGIではないな
そりゃ言語としてWEBだからって何かするのはPHPくらいだろう。
あほまるだし
質問です! 文字列を受け取ってスペースと記号を削除した文字列を返すメソッドを作りたいんですが どうすればいいでしょうか? ちなみに条件はgsubメソッドをつかうこと 記号は全角も半角も含む(","とか"。"とか"?"とか"?"とか) どなたかお願いします
>>797 スレ違いでしたね
すいません
わざわざありがとうございます
RDEは軽いからお手軽なGUIのirbみたいなイメージで 自作メソッドとかの動作確認的な風に使うな
railsを勉強しようと思うんですが、初心者向けで お勧めの本はありますか?あるいは、これは読んで おくべき本でも構いません。 Webでいろいろ読んだのですが、modelのassociation やAjaxが難しく感じました。
Railsの初心者スレってありそうでなさそうで需要ありそうだがやっぱめんどいからなしで
質問いいでしょうか? Ruby 1.8.7にて、ブロックつきメソッドの呼び出したブロックの返り値を得たいのですが、 ブロック内で return "UNKO!!" すると、 unexpected return (LocalJumpError) と言われます。 break "UNKO!!" では問題ないようなのですが、これはこういうものなのでしょうか?
>>804 紹介ありがとう
とりあえずそれらと公式サイトで始めてみます
>>805 トップレベルでreturn使っていない?
def f(a)
a.each{ return 1 }
end
a = [1,2,3]
f(a) # これはだいじょうび
a.each{ return 1 } # でもこれはダメ
808 :
805 :2010/01/20(水) 17:50:49
>>807 ありがとうございます。
エラーでない方法をお聞きしたいというよりも、もう少し具体的に聞くべきでした。
こちらの期待する動作としては、
”UNKOoooooooOOOO!!”と”f is finisheeeeeeeedddddd!!111”ともに表示させたいのです。
breakの代わりにreturnだと”f is finisheeeeeeeedddddd!!111”が表示されませんよね・・・?(fから抜けてる?)
実際のコードではa.eachではなくeachの代わりに自分で定義したブロックを必要とするメソッドを呼び出してます
def f(a)
puts a.each{ break "UNKOoooooooOOOO!!" }
puts "f is finisheeeeeeeedddddd!!111"
end
a = [1,2,3]
f(a) # これはだいじょうび
#a.each{ return 1 } # でもこれはダメ
breakはブロックの脱出、returnはメソッドの脱出ってこと だからそのfの中でretrunを使ったら内部ブロックでだろうとfを脱出する 同様にこれも無理 def f break end f
ある案件で始めてRubyをいらうことになったのですが、 訳がわからず困っています。 取り合えず、"RailsによるアジャイルWebアプリケーション開発”のT部 HelloWorldプログラムを作成して動かすまでを試してみて、 ああ、PHPでSmarty使ってMVCモデルで作成するのを自動、徹底 してる感じだなと思い、そのまま本チャンプログラムに挑みましたが・・・ ・まず、.rhtmlがTopページしかなく、MVCとも.jsファイルばかり。 ・ブラウザに表示してソースコードを見てみると、1万行近い ソースコードで表示と一致していない。 ・ブラウザのURL表示がページ遷移しても常に一緒。 と、始めて見る構成でした。 私のRubyの理解が足りないと思い、U部以降を読み進めようと思いましたが このプログラム構成が特殊だから、参考書読み進めても効果は薄く それよりプログラムの解析を続けるべきでないかと思い直しました。 皆さんに質問ですが、こういった構成は一般的なのですか? それなりにある手法ならば、読むべき参考書、検索のキーとなる 単語を教えていただけたらと思います。 要領得ない質問ですみませんがお願いします。。。
812 :
sage :2010/01/20(水) 18:20:39
せめて日本語で頼む。
これは俺でも煽る 直前読めずにスレのルールすら理解できないようでは駄目だろうな
815 :
810 :2010/01/20(水) 18:51:22
>>814 >関連スレやURLは
>>2-5 あたりを見てください。
>Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
これですか?
もっと詳細に質問すべきだったのかもしれませんが、
個々のプログラムの質問以前に全体として???だったもんで。。。
>>810 ,813
つまり、初心者レベルでないから私には到底無理ってことですか?
それならそれで上にそう報告しますので助かります。
それでもやれって言われそうですが・・・。
逆に、参考書読んだらわかるようなことを質問するなというのであれば
すみません。
参考書、全部読んでみます。
取り合えず、初心者参考書レベルの問題なのかだけでも教えて下さい。
>>815 君が書いてる質問の中に、Rubyそのものに関する話題は一切ない。
Railsスレへ行きなされ。
>>813 が書いてるのは、たぶん、Railsスレへ行けということが示されてるのに
わざわざ餌を撒いてここに君を留まらせた罪が重いってこと。
817 :
810 :2010/01/20(水) 19:13:22
>>816 そうですね。。。
すいません。
Railsスレにいきます。
スレ汚し失礼しました。
>>817 読んでないことを期待するが、40パーセントくらいしか悪くないのでそれほど謝る必要はない
残り40パーセントは
>>804 で、残り20パーセントはたまたま重なったタイミング
>>808 eachごとの結果がほしいのなら
ブロックの外で定義した配列に
欲しい結果を入れておく。
またはブロックのto_aとか
701へのレス703, 709参照。
820 :
804 :2010/01/21(木) 10:54:34
俺の名誉のために言っておくが、
>>810 の言っていることは、
"RailsによるアジャイルWebアプリケーション開発”のサンプルコードの話じゃなくて、
>>810 が取り組んでる仕事のコードだと思うぞ
821 :
804 :2010/01/21(木) 10:55:31
822 :
805 :2010/01/21(木) 10:56:56
ありがとうございます!
>>809 > breakはブロックの脱出、returnはメソッドの脱出ってこと
ああ!それです。まさにその1行が聞きたかったのです。
俺はもっとよい聞き方を憶えないといけないな・・・
こうして
>>804 はプライドも外聞もズタズタになったのであった。
824 :
デフォルトの名無しさん :2010/01/21(木) 12:57:39
1. ruby -e 'puts ARGF.read' file.txt 2. ruby -e 'puts $<.read' file.txt 1.の文では正しくfile.txtの内容が表示されるのですが、 2.の文で「指定されたファイルが見つかりません。」と怒られます。 リファレンスマニュアルの$<の項には 「つまり定数 ARGF の別名。 」 と書いてあるので、 1.と2.で同じ結果を期待したんですけど。 どこが間違ってるんでしょうか? Ruby1.9.1でOSはWindowsXPです。 よろしくお願いします。
あ,自己解決しました。 Windowsの<とか>とかってエスケープするか ""で括らなきゃいけなかったんでした。 1. ruby -e "puts ARGF.read" file.txt 2. ruby -e "puts $<.read" file.txt または 2. ruby -e 'puts $^<.read' file.txt なら同じ結果になりますね。 スレ汚しスマソ。
>>824 「指定されたファイルが見つかりません。」を出してるのは実はcmd.exeだ
「<」を誤認識してる
ということで cmd.exe から < をエスケープすればよい
cmd.exe のエスケープ文字は ^ だから、
ruby -e 'puts $^<.read' file.txt
827 :
816 :2010/01/21(木) 14:12:27
別に810や804を責めたいわけでもないんだが、質問と回答は 適切な場所でやった方がいいよ、ってことで。
>>826 すみませんすみません
ありがとうございました。
>>810 >・まず、.rhtmlがTopページしかなく、MVCとも.jsファイルばかり。
>・ブラウザに表示してソースコードを見てみると、1万行近い
> ソースコードで表示と一致していない。
>・ブラウザのURL表示がページ遷移しても常に一緒。
> と、始めて見る構成でした。
これはAjaxでページを作ってるんだろう。Railsうんぬんはさほど関係ない。
> 私のRubyの理解が足りないと思い、
いや、JavaScriptやAjaxの知識が足りないだけだと思う。
riっていらないよね
rubygem パッケージマニュアルとしての ri に関しては、「とりあえず入れておく」というようなもんでもないな既に 現時点で ri を利用してないのなら、 --no-ri で飛ばしてOK 基本的にロクなこと書いてないしソースを grep したほうがおおむね速いので、rdoc もなくてもいい rdoc がきっちりしているライブラリのみ、マニュアル読む機会があるときだけ rdoc コマンドで構成するか、 あるいはネットで公開されてる rdoc を読めばいい
refeはいるけど、riはいらない
デフォで--no-ri -no-rdocしても特にデメリットはないね インストール速いしディスクアクセスも少なくて済むしいいことだらけ
俺は.gemrcに書いたが、デフォルトでそうであれ、とまでは思わない。
自分の作るライブラリにはRDocをていねいに書く 自分がインストールするライブラリではrdocは使わない
日本語でいいならコメント書くんですがー
>>837 あちらさんの使ってるフォント自体に日本語文字がないから、本気で表示が崩れるぞ
外国語の文字も適当に表示できるフォントの認知度が高いのは日本くらいだ
とりあえず日本語でコメントを書きまくり、英語の得意な人がプロジェクトに参加してくれることを祈るというのはどう 英語でコメント書くの大変だって言うような人が作るライブラリなんて、どうせ最初に使うのは日本人が主だろうしさ
そうだな、とりあえず日本人向けオンリーででもまず本体クオリティ上げるのが第一かもしらん 英語ドキュメント書けないからと言って諦めるのはもしかしたら勿体無さ過ぎるかもしれない
質問です。ある1つのディレクトリ内にあるファイルを更新時間順にソートしてファイル名を連番(数字のみ)にしようと以下のコードを書きました。 def consecutivenum(path) i = 1 files = Dir.glob("#{path}/*").reject{|name| FileTest.directory?(name)} files.sort{|a, b| File.mtime(a) <=> File.mtime(b) }.each{|name| File.split(name)[1] =~ /.+(\..+)/ File.rename("#{name}", "#{File.split(name)[0]}/#{i}#{$1}") i += 1 } end 実行するとファイルが消去されたりコピーされたりしてしまいます。 試しにDir.glob(#{path}/*)だけを実行したところ、存在しないファイル名が混じっていました。 また、そのファイルをFileTest.exist?に送るとtrueが返ってきます。Windowsの隠しファイルでもありませんでした。 何がどうなっているのかさっぱりわかりません。OSはVistaでRubyのバージョンは1.8.7です。 ご助力よろしくお願いします。長々と失礼しました。
> 存在しないファイル名が混じっていました 存在します または、UNICODEファイル名です UNICODEファイル名だった場合、Rubyから扱うことはできません
てか存在しないファイル名とか教えてくれりゃ結構一発だったり
察してください、まで読んだ
>>842 >>843 ファイル名ですが、エクスプローラーやコマンドプロンプトのdirで確認できずにrubyで検出されたのは
6.jpg
2.ini
の二つです。
846 :
841 :2010/01/23(土) 00:29:59
本当に存在しないファイルなの? そのディレクトリで system('start 6.jpg') ってやればjpegに関連付けられたアプリで 6.jpg が開くから確かめてみたら?
あとは dir /x とか
>>847 6.jpgについてはエラーが出ましたが、2.iniは開かれました。
>>848 6.jpg、2.iniいずれも出ませんでした
2.iniがでてきたってことは、ファイル自体はあるってことだよね? でもdirでは出てこないのか・・・謎だ・・・ require 'win32ole' fso = WIN32OLE.new('Scripting.FileSystemObject') fso.GetAbsolutePathName('2.ini') とかしてみたら?
>>850 さきほどまでのフォルダではなくtempフォルダのパスが出ました。
今度はそのtempフォルダで start 2.ini を実行しましたが開かれず、dirでも見つかりませんでした
とりあえずスクリプトに $KCODE = 'SJIS' を付けて実行してみるべき FileSystemObjectで見えているパスはWindowsで見えているパスなので fso経由で2.iniが見えているのにdirで見えないのは、ちょっと不思議
$KCODE = "SJIS"を付けてみましたが特に変わりないようです
(ただ、コンソールの作動場所のせいかスクリプトの保存場所のせいかまた別のパスが返ってきましたが)
>>850 のスクリプトはなにを意味するのですか?2.iniの代わりに適当な文字列を入れてもパスが返ってくるのですが・・・
まだいるかな? attrib *.* はどう?
なんかの拍子にシステムファイルになったんじゃない? フォルダオプション→表示→保護されたオペレーティング〜 のチェック外してみ
dir で出てこなくて dir /a で出てくるなら 存在はしてるけど何らかの属性がついてて、そのせいでエクスプローラーに表示されないだけだな
857 :
デフォルトの名無しさん :2010/01/23(土) 15:10:59
./hoge.rb を実行するときに例えば ./hoge.rb --debug のようにしてデバッグモードにして そのときだけ状態メッセージを print するためにはどのようにするのは ruby 的にエレガントでしょうか?
もはやRubyとは関係ないな
>>857 読み手にとっていちばん妥当なもの
require 'logger'
@log = Logger.new(@logfile||$stdout)
@log.debug "debug log message" if @log
書く人が楽だがメソッド名に独り善がり感またはどや顔が滲み出たもの
def D(msg)
return unless @debug_output
@debug_output << msg
@debug_output << "\n"
end
@debug_output = $stderr
D "debug log message"
後者のタイプで def LOG(msg) を時々見る
>>859 ありがとうございます!
後者のDをDoyagaoとして使いたいと思います(違)^A^K二つの視点から例を出していただきとても参考になりました!
どこにだよ tempか? 最初のフォルダの中のファイルは全部連番に変わったのか? tempのファイルも全部か?
863 :
デフォルトの名無しさん :2010/01/23(土) 21:43:18
ブロックスペシャルファイル(readするとバイト列が得られます)の長さを 調べたいのですが、実際にreadすることなしにこれを実現する方法はありますか? パッと思いついたのは、openしてからファイルの末尾にseekして 先頭からのpositionを得るという方法ですが、他にはありますか。
864 :
863 :2010/01/23(土) 21:46:20
例えばこんな感じです: File.open("/dev/sda") do |io| io.seek 0, IO::SEEK_END io.pos # /dev/sda のバイト列の長さ end
関数の外で@も@@も付けずに定義した変数はいったいどこに保存されるのでしょうか? x = 10 def func x = 20 end func puts x #=>10 これがxが20にならないので、最初に定義したxはグローバルには見えないどこかに閉じ込められてるのかな。
>>863 完全にUNIX/Linuxプログラミングの話題じゃまいか
>>866 を、Rubyで実現するにはどうすればいいですかという話だろう
>>865 変数のスコープという概念を勉強してくれ
ごく端的に説明すると消えるというか、スコープを抜けるとアクセス不可になって取り出す手段がなくなる
def の「中」のローカル変数は def の「外」からはアクセスできない
だからメソッドの引数で「中」に入れてメソッドの返り値で「外」に出す
File.statでサイズ読めないかね
俺もそうおもた
871 :
863 :2010/01/23(土) 22:03:17
>>869 やってみたのですが size = 0 になっています。
statコマンドで調べても0バイトになっています。
そもそも、ブロックスペシャルファイルのバイト列の長さって、デバイス依存な気がします。
つまり「ファイルサイズ=バイト列の長さ」は成り立たない、ということかも知れません。
$ sudo ruby -e "p File.stat('/dev/sda')" #<File::Stat dev=0xe, ino=5003, mode=060660, nlink=1, uid=0, gid=6, rdev=0x800, size=0, blksize=4096, blocks=0, atime=Sat Jan 23 18:12:33 +0900 2010, mtime=Sat Jan 23 18:12:33 +0900 2010, ctime=Sat Jan 23 18:12:55 +0900 2010>
873 :
863 :2010/01/23(土) 22:06:31
>>872 ふむ、、やっぱり size = 0 ですね。。
バイト列の長さがデバイス依存(つまり不定値)なのは、よく考えてみればわかります。
/dev/null は常に長さ0ですし、/dev/zero は無限大。
難しいです。。
そもそもなににつかうん
やっぱりUNIXスレで聞いたほうがいいと思うんだ カーネルとファイルシステムの知識が必要だし Ruby初心者スレで聞くような話題じゃないよ
876 :
865 :2010/01/23(土) 22:18:31
>>868 ありがとうございます。
ただ、自分が不思議に思ったのは、外から関数内の変数にアクセスできないことではなく、
関数の外の変数に内側からアクセスできてないことです。
一般的に内側から外側の変数にはアクセスできると思うので。
x=20の段階で、外側の変数に代入するのではなく、新しい変数を作ってしまっているのが不思議なんです。
>>876 変数のスコープという概念を勉強してくれ
878 :
863 :2010/01/23(土) 22:19:06
>>874 LVM の論理ボリュームのスナップショットを自動で作成しようかと。
ただし、論理ボリュームの大きさが:
・Xバイト以下だったら、それと同じ大きさのスナップショットを作成
・Xバイトより大きければ、Xバイトのスナップショットを作成
という処理をしたかったのですが、論理ボリュームの大きさを調べるために
外部のコマンドに投げるのは嫌だったので、どうせならデバイスファイルの中身の大きさを調べちゃえ、みたいな感じです。
>>875 すみません、そうします。
カーネルの知識はありませんが。。
はいさよなら
>>878 わあそれはRuby標準では無理だ
そのように動作するようなロジックを知っている上で、Rubyでそのまま記述する必要がある
fdisk -l /dev/sda とかやってみると、ディスクの大きさが表示されるね。 Cで書かれているから読んでみれば分かるかな? ioctlに投げているのかも知れないが、詳しくはわからん。
Ruby
>>875 関数は単なるブロックとは違うよ
x=1
if true
x=2
end
puts x
これなら2が出力されるけど。ごっちゃになってるんじゃないかな
if true then x='foo' end puts x #=> 'foo' ruby1年も使ってるのにこれ知らなかったw if文ってスコープ作らないのか
>>886 変数宣言がない言語は一般的に、if文やwhile文では変数スコープを作らないんじゃないかな。
PHPやpythonも作らないし。
Perlはmyが、JavaScriptはvarがあるから作るけど。
>>887 こういう、わざわざ初心者を混乱させるような書き方するやつって何なんだろうね。
いやJavaScriptのvarは関数スコープだぞ ブロックスコープはlet(Javascript1.7)
JavaScriptの関数スコープは本当にキモい x = 10; // var 宣言していないのでグローバル変数 function tmp() { alert(x); var x = 20; } alertで表示されるのは 'null' なぜなら『関数』スコープだから 関数内でローカル変数が宣言されているので グローバル変数がシャドウイングされる でもまだ未定義なので 'null'
js廚がアフォなのがよくわかるスレw
なぜRubyスレにjs厨がw なにがアフォなのかわからない俺には 釣ることもできんがwww
>>888 > こういう、わざわざ初心者を混乱させるような書き方するやつって何なんだろうね。
制御構造はスコープを作らない
ifは制御構造だからスコープを作らない
ブロックは制御構造ではないからスコープを作る
>>893 最初からそれを書けば文句言われなかったのにね
>>888 混乱というが、値を返す式であるということは知っとくといいこともあるかもよ
>>895 なるほど
x = if true then a = 'foo' end
p x #=> "foo"
で、この後
x = if x == a then puts x end
だと
p x #=> nil
で1.9.1の
x = if x == a then p x end
だと
p x #=> "foo"
うむ、わかりやすいなw
なるほどわからん
>>894 ifが文ではないとしたら何なのだろうと考えないのかね
初心者には暗黙の了解の部分が分からないんだよ だから書かないと
900 :
デフォルトの名無しさん :2010/01/24(日) 13:22:59
文と式って何が違うの?
わかりやすいwww if if if true then a = true end then a = false end then else a = 'foo' end p a #=> 'foo'
>>900 難しい質問だなw
返値があって代入の = の右に書けるのが式、ぐらいの理解でいいと思う
>>900 式は他の式の一部になれる、文の一部にもなれる。
文は文の一部にはなれない。
ただし、文は括弧で囲むと式になり、式は(ry
Ruby ではかなりあいまいなので、C の場合、 値があるのが式、値がないのが文 セミコロンを付けて文(式文)になるのが式 文は {} で囲んで複文という文になる
>>899 暗黙なんかじゃない
制御構造だとマニュアルにも書いてあるし、解説も多くがそのように言うはずだ
if文なんて書いてあったら焼き捨てろ
と書くとオフィシャルマニュアルの古い部分の記述が焼かれていい感じだが
ポリシー無しにかかれてた時代のはどんどん置き換えるべき
loopは制御構造じゃなくてただのブロックつきメソッドなんだよね
907 :
デフォルトの名無しさん :2010/01/24(日) 13:55:52
「if」「制御構造if」「if制御構造」「if〜end」「if式」 このへんがやっぱり妥当 制御構造ifとかなんか続編のゲームっぽいが 「if文」があまりよくないのは「文は値を返さない」というのが全言語間で「なんとなく」共有されてるから 発言者が if は値を返すというのを理解していない可能性を仄めかしている レシーバ無しメソッドが関数と根強く呼ばれるのと同じようなイメージ
>>887 がじゃあ何なのかを書かなかったことがこの流れの始まり
発火点が主因が給油点が主因かというのは太古の昔から輪廻のように繰り返される議題でありまして
>>890 『未定義』だと宣言済みなのと訳わからなくなるから
『未代入』の方がいいかも
>>908 同意
更にRubyのifは値を返すし
つか文なんていうからわかりにくいんだよ ステートメントなら返却値がないのは当然だってわかるだろ
914 :
デフォルトの名無しさん :2010/01/24(日) 14:29:47
String x, Array yに対して x % y って何を表してんの?
>>914 String#%調べれ
Stringのインスタンスメソッド%だ
x.%(y) だな
んじゃ正確に言えば Javaではif文 rubyではif式 と呼ぶ。 この認識であってるのかな? というか皆そんなことまで考えて言葉選んでたのか。 自分の適当さ加減に気付かされた気がする
皆そんなことまで考えて言葉選んでない
>>916 if 式というか、Ruby の if は他の C のような言語とは違って式として機能する、が正確
それを踏まえて if のことを if 式と呼ぶか if 文と呼ぶか if とだけ呼ぶかは自由
とりあえずは、Ruby の if は値を返すということだけ憶えてもらえればいい
他にはどういうのがあるのかな、と思ったときには「制御構造」という分類呼称を思い出してくれ
これに分類されるものはいわゆる後置 if のような修飾子以外、式で値を返す
それと、当初の話題だったはずなのに既に忘れ去られてるがスコープを作らない
時々言われてるのは「while true はスコープを作らないが loop はスコープを作る」だが
これは単にブロックつきメソッドであるかどうかの違いに過ぎない
loop は制御構造ではなく関数的メソッド、つまり Kernel#loop で、each がスコープを作るのと完全に同一の理屈
>>917 そりゃ君だけだ
>ruby -ve "def self.if;p 'if_method';end;self.if" ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32] "if_method" 奥が深い
parse.y で stmt なら文、expr なら式
RHGを何度読んでも分からない。 青木さんは天才なんだおる。
なんだっていいんだよ 話し手も聞き手も意味が分かってれば
『せっかくだから、俺はこっちのifが式なRubyを選ぶぜ』 少なくとも俺はそこまでの域には達してないw 読み書きするときに留意はしてるけど
>>922 いちいち単語ごとに相手も自分と同じ認識をしているか
確認するのはメンドクサイ。
かといって曖昧にすると情報に齟齬が発生する
だから定義をつくる事と定義を守る事と定義を周知する事は大事だと思う
スコープの話をしているところにifブロックと言ったとかならともかく 返値が関わるような話なんてしてなかったところでぐだぐだするのは まるでグローバル変数みたいだな
>>922 それは1行目と2行目に繋がりが見えない
なんだっていいなら意味の疎通は不問だろう
意味意図が通じるのが第一なら表現は一考されるべき
名前重要
you = if 'neet' then 'fuck' else 'good' end 三項演算子要らないんだな
オイオイ、それじゃみんなfuckだよw Cっぽく書きたい人のためにあるんだろうな > 三項演算子
if then else end って書くのがRubyっぽいのか?
1.9が広がりきってないうちに 9と8で結果の違うことをコードに入れたくないね
>>930 うん、まあ、一応は
一応は、ね
条件演算子はそれこそメソッド引数やらリテラル埋め込み記述やらに使う
短く見やすく記述できることがウリだが、実用上はカッコ連打で結構微妙な状態に陥ることが多い
「どうせ来週の版では記述増えてifに置き換わってるんだから最初からifで書こうぜ」みたいな感じはなくもない
Rubyは文も値を返す。
返せないのは制御を返さないreturnとかbreakとかだけ。
という意味で
>>907 に引用されている文が一番正確。
いやそれはRubyはナニを文と呼んでるかという自己問題が
>>931 変わってるのはブロックのスコープで、if関連は変わってないのでは?
もう全て式でいいや 余計分からなくなってきた 責任取ってくれ
本スレだと思ったら初心者スレか・・・
初心者を馬鹿にすると初心者に泣く
初心者のころからきちんと式とスコープを勉強しておけば混乱することなんて全くないんだよ 初心者のうちに式とスコープを勉強しようとすると混乱してわけわかめになることについては責任もたん
942 :
デフォルトの名無しさん :2010/01/24(日) 22:15:59
stripだとASCIIしか除去してくれないけど いわゆる全角スペースも除去するにはどうしたらいい? utf8のスペースが" "と" "しかないなら sub /^[\s ]+/, "" て書くけど…
おっと、 U+200B ZERO WIDTH SPACE U+FEFF ZERO WIDTH NON-BREAKING SPACE (別名BYTE ORDER MARK) は[[:space:]]で認識されなかった。
>>841 です
>>862 2.iniはtempではなく最初のフォルダにありました
>>850 の
require 'win32ole'
fso = WIN32OLE.new('Scripting.FileSystemObject')
fso.GetAbsolutePathName('2.ini')
を実行しましたが、'2.ini'を適当な文字列にしても、スクリプトの実行場所にあるファイルとしてpathが返ってくるのでいまいちよくわかりません。
>>841 を何度か実行しましたが、毎回いくつかのファイルが削除されていき、たまにコピーされて数が増えているのもあります。
うまく連番になるときとならないときがあります。
送り幅ゼロだと「スペース」と名乗っててもspaceじゃないわけだ
バイトオーダーマークがヒットしたら困るだろ常識的に考えて
>>930 式 ? 真の時 : 偽の時
式 and 文
式 or 文
文 if 式
文 unless 式
if 式
then 文
else 文
end
if 式 (then)
文
else
文
end
unless 式 (then)
文
end
たくさんあって、悩むw
外からクラス変数にアクセスするにはどうすればいいのでしょうか? インスタンス変数ならattr_accessorがありますが、クラス変数の場合は自前でゲッターメソッドを定義するしかないのかな?
>>951 オブジェクト外から内部の変数にアクセスする仕組みというのはRubyでは全く存在しません
メソッドの返り値に明示的に指定します
なお、アクセサのある言語からきた人を上っ面だけ騙してRubyを嫌わせるために
def hoge
@hoge
end
と3行書く代わりにattr_reader :hogeと書けるという短縮形が用意されています
attr_* は Ruby1.9 で消えると思ってたんだが意外としぶといな
>>952 ありがとうございます。
インスタンス変数の場合はattr使うのは分かるのですが、クラス変数にはそういう文法が無いのですか?
その都度自前でゲッターを作るのですか?
>>953 消えるわけ無いだろ…ほとんどの既存プログラムが動かなくなる。
Railsとかフレームワークでもごりごり使ってるのに。
>>954 > インスタンス変数の場合はattr使う
だから使わないんだって
あーうん、attr_* は初心者は使わないのがいいぞ
>>951 みたいに混乱するからさ
やっぱなくしたほうがいいと思うなあ
本物のアクセサとしての機能を提供してるわけじゃないし
(セッターとゲッター設定したのに○○できません、はもうお約束)
内部変数と同じ名前のメソッドを提供するということにどれほどの意味があるのか
内部変数関係なく、わかりやすい名前と使いやすい引数のメソッド作れよ
>>955 俺の作ってるライブラリは動くぞー
attr系はひとつも使ってない
「rdocでの扱いがキモいから」という理由が主だが
attr系が無くなるのは個人的には非常に困る てか、使いまくってる
ごちゃごちゃした実装を綺麗に一から作り直してくれるなら互換性が全くなくなってもいい Railsプロジェクトは異常なほど開発サイクル早いからすぐに対応するだろう ruby2.0を作ろう
961 :
デフォルトの名無しさん :2010/01/25(月) 22:39:42
>>954 まずクラス変数自体あんまり使わない
それでもクラス変数のアクセサメソッドを作りたいんだったら手で書くか
それかattr系メソッドを自分で定義するか
class Module
def attr_class_reader(*names)
names.each{| name |
module_eval "def #{name}; @@#{name}; end"
}
end
end
> Railsプロジェクトは異常なほど開発サイクル早いからすぐに対応するだろう プッ
Railsのほうから文句言ってくるに1票
わざわざ文句なんて言わずに、
>>961 のように自前で書いて終わりだろう
>クラス変数自体あんまり使わない これは嘘だろ。クラス変数を外から参照することはあまり無いけど。
1.9 使ってると、継承先で書き換えられると怖いからクラス変数は避けるようになった 大体はクラスオブジェクトのインスタンス変数でどうにかごまかせる
今はクラスインスタンス変数使うと思う クラス変数は使わないな
うええええマジですか?
Rubyはクラスオブジェクト(モジュールオブジェクト)自体をおおむね1個しか作らんのだから、 そのオブジェクトのインスタンス変数はクラス変数と実用上の違いはない クラスインスタンス変数という機構があるわけじゃないぞ irb> class CIns @hoge=0 def self.hoge; @hoge; end end irb> p CIns.hoge 0 irb> class CIns2 < CIns; end irb> p CIns2.hoge nil irb> class CCval @@hoge=0 def self.hoge; @@hoge; end end irb> p CCval.hoge 0 irb> class CCval2 < CCval; end irb> p CCval2.hoge 0
>>969 はattr_readerを使いたかったはずだと思った
流れ上使わないようにしろってのがwwww
Rubyのクラスインスタンス変数は、ふつう、attrとselfを使ってこう書く
class C
class << self; attr_accessor :hoge; end
end
これを見たら「あークラスインスタンス変数作ってるー」と思ってくれ
見慣れないとナニを意図してやってんだかさっぱりわからん謎の記述だ
クラスインスタンス変数ってのは一般的な用語なのか
>>971 Smalltalkにはクラスインスタンス変数(class instance variables)がナチュラルに存在してるぞ
なんでクラス変数使っちゃいけないのかがそもそも分からないんですけど
俺ルールの押しつけだから気にしないで使って良いよ
>>969 それって1.9だとクラス変数もnilになるんじゃないの?
>>957 >あーうん、attr_* は初心者は使わないのがいいぞ
>
>>951 みたいに混乱するからさ
まるで意味がわからない。
951ってこれだよね?
> 外からクラス変数にアクセスするにはどうすればいいのでしょうか?
> インスタンス変数ならattr_accessorがありますが、クラス変数の場合は自前でゲッターメソッドを定義するしかないのかな?
別に混乱しているようにはとても思えないし、初心者がattr_*を使わないほうがいい理由になっているとも思えない。
「attr_*を使わないほうがいい」なんて意見、初めて聞いた。こんなバカ発言、だれがいいだしたの?
>>973-974 だから継承先で書き換えられるかもって言ってんじゃんよ
そんなことはないとか、むしろそう使うつもならどんどんクラス変数使ってください
ところで次スレって980ですか
名前重要、と言ってるすべての人が、attrを実質的に否定してると思う attrは設定メソッド名と参照メソッド名と内部変数名を統一してしまう この2者・3者に共通して妥当な名称を、俺はそんなに思いつく自信がない
>>975 クラス変数の扱いは1.9の途中から1.8相当に変更されて1.9.1に至ってるけどちゃんとアップデートしてる?
>>978 >名前重要、と言ってるすべての人が、attrを実質的に否定してると思う
そんなのまるで聞いたことないので、具体的に誰がどう否定しているのか紹介してくださいおねがいします。
> attrは設定メソッド名と参照メソッド名と内部変数名を統一してしまう
> この2者・3者に共通して妥当な名称を、俺はそんなに思いつく自信がない
統一したらなんかまずいんでしょうか。
def name
@value
end
のほうがよっぽどきもいように思います。
getほにゃらら setほにゃらら が正義、ってことかな?
method と value に同じ名前がつくことのほうが事象としては稀だと思う 日本語じゃないから食い違いに気がつけないだけかもしれんが
英語圏では、動詞と名詞が同じ綴り、というのに使われてる気がするが、気のせいかも
ただのメソッドのくせにrdocで別項になるのが気持ち悪いので使ってない 通常のインスタンスメソッド一覧に混ぜるタイプのマニュアルライブラリはない?
985 :
デフォルトの名無しさん :2010/01/26(火) 19:25:32
えーちょっと何が言いたいかわからんなあ 長さを得るメソッドがlengthで長さを保持するインスタンス変数が@lengthって自然だと思うけど
細かい部分だけど、長さを得るメソッドならlength?のほうがより良いよね でも@length?にはできないせいattrが使えないし 細かい違いよりもattrの便利さのほうが上回るからlengthに流れてしまう 別にattr否定派というわけではないけど こういったように名付けに縛りが生まれるというか消極的になるのはattrの罪だと思う
>>986 > 細かい部分だけど、長さを得るメソッドならlength?のほうがより良いよね
なんで?「長さ」なら具体的な数値を返すべきだと思うけど。
基本的に「?」が付くメソッドは真偽値(True or False)を返すというルールだったはずだが。。
Rubyってプロパティ無いんだよね
メソッド名が名詞だと何が問題なのか全くわからん。 そもそもrubyはメソッドをプロパティのように見せることで、 オブジェクトの安全性は保ちながら読み手には簡潔に見える、ってのがコンセプトの一つだったような。 Railsなんてその最たる例だ。
次スレのテンプレに「次スレは
>>970 が立てること」みたいなの入れとこうぜ
Rails は Rails語としてRuby から分岐していんではないだろうか? とか思ったりなんかしちゃったりする今日この頃
length? の例えはおかしいと思うが、真偽値を格納するアクセサならまぁ
RubyとRailsはある時期から急速に廃れるような気がしてならない
>>991 gui とか書くとき form.listbox とかで何か値返してきたら
住所不定小包とどいたけど、これじゃない・・・とかか?
Rubyですごい事が出来た実例を教えて下さい。
Rails
もはやrubyじゃなくなってるけどな。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。