1 :
1 :
2006/03/27(月) 04:59:25 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは2以降。Ruby on Railsの質問はWebProg板のRailsスレで。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・ぐぐる
・マニュアルで探す
http://www.ruby-lang.org/ja/man/ ・FAQを読む
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(なるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2 :
1 :2006/03/27(月) 05:00:24
3 :
1 :2006/03/27(月) 05:13:31
4 :
1 :2006/03/27(月) 05:14:59
乙
>>7 あってる。
メソッド名も動的に変わる場合は
name = 'f'
args = [1, 2, 3]
__send__ name, *args
かな。
SchemeユーザのためのRuby入門・・・需要なさそう
素早いお返事いただきありがとうございました
>>8 ちょうど ruby-lang.org が重いのかなにかでマニュアルにアクセスできないのですが
__send__ というのは Object のメソッドでしたっけ、うーむ難しい。
> SchemeユーザのためのRuby入門・・・需要なさそう
私は perl5 を覚えたときにけっこう LISP/Scheme の初歩的な知識から対応付けしていって理解できた(つもり)ところがあるので、Ruby でもそういうのあると嬉しいように思います(他力本願過ぎ?)
net/httpで取得して、p hoge.headerとかできないけど、どうすれば表示出来る? p hoge.bodyは問題ないのに。orz
>>8 > SchemeユーザのためのRuby入門・・・需要なさそう
むしろ逆のほうが需要あると思う。
>>12 >むしろ逆のほうが需要あると思う。
RubyユーザのためのSchemeつーかLisp入門、かなりあったらいいかも。
コンスセルとか結構最初わけわかなくなったしww LispをLL系言語のラテン語?と思い(こんで)勉強中っす。
今はSchemeがプチブームなのか?オレンジニュースでも取り上げられていたし。
>>13 RubyわかるならSchemeもわかるんじゃないか。
オブジェクト指向と関数型、どっちが難しいかといえば、オブジェクト指向に一票。
Schemeは
・変数に関数を代入する
・whileのかわりの末尾再帰呼び出し
・継続
がわかれば、そんなに難しくないような気が。
SICPは難しいけどね。
最近はむしろ Ruby ユーザのための Haskell 入門の方が需要があると思う。 ウソ。
>>14 個人的にはLisp系の括弧だらけのスクリプトは初心者には読みにくいので
可読性の面でRubyの方がまだ簡単そうな気がする
一般に、オブジェクト指向と関数型のどっちが難しいかは知らん
オブジェクト指向と関数型を比較するのは変な希ガス
「Lispは早々に挫折したがRubyはなんとかなったという人に贈るLisp再入門」 とかいうのだったらきっとお金出して買う っていうかRubyをなんとか使えてるならLisp処理系を学ぶメリット別にないじゃんと思ってみる
ねえねえ Scheme ユーザのための Haskell 入門まだー?
宿題スレもルビまスレも無いよ。 ところで自スクリプトのファイル名とパスってどうやって得る? find /でゴロゴリ全検索?
>>21 るびまスレはあるような。
自スクリプトのファイル名とパスは __FILE__ で得られる。
用途によっては $0 の方がいいかもしれない。
宿題スレもあるよ
findbin.rb (Perl の FindBin.pm) があればなあと思うことがよくある。
こんな感じか。ありがとう。 % cat ../path_test1.rb #!/usr/bin/ruby p __FILE__ p $0 printf("This ruby script filename: %s\n", File.basename(__FILE__)) a = File.dirname(__FILE__) printf("This ruby script relative pathname: %s\n", a) printf("This ruby script full pathname: %s\n", File.expand_path(a)) % ../path_test1.rb "../path_test1.rb" "../path_test1.rb" This ruby script filename: path_test1.rb This ruby script relative pathname: .. This ruby script full pathname: /local/ruby
__FILE__ はデバッグ、エラー表示用というイメージが抜けないなあ
$0のほうがいいのかな?
__FILE__ と $0 は違うものだから、どちらが良いとか悪いとかではなく、必 要に応じて使い分ける。代表的な差としては、 __FILE__ はそのファイルの名 前だが $0 は実行プログラム名。 たとえば require された中のファイルの中では、 __FILE__ は require され たファイルの名前だが、 $0 は大元のスクリプトのファイル名。 Ruby のライ ブラリで「require されたときには実行されないもの」を指定するときに if __FILE__ == $0 ... end とか書くのは ruby のイディオムのひとつ。
> とか書くのは ruby のイディオムのひとつ。 典型的なバッドノウハウだなw とか言ったら釣れますか?
#! /usr/local/bin/ruby # This line makes the next one a comment in Ruby \ exec /usr/local/bin/ruby -S $0 $* %w(config lib plugin).each{|d| $:.unshift(File.join(File.dirname(__FILE__),d))}
バッドノウハウだとは思う ifで全体を囲まなければならないあたり特に
ていうかこういう判別機能($0 == __FILE__)は ruby本体に組み込むべきだと思った
if __RUN__
過去に何度か提案が出てるけど却下されてたはず。理由は忘れた。
つーかライブラリにサンプルコードやテストコードを埋め込むのはどうなんだ。 時間とメモリを無駄に消費しているようで嫌なんだが。 つかテストくらい普通に書けと。
36 :
デフォルトの名無しさん :2006/03/29(水) 03:31:18
そういや、プリコンパイルみたいなのは採用しないの? 採用すればサンプルやテストの無駄は無くなると思うけど。
ASRでどのオブジェクトにもぶら下がってない関数 InputBox, MsgBoxはどう呼べばいいんですか?
普通って何?
39 :
デフォルトの名無しさん :2006/03/29(水) 06:41:36
>>35 埋め込みコードで消費する時間もメモリもたかが知れてるから
実用上の問題はほとんどないんだが……
でもまぁ、確かになんとなく嫌な感じはする
>>35 どんな仕様がいいと思う?
おれは、標準ライブラリの使い方を調べたいとき、ライブラリにサンプルコードが載っているとわかりやすいと思っているから、
別にするのはあんまり好きじゃない。
でも if $0 == __FILE__ じゃない方法でもいいとは思う。RDocのコメントかなあ。
スレ違い
42 :
35 :2006/03/29(水) 09:41:22
>>40 RDocでいいじゃん。
例えばPerlだとPOD(埋め込みドキュメント)を拡張したTest::Inlineというモジュールがある。
こんな感じ:
=begin testing
# テストコード
=end
で、これを付属のユーティリティでプリプロセスすると実行できるというわけ。
ちなみにbegin/endはPODの開始/終了ではなく、PODを拡張するための(PerlではなくPod Parserレベルでの)予約語。
#if 0 #endif
>>36 プリコンパイルにしても、if $0 == __FILE__ というのは実行時に判定されるわけだから、「サンプルやテストの無駄がなくなる」わけではない。
Cのプリプロセッサとは違う。
>>39 はげどう。パースにかかる時間よりコードを実行する時間のほうがずっと大きいし、
パースしてできるツリーよりコード中で生成されるオブジェクトのほうがメモリを食っているんだから、
Rubyを使う以上そんなところを気にしても仕方ない。
気持ち悪いと感じるのはわからんでもないが。
>>42 よくわかってないけど、それってPerlを実行するときに必ず実行されるプリプロセッサ?
それとも、あらかじめプリプロセッサで処理していないと実行できないもの?
後者ならいやだなあ。せっかくコンパイルしなくていい言語なのに、プリプロセッサが必要となるならコンパイルする手間がかかるのと変わらないよな。
サンプルプログラムはRDocで書いて、テストスクリプトは別ファイルでいいような。大量のテストスクリプトがライブラリに埋め込まれるのは避けたい。
あそうか、サンプルプログラムをRDocで書くと直接実行して確かめることができないのか。
RDocに書いたサンプルを実行できるようなツールを作るか、RDocを拡張するか。
attr_accessor でsetterとgetterが簡単に定義できますが、うしろに「?」がつくメソッドを簡単に定義する方法はありますか。 今は def available? @available end といちいち定義しているんですが、attr_accessor :'available?' とかできないんでしょうか。
>>45 これねえ、昔は出来たんだけど、「そんなことできるのはバグ」で片付けられて
できなくなってしまった。要望出せば出来るようになるかもよ。
Object#nil? は、なぜ定義されているのでしょうか。 ふうつに obj == nil とすればいいだけだと思うのですが、わざわざ Object#nil? というメソッドを用意している理由が知りたいです。 あと、Array#firstも謎です。arr[0]でいいと思うんですが、これも存在理由が知りたいです。
>>30 > # This line makes the next one a comment in Ruby \
> exec /usr/local/bin/ruby -S $0 $*
相当古いバージョン使ってるな。
だいぶ前からコメントは継続できなくなってる。
-xと#!rubyを使うこと。
どっちかっていうとArray#shuffleがないのが気に食わない
Enumerable#inject はメソッド名が悪過ぎで、ものすごくわかりにくいと思う。 Smalltalk みたいに Enumerable#inject_into にすべきだと思う。
>>50 injectくらい強烈なメソッドになると、名前と関係なく使い方を覚えるから問題ない。
まあそりゃそうなんだけど、 「なんで "inject" って名前でこんな動作仕様なんだ?」という長年の悩みが、 Smalltalk には into: があるのを知ったらもうすごい勢いでスッキリしたので。
とりあえず、Rubyに慣れたら LIPSとSmalltalkはざっとでいいから さらっておくの吉。 こまごまとしたモヤっとがスッキリするぞ。
56 :
47 :2006/03/29(水) 14:37:35
>>51 >TMTOWTDI
それはperlのスローガンであって、Rubyはあまり関係ないのでは?
またもしそうなら、Object#true?やObject#false?もあるべきだし、
Integer#even? や Integer#odd? があってもおかしくないはずです。
でも現実にはそうではないので、TMTOWTDIが理由とは思えません。
>>55 ありがとうございます。読んでみました。
主張はわからなくもないですが、ならObject#true?とかInteger#even?も用意してほしいです。
arr[0] よりタイプ量が増える arr.first があるのに、i % 2 != 0 より短く書ける i.odd? がないのはなんか納得できない。
Railsのようにhelper classをたくさん作って組み込みクラスを拡張してもいいんですけど、そうすると他の人がコードを読むときに混乱するんですよね。
読み手のことを考えると、組み込みクラスをむやみに拡張するのは避けたいです。
なんか話がそれましたけど、ありがとうございました。
==はクラス毎に役割が違う。 でもObject#nil?はどのクラスでもnilかどうかを返すのが役割。 [0]とfirstは知らん。
Object#true? や Object#false? って何に使うの?
>>56 odd?、even?がないのは、単にパクり損ねです。それがRubyクオリティ…。
とにかくパクるにしても徹底せず、分裂症気味なんです。
勘弁してやってください。
>>56 firstはポリモルフィズムのためなんじゃねえの?
例えば、hoge.first は、hoge が Array でも Range でもうごく。
61 :
47 :2006/03/29(水) 15:04:44
>>57 なるほど。オーバーライドのことがありましたか。
[]もオーバーライドされる可能性があるからですかね。
>>58 単に真偽値を返すだけですけど。
var = obj ? true : false
var = obj ? false : true
を
var = obj.true?
var = obj.false?
とするだけです。
var = obj
とすると、objそのものが代入されてしまいますが、そうじゃなくてboolean値が欲しい場合、あるいはobjを参照させるとまずい場合に使います。自分はよく使うんですけど。
それはそうと、RailsのObject#blank?は便利ですねー。これはぜひ標準でほしいところです。
>>56 あるメソッドが存在するのには大抵理由があるだろうが、
あるメソッドが存在しないのには理由がないこともある。
世の中そんなもの。
Object#true? や Object#false? があるべきだと考えるのは、
Cで if (cond == TRUE) と書かないといけないと考えるのと
同じようなもんで、ありえない。
63 :
47 :2006/03/29(水) 15:08:40
>>60 それならRange#[]をサポートするべきでは?そのほうがより汎用的です。
でもそうじゃないから、多態が理由じゃないと思います。
ふと思ったけど、速度が理由とか。
64 :
47 :2006/03/29(水) 15:09:56
>>62 >あるメソッドが存在するのには大抵理由があるだろうが
その理由を問うているんですけど。
67 :
47 :2006/03/29(水) 15:16:59
試してみたらarray[0]よりarray.firstのほうが高速でした。15%くらい。 これだけでArray.firstの存在に納得しました。 コード: a = [1] 1000000.times do a[0] ; a[0] ; a[0] ; a[0] ; a[0] a[0] ; a[0] ; a[0] ; a[0] ; a[0] end 実行結果: $ time ruby hoge.rb real 0m6.339s user 0m4.931s sys 0m0.040s コード: a = [1] 1000000.times do a.first ; a.first ; a.first ; a.first ; a.first a.first ; a.first ; a.first ; a.first ; a.first end 実行結果: $ time ruby hoge.rb real 0m5.161s user 0m4.134s sys 0m0.037s
>>63 >それならRange#[]をサポートするべきでは?そのほうがより汎用的です。
もしRange#[]をサポートしたなら、(1.0..2.0)[1] は何を返すんだね?
>>63 0.1..0.9 があるからダメでしょ。多態がまるでわかってないんじゃない?
15% に存在意義を見出せてしまう
>>67 はさすがだと思う
>>68 >もしRange#[]をサポートしたなら、(1.0..2.0)[1] は何を返すんだね?
例外
Range#eachもそうだし
つうかこの手の〜もサポートしてるんだから…もしろ的議論は際限がないし
仮に全部採用したら大変なことになるしかといって
その反動で拒否しまくられても進歩がない。
要望全部まとめてMatz氏につまみ食いしてもらうのが一番だな。
というわけで指が折れ眼が潰れるまでやれw
72 :
47 :2006/03/29(水) 15:28:09
obj.nil? は obj == nil の半分くらいの実行時間です。 いろいろ理由をつけてもらいましたが、これがいちばんの理由ではないでしょうか。 コード: a = 1 1000000.times do a == nil; a == nil; a == nil; a == nil; a == nil a == nil; a == nil; a == nil; a == nil; a == nil end 結果: $ time ruby hoge.rb real 0m8.702s user 0m6.821s sys 0m0.053s コード: a = 1 1000000.times do a.nil?; a.nil?; a.nil?; a.nil?; a.nil? a.nil?; a.nil?; a.nil?; a.nil?; a.nil? end 結果: $ time ruby hoge.rb real 0m4.956s user 0m3.852s sys 0m0.035s どうみても高速です。本当にありがとうございました。
字面が良いとか高速とか柔軟性が増すとか意見がまとまらなかったとか まあいろいろ理由はある罠
>>73 速度に目が眩んで他人の話も聞かなくなった香具師に何を言っても無駄。
そのうち、「obj == 1 より高速にするために Fixnum#one? を 実装しろ」とか言い出しそうだな。
とりあえず "hogehoge".true? => false "hogehoge".false? => false と、ぱっと見では思ってしまうのだが俺の思慮が浅いのか。 Object.true? とはつまり、self == trueじゃないのかと。 self === trueでもいいけど。 そもそもfalse?でtrueが返ってくる時点で何か気持ち悪い、と思う俺はunless,untilを使いこなせない派ですが。 def Object.to_b return self ? true : false end ならふーんってかんじだがまあ人それぞれだしな。
>>77 >Object.true? とはつまり、self == trueじゃないのかと。
それはObject.nil?でも同じだろ
==はクラス毎に役割が違う。
でもObject#true?はどのクラスでもtrueかどうかを返すのが役割。
>そもそもfalse?でtrueが返ってくる時点で何か気持ち悪い
意味がワカラン。 Object.true? が self == true だと思うんなら
Object.false? は self == falseだろ。
お前はself == falseでtrueが返ってくるのも気持ち悪いと?
puts "boo!" unless obj.false?
Object? でいいのに、なんでわざわざ Object.true なんて使いたいの? だったら、Object.true.true.true.true って気が済むまでつなげりゃいいじゃん
↑アホ? だったら、アホ?.アホ?.アホ?.アホ? って気が済むまでつなげりゃいいじゃん。
82 :
47 :2006/03/29(水) 16:08:30
>>73 じゃあどれが本当の理由だったんでしょうか。
いろいろ理由をあげてもらって、それはそれで参考になったのですが、結局どれも決め手にかけています。
というか、どれもみなさんの*推測*でしかないんですよね?作者がそう明言したなら別ですけど。
例えば
>>65 のおかげでRubyでもTMTOWTDIが(メインではないけど)スローガンになっていることはわかりましたが、それはRuby全体のありかたであって、
Object#nil?やArray#firstはあるけどInteger#even?がない理由として作者がTMTOWTDIをあげたわけではないですよね。
勘違いしないでほしいんですけど、別にInteger#even?がないことを非難しているわけじゃないです。
obj==nilやarray[0]ですむのになんでわざわざObject#nil?やArray[0]を用意したのかが知りたかっただけです。
「Integer#even?もあるべき」と書いたのは、
>>55 で紹介されたようなことが理由だと仮定した場合の話であって、別のことが理由ならそんなことは書きません。
>>57 > ==はクラス毎に役割が違う。でもObject#nil?はどのクラスでもnilかどうかを返すのが役割。
これよく考えたら、「==はクラス毎に役割が違う」のは確かなんですけど、nilとの比較までクラスごとに違うことはないでしょうから、やっぱりObject#nil?が存在する理由としては弱いんじゃないでしょうか。
つまり、obj==otherはクラスごとに挙動が違うでしょうけど、obj==nilはどのクラスでも同じ挙動を期待していいんじゃないかということです。だからObject#nil?をわざわざ用意する理由としては弱い。
unless にイマイチ馴染めないのには同意だが false? で true かどうか考えるのは気持ち悪くない。
unless obj if obj.false? if obj == false if !obj 以上個人的に書きたいランキングですた
>>82 > どれもみなさんの*推測*でしかないんですよね?
> 作者がそう明言したなら別ですけど。
だったら作者に直接聞けよ。
> nilとの比較までクラスごとに違うことはないでしょうから
勝手に決め付けるな。自分勝手な奴だな。
大前提として、 if obj == true とか書く奴はアホ。これはいいか? よって、仮に Object#true? があったとして、 if obj.true? とか書く奴もアホ。 故に、Object#true? は不要。Object#false? も同様。 ってことをみんな言ってるんじゃないかね。
>故に、Object#true? は不要。 から >Object#false? も同様。 に繋げるのは少し無理があるな。 なるべくカーソルを動かさずに即興的に書いていくなら使うこともあるだろう。 その意味で "foo".puts($stderr) となんて嬉しいかもしれないなw
>>86 >if obj == true
>とか書く奴はアホ。これはいいか?
は?状況によっては、本当にtrueか比較したいときはあるだろ。アホか
>>88 そういう状況の話をしているのでは無いことぐらい文脈からわかるだろ。アホか
90 :
47 :2006/03/29(水) 16:20:54
>>62 >Object#true? や Object#false? があるべきだと考えるのは、
>Cで if (cond == TRUE) と書かないといけないと考えるのと
>同じようなもんで、ありえない。
Object#true? や Object#false? があるべきだと考えたのは、あくまで
>>55 で紹介された主張が理由だとした場合の話です。
これ(ヒューメインインターフェース)が理由なら、もっといろんなメソッドがあるべきで、その例としてObject#true?とかInteger#odd?とかを挙げたまでです。
前提なしでいきなり「Object#true? や Object#false? があるべき」といったんじゃないです。
>>69 >0.1..0.9 があるからダメでしょ。多態がまるでわかってないんじゃない?
「0.1..0.9 があるからダメ」だとしても、それがどう多態と関係あるんでしょうか。
「0.1..0.9 があるからダメ」と関係あるのはRange#[]をサポートするかどうかの話であって、多態とは関係ないように思うんですが。
if 文の式は何を判定してるのか ということがわかれば、 if true == true こんなバカな比較はしない
>>89 いいや、お前がアホ。
お前が勝手にそういう状況の話に限定するのは勝手だが、
現実にtrueかどうかを比較するときは存在する。
よって、
>>86 は話にならんな。
>86が通用するなら、同様にnil?も否定できる
大前提として、
if obj == nil
とか書く奴はアホ。これはいいか?
よって、Object#nil? があるけど、
if obj.nil?
とか書く奴はアホ。 if !obj とかけ。
反論してきたら、>そういう状況の話をしているのでは無いことぐらい文脈からわかるだろ。アホか
と返せるなw
>>92 ああ、結局屁理屈が言いたいだけか。スルーしていいね?
>>91 つまりnil?も必要ないじゃん、ということで宜しいですね
なんか何人もいてわけがわからんくなってきたね。 Object#true? や Object#false? はないのが自然と考える人もいる。 Integer#odd? や Integer#even? は存在するべきだと俺も思うが、 ない理由は「だってないんだもん」でしかないと思われる。 Object#nil? があるのは、false と nil が共に偽として扱われるから nil は別途判定する必要があって、かつ、== 演算子はユーザーに 再定義されるものであるという前提があるためだろう。
>false と nil が共に偽として扱われるから >nil は別途判定する必要があって とすると、trueとfalse,nil以外全てのobjectは真して扱われる以上、 それらも別途判定する必要はあるよな。 true?が存在してもよさそうな気がするな。
質問を装って、ただひたすら自説を展開して聞く耳持たずって奴は 一番たち悪いな。
>>97 true? false? よりは to_boolean の方がまだ使いでがある気がする。
頻度の問題
>>98 俺は質問者じゃないが、回答者のただひたすら自説を展開して
質問者に押し付けて聞く耳持たずって様が目障りだったんでね。
102 :
47 :2006/03/29(水) 16:36:08
>>68 >もしRange#[]をサポートしたなら、(1.0..2.0)[1] は何を返すんだね?
Range#[]は、
class Range
def [](i)
self.to_a[i]
end
end
を考えていました。
(1.0..2.0).to_a は TypeErrorになるので、(1.0..2.0)[1]もTypeErrorでいいんじゃないでしょうか。
>>71 と同じ意見です。
>>75 なんでこんなことをいわれるのやら。
挙げてもらった理由がどれも決定打にかける中、「高速性」というのがいちばん納得しやすい理由だっただけです。
なんでこれが他人の意見を聞かないになるのか。他人の意見を盲目的に信じないといけないの?
>>77 Object#true?は「obj == true」ではなくて「真か偽か」という意味です。そうとらえると、不自然ではないと思います。
>>80 これは
>>61 に書いた通りです。
if obj ...
と
if obj ? true : false ...
は同じですが、
var = obj
と
var = obj ? true : false
は明らかに違いますよね。
>>102 var = obj.true? で得た真偽値 var って、このあとどういう風に利用するの?
>>102 他人の意見は「単なる推測」で片付けるのに、自分の意見だけは
絶対なんだな。まあ、よくいるけどね。そういう人。
>>97 そうだね、そういう場面があればその必要性も発生するね。
で、どんな場面?
>>102 「obj == true」も「真か偽か」も書いてる人にしか意味に差はないんだけど、
むしろ、97が言うように、「obj が true オブジェクトであるか否か」を判定する
必要があるなら、Object#true? には存在意義がある。
真か偽か、を判定するために Object#true? を導入する意味はないんじゃ
ないかな。
>>106 obj.nil?が必要なのと同じような場面で必要ですよね。わかんないの?
うーむ。絶対ありそう、っておもってちょっと探したんだが見つからない。 Railsユーザーではない<軽く時代遅れかもしれないけど のだが、CGIとかの掲示板とかでよく問題になる、 スクリプト攻撃脆弱性回避のための、フィルタリング用の外部ライブラリとかってない? まぁ単純に<とか、>を<とかで置き換えればいいって話かもしれないけど、 できるだけHTMLタグ温存したかったりするから。
>>87 > "foo".puts($stderr)
> となんて嬉しいかもしれないなw
つ Kernel#display
改行はしないがな。
110 :
47 :2006/03/29(水) 17:05:41
>>83 >unless にイマイチ馴染めないのには同意
自分もこのまえまでそうだったんですけど、unlessは「条件が偽なら実行する」というのではなくて、「条件が真なら何もしない」ととらえるとわかりやすくなりました。
今までは「条件が偽なら実行する」という捉え方だったんで頭の中で条件を反転させてたんですけど、「条件が真なら何もしない」という捉え方だと条件を反転させる必要がなくなり、unlessが使えるようになりました。
すげーくだらないことですけど。
>>85 なんでこんなこというかな。挙げてもらった理由(推測)は参考になったって書いてるよ。
ただ、推測をあたかも本当の理由かのように説明されるのには困る。
ここで聞いてみて、本当の理由がわかればそれでOK。いまいちよくわからなければ、作者に聞いてみるよ。
>>96 >Object#nil? があるのは、false と nil が共に偽として扱われるから
>nil は別途判定する必要があって、かつ、== 演算子はユーザーに
>再定義されるものであるという前提があるためだろう。
Object#nil?も再定義される可能性があるので、やっぱり理由としては弱いのでは。
Object#nil?をへんなふうに再定義するやつが悪いということなら、obj==nilが変な値を返すように再定義するやつも悪いといえませんか。
Object#==が再定義されるものだとしてもそれは右辺値がnil以外のときの話であって、nilの場合は「objがnilならtrue、それ以外ならfalse」だと期待していいと思いますl。
「あるべき理由」(有用性)を皆が答えているなか、 「採用された理由」(経緯)を独り探しているという話。
112 :
103 :2006/03/29(水) 17:19:51
スルーですか・・・
「○○にも□□があるから△△にも□□があるべき」というのは、
□□がそれ相応に使われるから成り立つと思うんですよね。
翻って、これは俺だけの感覚かも知れませんが、
true?, false? にはそれほど利用価値が無いように思えるんです。
それで
>>103 の質問になるわけですが・・・
113 :
47 :2006/03/29(水) 17:26:18
>>96 >ない理由は「だってないんだもん」でしかないと思われる。
どうもありがとうございます。たしかに、Integer#even?やObject#blank?がないのはそんな感じがします。
ただ、これはObject#nil?やArray#firstがある理由にはならないんですよね。
「だってあるんだもん」ではないと思うんですが。
>>103 どう使うっていわれても。フラグに代入したりとか、ふつうにboolean値として使うだけなんですけど。
つうか、Object#true? はあくまで例のひとつであって本題ではないので、あんまりそこにこだわらないで欲しいってのはだめですか?
>>104 なんか、自分の話に反論されるとキレる人とか逆恨みする人多いですね。
たんなる議論なのに。まあ、よくいるけどね。
> 「高速性」というのがいちばん納得しやすい理由だっただけです。 特化したものは汎用的なものより "結果として" 高速化できるので、 実際に高速であるからといって、それが採用の理由である裏づけ にはならない。 ということで、客観的に尤度に違いがないから「ハァ?」という突っ込みに なる。あなたの脳内での納得の過程、他の理由よりもっともらしいと言える 理由を他人が分かるように書かなければ、「自己完結乙」で「独り言は チラシの裏に書け」となるのが関の山。
>>113 >ただ、これはObject#nil?やArray#firstがある理由にはならないんですよね。
>「だってあるんだもん」ではないと思うんですが。
なんらかの理由、111の言葉を借りれば「有用性」があるから存在する。
それぞれの有用性はもう語られてるよね。
有用性があるはずなのに存在しないメソッドについては、単にその有用性に気付かなかったから実装されてないだけかもしれないので、存在しない理由はないかもしれない。
と、いうことで結論付けていいんじゃないの?
あるべきものがないと思う人は、MLあたりで作者にその有用性を切々と訴えてみてはいかがでしょうか。
116 :
103 :2006/03/29(水) 17:36:11
>>113 うーん、やっぱりその boolean 値を有効に利用するケースが全く想像できません。
漠然と想像できなくはないですが、それもかなり筋悪な気がしています。
even?, odd?, blank? については、私はあっても良いと思いますよ。
あとは、これらのメソッドを追加することによるメリットと
掛かるコスト (== matz を説得するコスト) を天秤にかけるとどうか、
ってところだと思います。
117 :
47 :2006/03/29(水) 17:39:18
>>111 だって最初の質問がそうなんだから、仕方ないじゃん。
勝手に話をすり替えられても困る。
>>112 回答がおっつかなかっただけで、スルーした訳じゃないです。仕事中だし。
なんかtrue?、false?に話が限定されている気がするんですけど、これはあくまで例のひとつです。
そもそもの話は「obj == nilですむのになぜObject#nil?があるんですか?」ということであって、「Object#nil?があるならObject#true?もあるべきだ」という話ではないです。
どちらかといと、「obj == nilですむからObject#nil?はなくていいのでは?」のほうが近いです。
>>113 > たんなる議論なのに。
あなたのやっていることは荒らしですよ。わざとなのか違うのかはわかりませんが。
荒し認定厨キターーーーーーーー もうすぐ「春だねぇ」とか言い出すよ
春だねぇ。
春だねぇ
うん、春だね。
1. nil?っていらなくね? by47 2. Aという理由で必要ですよ。 3. true?がないからAという理由とは考えにくい by47 4. true?がないのはBかCという理由からでしょう 5. true?の話はやめましょう。1.に戻りましょう。 by47 戻るべきは2.以降です。
125 :
103 :2006/03/29(水) 18:01:45
>>117 > どちらかといと、「obj == nilですむからObject#nil?はなくていいのでは?」のほうが近いです。
であれば議論の進め方がまずすぎます。おかげでこんなに発散してしまっている。
>4. true?がないのはBかCという理由からでしょう そのBかCが理由になってないからだろ
127 :
108 :2006/03/29(水) 18:07:00
>>108 です
春という季節のせいか、軽くスルーされて困ってますw
手がかりをご存知の方がいらっしゃいましたら、投下ヨロシクデス…
申し訳ありません(;ω;`)
47は、matzが採用するかしないかを決めた理由ではない
可能性のあるものは求めていません。
存在の妥当性や有用性ではなく、matzがそれを採用理由に
したか否かを、つまりmatzの判断についてのソースを提示しましょう。
47さん、
>>1 に、質問する前にぐぐることと書いてありますが、
matzの関連発言などについてどこまで調べてみましたか?
結局、47が他の人の述べているnil?の有用性を認めるまで、永久にループすることになるのでは? 他のメソッドの話がどうでもいいなら余計にそうなるよね。
>>126 それが理由であることがなぜ不自然か、
それが理由だとどのような不都合があるか、
それがどういう理由で理由とならないか、
具体的に指摘しましょう。
>>127 質問の意味が良くわからない。
CGI.escapeHTMLやERBのhとかじゃなくて?
あらゆる脆弱性を回避できるような魔法のような方法は無い。
あれば誰も苦労しない。
そうそう、ruby-talkにはなんでtrue?やfalse?がないか、というスレッドもあったりするので、興味がある人は参照するといいよ。 odd?とeven?についても興味深い議論がある。
134 :
47 :2006/03/29(水) 18:36:03
いままでのをまとめてみた。
質問:obj==nilやarray[0]ですむのに、わざわざobj.nil?やarray.firstがあるのはなぜ?
(注意:Object#nil?があるならObject#true?があるべきだという話ではない。どちらかというとobj==nilですむからObject#nil?はいらないのでは?という話。)
>>51 >TMTOWTDI
→それなら他にもInteger#even?とかあってもおかしくないのに、そうではないから、TMTOWTDIが理由ではないのでは?
>>55 >ヒューメインインターフェイス
→上と同じ。
>>57 >==はクラス毎に役割が違う。でもObject#nil?はどのクラスでもnilかどうかを返すのが役割。
→・いくら==がクラスごとに再定義されたとしても、nilとの比較ではどのクラスも同じように動作すべきだし、そのように期待してもいいはず。
・Object#nil?だって再定義される可能性がある。
・「nilかどうか」があるなら「trueかどうか」「falseかどうか」もあるべき。
>>60 >firstはポリモルフィズムのためなんじゃねえの?例えば、hoge.first は、hoge が Array でも Range でもうごく。
→・それならRange#[]をサポートした方がより汎用的
・(追加)多態が理由ならMatchDataやStringにもfirstが実装されるべきで、そうでないから多態が理由ではないのでは?
>>67 ,72
>高速性
→(
>>114 )特化したものは汎用的なものより "結果として" 高速化できるので、実際に高速であるからといって、それが採用の理由である裏づけにはならない。
>>96 >ない理由は「だってないんだもん」でしかないと思われる。
→・たしかにそうなんだけど、○○がない理由ではなくて、Object#nil?やArray#firstがある理由が知りたい。
Object#nil? がある理由はもう出たからいいよね。 Array#first がある理由は [ruby-dev:7968] からのスレッド参照。一言で言えば可読性。
136 :
108 :2006/03/29(水) 18:46:58
だってあるんだもん。 たとえば、データをハッシュに入れるほどでもないような時、 (適切ではないけど)配列のインデックスによって意味が異なるような構造にしてある場合 Firstとそれ以外ってのはよくありえる話で、そっちのほうが、 Firstだけ違うんだよ、って感じやすいじゃん。 くだらない粘着やらずに素直になれって。
だーかーらー、これがrubyクオリティ。 なんでこんなパクりまくりの分裂症気味の言語に一貫性があると思うのかね。 それが不思議だ。
138 :
47 :2006/03/29(水) 18:50:26
>>114 いってることがむずかしすぎてよくわかりません。
>>115 >なんらかの理由、111の言葉を借りれば「有用性」があるから存在する。
>それぞれの有用性はもう語られてるよね。
どれも決定的ではないと思います(理由は上で述べたとおり)。
obj==nilと比べてobj.nil?がどのくらい有用なんでしょうか。高速ということぐらいしかはっきりとした有用性はわかりませんでした。
>有用性があるはずなのに存在しないメソッドについては、単にその有用性に気付かなかったから実装されてないだけかもしれないので、存在しない理由はないかもしれない。
これはそうかもしれません。
>>124 obj.nil?やarray.firstはobj==nilやarray[0]より簡単なんでしょうか。また仮に簡単だとしても、それは独立したメソッドを用意したくなるほど簡単になるものでしょうか。
「何度も起きることを簡単に行える」といえるのは、Object#blank?のような場合であり、Object#nil?には当てはまらないでしょう。
>>125 最初の質問(
>>47 )を読んでみてください。最初からそういう質問をしているんですけど。
>>129 私が示した反論に対して、根拠のある説明がされればループすることはないですよ。
議論をせずに「荒らしだ」とかいってるからループするのでは。
>>47 「知りたい」のはわかったけど、スレ汚しすぎ。
140 :
108 :2006/03/29(水) 19:08:27
ふぅ、まあいいや、とりあえず柔軟になれって。 さておき、レスが付かないってことは多分自前で作るしかないんだってことでFA? 作ってきます。
> →それなら他にもInteger#even?とかあってもおかしくないのに、 > ・(追加)多態が理由ならMatchDataやStringにもfirstが実装されるべきで、 これらは、すでに理由が示されてるものです。 すでに示された理由についての反論は次のように否定されていますので、 いまのところ、すでに示された理由を否定する理由はありません。 > →・たしかにそうなんだけど、○○がない理由ではなくて、Object#nil?やArray#firstがある理由が知りたい。 なぜ○○がない理由が示されたか議論の経緯を覚えていますか? 「Object#nil?やArray#firstがある理由」への反論として 「○○がない」ことが説明つかないというものがあり、 それへの再反論として「○○がない理由」が示されたのですよ。 つまり、「Object#nil?やArray#firstがある理由」の補強であるわけです。
143 :
108 :2006/03/29(水) 19:19:36
だから荒れてるスレは苦手なんだよな…orz なるほど、魔法のようなものは無い…ってまぁ確かにそうなんだけど、 外部から入力されてるテキストをパージングして、HTMLと解釈できるなら、 ある要素だけ拾い出す、あるいは捨てるって意味さ。 するてーと、少なくとも<script…は除外するとかできそうなんだが。
144 :
103 :2006/03/29(水) 19:28:26
>>138 > obj==nilと比べてobj.nil?がどのくらい有用なんでしょうか。
数が証明していると思いますよ。標準ライブラリを grep nil? してみては。
>>143 下手な実装すると脆弱性の拡大再生産になりかねなさそうでちょっと怖いですね。
デフォルトでは全部拒否で、 指定した要素と属性を許可、という感じか。 確かにどこかにありそうではある。 > CGI .escapeElement(string, *elements) > elements に指定したエレメントのタグだけを実体参照に置換します。 とか?
148 :
47 :2006/03/29(水) 19:56:51
>>132 おお、すばらしい。どうもありがとうございます。
>It's a convenient (or better looking for someones' eyes) way to check
>if something is nil, as you've guessed.
「便利だから」というのが理由のようですね。今まで挙げられた推測はすべて間違いだったようです。(「ヒューメインインターフェイス」は近いか?)
しかしobj==nilがobj.nil?になったところでconvenientとは思えないなあ。タイプ量も同じだし。
結論はでましたが、あまり納得できないので、機会があれば作者の方に聞いてみたいと思います。
>>135 こちらもどうもありがとうございます。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/7980 >すでに[ruby-dev:7969]で指摘されてますが、
> object.to_a[0]
> object.to_a[-1]
>じゃダメなの? って気はします。別にかっこ付けなくても大丈夫
>ですよ。ま、それは別として first, last, at ってのは採用して
>も良いかなあって気になってます。1.5系が始まったらまた思い出
>させてください。
これを読むと、firstを採用した理由は特に書いてないと思います(このスレッドを読む限りは)。
「可読性」というのはどこか他のところで言及されたものでしょうか。
というか、こんなのどうやって発掘してくるんですか?「ruby nil?」とかでぐぐったところで、みつかるわけないし。
どのように便利かをさんざん説明してきた 回答者の皆様、お疲れ様でした。
ざざっとスレ眺めてみたが どうでもいいとは言わないがどっちでもいい話だな。 自分と作者(だか世間一般)との趣味の違いに一喜一憂したくないので よく書いて足りないと思った物は-rmylibでさっさと拡張しちゃうから。 こういう見てくれの話に終始するよりは 柔軟なライブラリを充実させて 問題解決を支援してくれる機能を提供してくれさえすればそれで十分だ。
151 :
47 :2006/03/29(水) 20:25:54
>>141 >これらは、すでに理由が示されてるものです。
どれをさして「理由」といってますか。
>すでに示された理由についての反論は次のように否定されていますので、
>いまのところ、すでに示された理由を否定する理由はありません。
次をよめばわかるんですね。
>なぜ○○がない理由が示されたか議論の経緯を覚えていますか?
>「Object#nil?やArray#firstがある理由」への反論として
>「○○がない」ことが説明つかないというものがあり、
>それへの再反論として「○○がない理由」が示されたのですよ。
>つまり、「Object#nil?やArray#firstがある理由」の補強であるわけです。
わかりにくいなあ。
「○○がない理由」はあくまで「○○がない理由」であり、それがどうして「Object#nil?やArray#firstがある理由」の補強になるのでしょうか。
「裏の裏は表」ということですか?今の場合は「右の右は後ろ」でしょう。
>>144 >数が証明していると思いますよ。標準ライブラリを grep nil? してみては。
数多く使われているからといって、それが必ずしも有用性の証明にはならないのでは。
.nil?が多いのは、単にnilと比較する機会が多いからであって、==nilより優れているという直接の理由にはならないと思います。
また数だけでいえば、obj.nil?より単なるobjのほうが多いでしょうし。
>>148 >obj==nilがobj.nil?になったところで
違う、obj.equals? nil と等しいと考えないと
超秋田。
>>151 > 「○○がない理由」はあくまで「○○がない理由」であり、
> それがどうして「Object#nil?やArray#firstがある理由」の補強になるのでしょうか。
それは、
否定する根拠が再反論によって消滅したため、
> いまのところ、すでに示された理由を否定する理由はありません。
となるからです。
あと、話が分からないときに比喩を使うのは、混乱の元ですからやめましょう。
> 「裏の裏は表」ということですか?今の場合は「右の右は後ろ」でしょう。
という文を、具体的な文にしましょう。
議論してる奴ら全員Ruby本スレに行け ていうかそろそろ議論止めろ
本スレに湧かせないようにしてるのに何を言い出すか
だからここは初心者スレなんだってばww こんなよくわかんない空気かもしだしてたら、質問したくてもしにくくなるんじゃない?
ウジ虫野郎は本スレで湧いてろ
なんかすげースレすすんでてワラタ Arrayだろうとなんだろうと、それがnilであるか? とは考えるけど Arrayがtrueかどうか? とは考えない、考え方の汎用性の違いによるものだと勝手に納得してた
スレ違い
161 :
108 :2006/03/29(水) 22:31:31
>145 うむ。言葉足らずですまんかった。 なるほど、dクス。併せて CGI.unescapeElement(str, *elements) がそれに相当するぽい。ドキュメント長いと見落としが…すまん。 >146 ちょ…俺?w んまいいけど、47はなんでほぼ全レスなんだwww 神経質つか粘着だしwww適度というものを知れww なにも頭から否定されてるわけでもあるまいwwなにをムキにw
定期的に変なのが湧きますね。 直接MLに投稿すれば一発で解決するものを、何だって遠回りな手段を選ぶのか、 その思考回路からして理解できない。 仕様がどうのという以前に、まずは正しい質問先を見極めることから勉強してき て欲しいものだな。
>>161 お前も粘着ウゼーんですけど。つか荒らすなボケ
>>162 >直接MLに投稿すれば一発で解決するものを、何だって遠回りな手段を選ぶのか、
あれ?このスレ要らなくね?
ん、要らないと思うなら来ないのが一番。
で、来た奴は 直接MLに投稿すれば一発で解決するものを、何だって遠回りな手段を選ぶのか、 その思考回路からして理解できない。 と言って追い返せばおkだねw
>163 荒らしに反応するのも荒らしって知ってた?
ひとのことをばかっていうやつがばか
いいから荒らすなボケ
直接MLに投稿すれば一発で解決するものを、何だって遠回りな手段を選ぶのか、 その思考回路からして理解できない。 ん、ん〜、これは名言だな。 このスレのテンプレにしようぜ。
ついでに、Rubyは手っ取り早くなんかやれるようにしたい人向けです。 全てのリテラルを正規表現で表したくて仕方が無いほど厳密で美しい言語を求めてる人には向きません。 とも。
ファイルがバイナリかどうかを知るのにそこそこつかえる方法ってありますか?
バイナリファイルがそのまま"人間の理解できるも何らかの文字列データ"であることは、 確率論的に見て限りなく低いが、ありえる。 PCからはそれが"人間にとって"意味を成す文字列データであるかは解釈不能なので、 よって、バイナリファイルであるか、何らかの文字列であるかはPCから見て原理的に無保証。 即ち、入力される時点で何らかの形でデータ形式が保障されている実装になるようにしたほうが無難。 コレで解答になってるかしらん?
全然なってないな。
んじゃ書き直してくれ。
直接MLに投稿すれば一発で解決するものを、何だって遠回りな手段を選ぶのか、 その思考回路からして理解できない。
ちょwwおまww 其の話題終わった。 テンパってる。
バイナリがどうのという以前に、まずは正しい質問先を見極めることから勉強してき て欲しいものだな。 コレで回答になってるかしら?
>>177 MLへの投稿は初心者として敷居が高いので、
匿名掲示板の皆様にお尋ねすることにしました。
どうかご助力願います。
これ質問者の代わりに張っといて。
>>179 勝手が分からず申し訳ないです。
正しい質問先に誘導願います。
これも質問者の代わりに張っといて。
傍から見てて、あくまで意見だが、それなら誘導の一つもしてやれと。
>>180 MLの投稿を、敷居が高いとかアホいってんのか。
Rubyの勉強の前にまずメールの使い方と、正しい日本語を習うんだな。
俺はrubyでの方法があればここで書いてやれば
いいと思うので誘導先なんて分からん。
それ以前に
>>174 がひとつの回答になってるだろうと思う。
あるいは、(文字コード判定と同様に)ある程度の精度で
判定してくれる(もの|方法)ならあるかもしれんと思うが、
あいにく俺はそんなものしらないので沈黙。
つーか47が今度は名無しで荒らしてるだけか。 つまらんことするね。
>>186 ハズレw
ところで荒らしに反応するのも荒らしって知ってた?
ほほえましいですね
言葉足らずという問題じゃねーだろ これでそれが伝わるわけがない。 162 名前:デフォルトの名無しさん[sage] 投稿日:2006/03/29(水) 22:41:10 定期的に変なのが湧きますね。 直接MLに投稿すれば一発で解決するものを、何だって遠回りな手段を選ぶのか、 その思考回路からして理解できない。 仕様がどうのという以前に、まずは正しい質問先を見極めることから勉強してき て欲しいものだな。
>>172 % ruby -rnkf -e 'p NKF::guess(ARGF.read) == NKF::BINARY' /bin/sh
true
いや、分かるよ。
>>47 に対して「そんなことMatzに訊けよ」とか
「MLで訴えたら?」とか上で言われてるんだから。
しょうがないな、誰も言わないなら俺が言おう。 47氏、OZ TECH マダァ? というか、こういったショボイ糞野郎便所のオナヌィ落書を吸収してくれることこそ 2ch の真価。 頼むから ML なんかに投げないでくれ(w
>>192 分かる分かんないの問題じゃない。
言葉足らずじゃなくて、逆だ。言葉が多すぎる。
こんな文を付け加える必要があるか?
>定期的に変なのが湧きますね。
>その思考回路からして理解できない。
>仕様がどうのという以前に、まずは正しい質問先を見極めることから勉強してき
て欲しいものだな。
まぁまぁ、それはともかくとして 直接MLに投稿すれば一発で解決するものを、何だって遠回りな手段を選ぶのか、 その思考回路からして理解できない。 これはどんな質問にでも対応できる名言なことはたしかじゃまいか 有効活用していこう。
Ruby を AA で表現するとどうなるのでしょうか?教えてください。
MLで聞きなさいボウヤ
むしろこの場合matzにしか解らない事を2chで訊くなよ、が正しいのかもな。
「matzにしか解らない事」の範囲がわかるのは、もはや初心者じゃあるまい
もう質問者も忘れ去ってるかもだが>37 InputBox、MsgBoxは VBScriptの関数 なので VBScriptでしか 使えない。 MsgBox相当のことはWScript.ShellのPopupメソッドを呼べばよろし。 InputBox相当はちと分からん、スマソ
203 :
47 :2006/03/30(木) 11:11:39
今読み返すと、ちゃんとお礼をいってなかったような気がする。
回答してくれた人、どうもありがとうございました。特に決定打を紹介してくれた
>>132 、どうもです。
間違った推測もありましたが、それはそれで考えるうえでの参考になったので、よかったと思います。
ただ自分の推測を押しつける人とか、反論されると怒る人とか多いのは残念でした。そんなこと書くくらいなら、反論の反論とか、推測の根拠をきちんと説明するとかしてほしかったです。反論できなくなったから「粘着だ」とかいって逃げるしかなかったんでしょうけど。
あと、
>>132 にはメーリングリストからの発掘方法を教えてくれるとうれしいです。また
>>135 は「可読性」がどこからでてきたのか教えてください。
204 :
47 :2006/03/30(木) 11:12:45
これで最後にします。
>>152 nilとの比較でいえば、==nilも.equals? nilも同じ挙動だと考えていいのでは。
前にも書いたように、==を再定義しても==nilは同じ挙動を示すと考えていいと思うし、.equals?だって変なふうに再定義される可能性がありますよね(いいかどうかは別として)。それこそ.nil?だって。
また.equals? nilを特別扱いするなら、.equals? trueと.equals? falseも同じように扱われるべきだと思うけど、そうなってはいません。
と書いたら、そう思うのはおまえだけとか書かれるんだろうな。乙。
>>154 あいかわらずわかりません。
>否定する根拠が再反論によって消滅したため
どの「否定する根拠」がどういった「再反論によって消滅した」のですか。具体的な文でお願いします。
>あと、話が分からないときに比喩を使うのは、混乱の元ですからやめましょう。
わかりやすく話してもらえれば、比喩を使うことはないです。また混乱のもとなのは、話がわかりにくいからであって、比喩のせいじゃないです。
>>161 すこし返事が遅れただけで
>>112 みたいに「スルーですか」といわれて、こんどは「なんでほぼ全レスなんだwww」ですか。むずかしいなあ。
>>162 おいおい、自分は根拠のない推測を並べて混乱させておいて、その推測が否定されると
>直接MLに投稿すれば一発で解決するものを、何だって遠回りな手段を選ぶのか、
>その思考回路からして理解できない。
とかいいだすんですか。それなら最初からそう回答すればいいのに。あとからそんなことをいってもね。
つか、
>>132 の答えを投稿すれば一発で解決するものを、推測ばかりたて並べてるほうが理解できないです。
205 :
132 :2006/03/30(木) 15:24:15
その答えを発掘するのに時間がかかったんだよ。 答えを覚えていてもソースのありかを覚えているとは限らないからね。 「なぜ Object#nil? が == nil より便利なのか」は、皆さんが回答した通り。 135を書いたのも俺なんだが、わざわざ「[ruby-dev:7968]からのスレッド」と書いた意図がまったく理解されていないな。 提案者が提案の意図として可読性を上げていて、Matzがそれに反論せずに採用を決定してるんだから、採用の意図は当然可読性だよ。 いちいち記憶を頼りにメールボックスを探しまくって結論を出してみたわけだが、47には理解力も展開力も想像力もないということがよくわかっただけだった。 こんな質問者が相手じゃ誰も真面目に答える気なくすよ。
なんとなく
>>47 はオブジェクト指向プログラミングの経験値が
足りないだけなんじゃないかという気がする。
ある程度経験を積んだプログラマなら nil? のキモチヨサがわかると思うんだけどなあ。
>ある程度経験を積んだプログラマなら nil? のキモチヨサがわかると思うんだけどなあ。 経験とか曖昧な言葉でお茶を濁して説明を放棄するならもう黙っとけ
>>207 イヤです。厳密な説明しか許さないのならテンプレにそう書いておくべきです。
> 47には理解力も展開力も想像力もない 問題は、訊ねた相手のせいにして47が成長しようとしないこと。 47はこれからも人に訊いては相手を不愉快にさせ続ける。ひどい。
『馬鹿と議論するな。傍目にはどちらが馬鹿かわからない』
その嘘が馬鹿に通じればいいんだけど、馬鹿は 「ここは馬鹿ばかりで議論になりませんね」 という捨て台詞を吐くまでが長いんだよなあ。
なんかこっちの意図を読めない馬鹿ばっかりだな。 話のわかる奴が誰か俺の代わりに説明してくれよ。 初心者スレつまんねー こんなんだから人が寄りつかないんだよ 本スレ行こうかな?
バカばぁーっか
# リマスター版、高過ぎだお
>>213 馬鹿相手だと、本スレでも間違いなく同じ流れになるからw
馬鹿を諭してるつもりのやつも馬鹿、 という内容に対して「この場合それは嘘だが」 と言われてることすら理解できずに 「相手が理解していないんだー」とアピールしている やっと捨て台詞?
個人攻撃に走るならもう終わってくれ。いくら春でもひどすぎる。
213はコピペ
>>47 が独り虚しく自己フォローし続ける限り続くと思われ
日本語によるRakeの解説ってありませんか? ruby rake でぐぐっても、みつかりませんでした。
超FAQなんでしょうが Foo = 1 Bar = 2 Baz = 3 ... をマジックナンバーばら撒かずに簡単に初期化する方法ないですか? よーするにenum使いたいんですが。
MLはメルアド曝すのが嫌なのとアーカイブされるのが嫌だな。 捨てアドだとスルーされるし。
>>219 %w(foo bar baz).each_with_index {|c, i| Object.const_set(c.capitalize, i)}
とか?
>>220 1, 2, 3が意味のない数値であるならば、そもそもFoo, Bar, Bazに意味のない値を代入するのが無駄。
例えば、シンボル :Foo, :Bar, :Baz をそのまま使えばよろしい。
シンボルをenum代わりにするとスペルミスに対応できない :Foo :Bar :Baz state = :Foo puts "Foo" if state == :Foo puts "foo" if state == :Hoo
FOO,BAR,BAZ,* = (0..65535).to_a
>>225 それ見てこんなの思いついた。
めんどくさいだけだがw
State = Hash.new{|h, k| h[k] = k}
State[:foo]; State[:bar]; State[:baz]
State.freeze
state = State[:foo]
puts "Foo" if state == State[:foo]
puts "foo" if state == State[:hoo]
Foo = :Foo; Bar = :Bar; Baz = :Baz; でいいんじゃね? スペルミス対応済みで、pでの出力も見やすい。
>>228 その、Foo = :Foo とか書くのがなんか二度手間でいやだなあ。
そこまで言うと初心者スレの範囲を超えそうだが。
230 :
47 :2006/03/30(木) 23:01:16
なぜenumがないのか理解できませんね。 作者の怠慢にしか思えません。
Structでそれぞれにシンボルいれて代用でよくないか? インスタンス変数にシンボルいれてアクセサとか
Foo = 1 Bar = 2 Baz = 3 と enumの違いがわからない。 どちらも定数みたいな物じゃないのか?
>>205 >提案者が提案の意図として可読性を上げていて、Matzがそれに反論せずに採用を決定してるんだから、採用の意図は当然可読性だよ。
違う。反論していないからといって、勝手に同意したことにするな。
matzは可読性については何も言及してない。あくまで「採用してもいいかなと思ってる」と書いてるだけ。だから採用の理由はこれだけでは不明。
勝手な解釈で初心者を惑わすようなやつが、なんでこんなにえらそうなんだ?
>>232 Foo + Barは3? ということじゃないか
C言語ならそうなんだけど、そうならないものが欲しいと
そういうのはどうでもいいw 簡潔に宣言できて少なくとも関連する要素間では値がダブらず 必要であれば値を明示できるものがenumに求められる。
-cのシンタックスチェックが全く役に立たない件
ひとつかふたつ前のスレでも似たような話があった気がする。けっきょく 222 みたいなコードで落ち着いた気がするが。
厳密にやらないなら
>>226 もお手軽。流石に6万はありえないがw
お手軽とか落ち着いたとか喪前らほんとに使ってるのかと
>>240 だって、enumの有無なんて気にしない人のほうが多そうだし
質問です a = 1 print "abc#{a}def\n" とすると#{a}の部分は展開されて表示しますが この内容「abc#{a}def\n」をテキストファイルに保存し1ラインずつ 読んでprint文に渡すと展開してくれません ※メタ文字がエスケープされる? これを展開する方法はありますか?
>>242 うまくいかない理由:
"abc#{a}def¥n" の #{a} が展開されるのは、rubyコマンドがスクリプトをパースするときです。つまり #{a} が展開されるためにはrubyによってパースされる必要があります。
しかしファイルからFile.read()などで読み込むと、rubyがパースすることはありmせん。なぜなら、File.read()などによる読み込みはあくまでデータとして読み込むだけであり、スクリプトとして読み込むわけではないからです。
これに対し、require や load だとスクリプトとして読み込まれるため、rubyがパースしてくれ、#{a}も展開されます。
解決策:
今回の場合は、eval使うしかないでしょう。
#{a} の部分があまり複雑じゃなければ次をどうぞ。
data = File.read(filename)
print data.gsub(/¥#¥{(.*?)¥}/) { eval $1 }
参考:
ここからは想像ですが、もしエラーメッセージなどを外部ファイルにするのが目的なら、#{a}ではなくて %s を使い、String#% や sprintf() で展開するのが簡単です。
msg = "error: %s (error code %d).¥n"
print msg % ['invalid name', 123]
またテンプレートに式を埋め込むのが目的なら eRuby を使いましょう。詳しくは ERB でぐぐってみてください。
以上です。
244 :
243 :2006/03/31(金) 10:53:17
質問しにきたはずのに、これ書いてたら何を質問しようとしたのか忘れてしまったorz だれか俺のかわりに思い出してくれ
>>244 直接MLに投稿すれば一発で解決するものを、何だって遠回りな手段を選ぶのか、
その思考回路からして理解できない。
>> 243 ありがとうございます。 動きました。 #{}の中で変数/定数の加減算がしたかったのです。 これだと何でも動いちゃう気がして怖いのですが 自分しか使わないから問題ないです。
>>245 えらい便利な ML だな。俺も最近ど忘れが激しいので subscribe しようかしら。
>>233 はいはいそうですねそうですねそういうことにしましょうね
irbは知ってたけど、irb/completionなんてものがあるのは知らなかった。 すげー便利じゃん。
>>249 1.9だとsave_histもあるらしいが。
javadocの感覚でRDoc使ってみたら 激しく見づらくて萎えている漏れダルシム(´・ω・`)ヨガヨガ
公式のgemsでproxy認証越えきぼんぬ
255 :
デフォルトの名無しさん :2006/03/32(土) 11:56:38
関数内関数から外側の変数にアクセスできないんですが、 こういうものなんですか? ブロックだと外側にもアクセスできるんですが・・・ グローバルにするか、引数で渡してやるしかない? でも、他の言語だとできるので、なんだか悲しい
>>255 そういうウンコ仕様なんです。ご了承ください。
>>255 def outer
i = 0
inner = lambda{ i+=1 }
p inner.call
p inner.call
end
outer
>>255 トップレベルで定義したインスタンス変数などでもできたと思うが
javadocのモジュールがあってもいいな。 RDのほうが見やすいけど、標準はRdocになっちゃったし。
関数内関数定義って、上の関数が属しているクラスと同じところに定義されなかったっけ? 関数内で定義した関数だと区別することってできるの?
262 :
デフォルトの名無しさん :2006/03/32(土) 14:08:24
>>258 無理やりブロックにするんですね、なるほど・・・
ムリヤリ?意味不明なこと言われた。 何がムリヤリなのやら。 >でも、他の言語だとできるので、なんだか悲しい 具体的に何?
ムリヤリ絡むなよ・・・
お礼も言わずに無理やりとか意味不明なこと言ってるからだろ。死んでしまえ。
Ruby的にいえば無理やりじゃないんですね。ごめんなさい
>>263 DとかDelphiとか
オブジェクトが違うから弄れる方が気持ち悪い。
文字列の連結は + より << の方が GC が起きず効率が良いらしいですが、 "#{str1}#{str2}" は、どうなんでしょうか?
<<とほぼ等価。 その例は "" << str1 << str2 として実行される。 ただし、String#<<が再定義されていても、影響を及ぼさない。
>>268 ありがとうございます。
ふと、ベンチ書けば済むことに気が付いたんだけど、先に見て良かった。
一応、今度暇な時に試してみよう。
>>270 メソッド呼び出しのオーバーヘッドやレシーバの再帰評価がないぶん、
文字列補間のほうがメソッドチェーンよりも速いはず。
RubyってEXE形式にできますか?
exerb
>>274 なかなか良さそうですね
ありがとうございます
GUI欲しい時
>>276 おっ、それしらなかたよ
すげぇRubyのみで作られてるしw
Rubyforge歩いていると偶然発見した。 暇な時みると結構、おもろい > Rubyforge
るびまで紹介記事連載キボンヌ
Exerb は税金使って作ってたけど いい感じに仕上がったの?
普通に使えてるから、ま、仕上がったと言えるんじゃね?
税金使ったと言えば、税金で .NET な Ruby 作ってた奴いなかったっけ? あれはどうなったんだ?
金金うるさい奴らだな。 金なんてホームレスでもない限りそう珍しい物でもないだろ。
金はどうでもいいが、あの .NET の Ruby はどうなったんだ?
exerbって1.8.4では使えないんじゃなかった?
税金も払っていないニートのくせに。
バレたか!
消費税は払ってるよ。
税金はどうでもいいから、本当にどうなったのかは興味があるなあ。 ある程度でも成果があればそれを生かして先に進めるかもしれんしさ。
>>292 大丈夫。ちゃんと税金は作者の懐に入りましたよ。
疑問や文句があるなら税金を使った奴ではなく税金を渡した奴にまず言えよ。
なんでもいいが while stack_arr.size > 0 〜 end よりも until stack_arr.empty? 〜 end のほうが遅いのは残念だと思った
297 :
デフォルトの名無しさん :2006/04/06(木) 21:45:39
すみませんが、質問です。 改行を含んだ文字列があるのですが、それを最初の一行と、残りのすべての行 とに分けるには、どのような処理をするのが良いでしょうか? 文字列ではなく、ファイル入出力だったら title = io.gets body = io.read でできると思うのですが。
素人の作品 array = kaigyomojiretu.split("\n") title = array[0] body=array[1..-1].join("\n")
splitは第二引数で最大分割数指定できるから title, body = str.split(/\n/, 2) みたいな感じでいいんじゃね?
300 :
297 :2006/04/06(木) 22:07:02
>>298-299 ありがとうございます。これでうまく行きそうです。
それはそれとして、文字列をストリームとして扱う方法は無いのでしょうか?
ヒネた解としては StringIO を使うとか。 require 'stringio' StringIO.new(s) do |io| title = io.gets body = io.read end
str =~ /(.*?)\n(..*)/m title, body = $1, $2
ストリームは知らんが eachで一行ずつ読んだり、each_byteで一バイトずつ読んだり、<<で連結したりは ストリームと同じ感覚でできるな
304 :
297 :2006/04/06(木) 22:25:53
ありがとうございます。いろいろ参考になりました。 Rubyって本当に便利ですね。 まあ、私が使っているのは、実はJRubyなのですが。
title, body = str.split("\n", 2) でいいんじゃないっけ?
306 :
305 :2006/04/06(木) 23:03:51
299で既出じゃん。さらりと読み飛ばしてた。
touch(1) 相当の処理 (指定のファイルが無ければ creat(2) し、 あれば mtime を現在時刻に変更、エラー通知は返り値でも例外でも可) するのに 手っ取り早い方法ってあるかな?
FileUtils#touch があるけど
>>308 おお、ありがとうございます。これで十分です。
あ、細かいこと言うと #touch ではないですけどね・・・
Shell#foo(args)で`foo #{args}`を呼び出す機能作ればすべて解決
プラットフォームを限定すればね。
module Shell def self.method_missing(cmd, *args) `#{cmd} #{args.join(" ")}` end end
>>276 これってソース隠避できるわけじゃないんだね
% cat ls.rb require "shell2ch" Shell::ls("C:/Program Files") % ruby ls.rb ls: C:/Program: No such file or directory ls: Files: No such file or directory
インスタンスメソッド定義するときにわざわざ self. つける人って少ないよな?
self はメソッドからセッタ呼ぶ時によく使うが。 self.items = value そのまま items = value って書くと ローカル変数 items に代入されちゃうからね。 あと、俺はメソッドの引数に self を渡すの覚えたら OOPL が手放せなくなった。
@items = value これあかんの?
>>319 単純に代入だけのセッタならそれも可。
けどセッタの中で代入値の判定や
その他の処理が入ってるとそうもいかないワケ。
Ruby初心者スレッドPart5:>321: undefined local variable or method `コン゜ハイル' for main:Object (NameError)
>275 >なかなか良さそうですね チミは山田オルタネイティブをしらんのかね。
Marshalって何ですか? Marshalさんが作ったシリアライズの方法の一つ? Marshalの仕様書ってRFCとかで決まっている? シリアライズはオブジェクトをファイルやネットワークでやり取りするために文字列に変換すること。 という理解で良い?
WebページのコンテンツをURLを指定するだけで取得できるようなクラスとかってありますか? net/httpだとホスト名とパスをわけないといけないようなので、URLをそのまま指定できるようなのがあったら使いたいと思っています。 (もちろんないならnet/httpでがんばります) PHPで言うと、fopenとかfile_get_contentsとかにURLがそのまま使えるので、同様の手軽さが欲しいと思った次第です。 そのようなクラスやライブラリ等わかる方いらっしゃいましたらよろしくお願いします。
それって、そんなに煩わしいか? ひょっとして、URI クラス等を知らないのか? どうしても、そのままというなら、俺なら wget でも呼び出……いや、あんまりメリットねぇなぁ。
お前のレスが煩わしい
mar・shal
━━ v. (〈英〉-ll-) 整列[整理]する[させる]; (儀式ばって)案内する.
marshaling yard 【鉄道】操車場.
なのはいいけど、これとシリアライズとどういう関係が?
open ("
http://sample.jp/sample.html ")
ってできなかったっけ?
出来なくても、ore_php_like_openとか作って使えるようにすればいいよね。
>>324 マーシャリングとシリアライズは同じ意味。仕様は無い。理解は大体それで合ってる。
332 :
326 :2006/04/09(日) 12:38:48
>>327 即席のスクリプトとかで、htmlから抽出したリンクをたどって再取得して、それをまたいじって・・・みたいにするとき、さらっと書けたらいいなぁと思ってしまいました。
URIクラスはまだ使ったことなかったです。今度使ってみます!
>>329 ,330
なるほど!できました!
みなさま(特に
>>330 )ありがとうございましたm(_ _)m
open-uriじゃpostメソッドが処理できないと思ったが・・・。
>>326 がnet/httpに戻ってくることに500ツクモリン
335 :
デフォルトの名無しさん :2006/04/10(月) 02:02:31
if /cfm\?scode=(.*)">/ =~ line n225 = n225 + " " + $1.to_s end
zip, rar, lzh の使い分けを意識しないで使える展開ライブラリないですか?
統合アーカイバリンク汁
340 :
338 :2006/04/10(月) 22:38:04
xacrett?
っていうかrarが入ってる時点で厨臭い
338ではないけれど、俺もやり方を知りたい 統合アーカイバのdllをwin32apiから呼び出すような感じ?
先生! pack テンプレート文字列が憶えられません!!
Windowsだと思わなかった俺
そして、エスパーの多いスレ
アーカイブいじるような実用的なコードはWindowsに決まってるだろう。
挙句に、無知馬鹿様も居るスレの様だw
>>349 そんな、改まって自己紹介なんかされなくても
>344 リファレンスのpackテンプレートのページを印刷して携帯だ。
352 :
343 :2006/04/12(水) 00:11:54
>>345 ありがとう! こんなライブラリがあったとは…
Hikiについてなんですが、 レンタルサーバー(ロリポップ)でrd+ styleを使うときって、具体的にどうしたらいいんでしょうか。 スレ違いだったらゴメンナサイ。
irb(main):001:0> File.stat("/etc/passwd").mode => 33188 ファイルモードの取得というのをしたいんですけど、 33188ってこれはファイルモードというんでしょうか? ファイルモードというと、 0600みたいなのだと思ってたんですけど、違うんでしょうか?
>353
Ruby言語そのものの話題ならここだけど
多分Wikiの話はWebProg板向きの話題になるんじゃないだろか。
WEBプログラミング@2ch掲示板
http://pc8.2ch.net/php/ のWiki系のスレをまずはROMってみては。
>>354 irb(main):001:0> "%o" % 33188
=> "100644"
普段のchmodコマンド等のほうが「わざわざ8進数に直して」提供されてるわけだな。
スペルチェックソフトの実装ってありませんか?
質問です。 IO.popen("#{exe_path}","w+"){|io| io.print File.read(input_file) io.each{|line| p line } } exe_pathの外部プログラムにinput_fileをパイプで渡して その出力を得たいのですが、入力のパイプだけをクローズすることはできないでしょうか? 上記ソースだと、入力IOのクローズ待ちでだんまりになってしまいます。 ボスケテ
361 :
360 :2006/04/16(日) 13:00:20
自己解決しました…すいません IO#close_write
結構マニュアルに書いてあるな
自作のスクリプトを ruby -r prpfile したら % cumulative self self total time seconds seconds calls ms/call ms/call name 34.48 10.25 10.25 8 1281.25 1956.25 Marshal.dump 25.53 17.84 7.59 409 18.56 83.86 Array#each 18.00 23.19 5.35 36409 0.15 0.15 Kernel.respond_to? 6.73 25.19 2.00 11944 0.17 0.17 Hash#[] 6.42 27.10 1.91 12373 0.15 0.15 String#=~ とか言われました。 3万回の Kernel.respond_to? が気になって仕方ないんですが 一般的には何してるものなんでしょうか?
ヘルプを読むんだ!
エスパーさんお呼びですよー
よーわからんが自分で書いた覚えがないならrequireで読んだファイルの中で使ってるんじゃないの
全部の自作メソッドに明示的に public とか書きまくったら消えるのかも
誰か無駄な柔軟性取っ払って字面だけRubyで10倍高速なRubyRite作ってクレクレ
MWタソ出番ですよ?
>RubyRite の所で笑えばいいんですかね。
>>368 残念ながらRuby2.0の開発コードがRiteです
Windowsでファイルをごみ箱に捨てるスクリプトを 誰か示してくれませんでしょうか。 Win32API で SHFileOperation とかいうのを 使えばよいらしいということは分かったんですが、 Win32APIの使い方がさっぱりです。
#!ruby require 'fileutils' FileUtils.mv('お好きなファイル', 'ごみ箱') でダメ?
ASR使っとけ
ActiveScriptRubyって結局何ができるのか 未だによく分からない俺 オススメの書籍とかWebページとかありませんか?
>ActiveScriptRubyって結局何ができるのか >未だによく分からない俺 パソコン買って結局何が出来るのか 未だによく分からない俺よりマシだから オススメの書籍とかwebページとか無くてもきっと強く生きていける。 だから1人で頑張れ。
>>372 お、ファイルが消えた!
と思ったら、カレントディレクトリに「ごみ箱」というファイルが。
そら、そうなるわなぁ。
で、新たに、次のような感じで「ごみ箱」のパスが取得できる
ことが分かったんですが、
require 'win32ole'
shell = WIN32OLE.new('Shell.Application')
dir=shell.Namespace(0xa).Self.Path
p File.exist?(dir) #=>false
そんなディレクトリはねぇ! っていわれるんですよねぇ。
んー。
| ̄``''- 、 | `゙''ー- 、 ________ | ,. -‐ ''´ ̄ ̄`ヽ、_ / |, - '´ ̄ `ヽ、 / / `ヽ、ヽ / _/ ヽヽ/ / / / / / / ヽハ く / /! | 〃 _/__ l| | | | | | | ||ヽ \l// / | /|'´ ∧ || | |ー、|| | | l | ヽ /ハ/ | | ヽ/ ヽ | ヽ | || /|ヽ/! |/ | ヽ / | ||ヽ { ,r===、 \| _!V |// // .! | | || |l |ヽ!'´ ̄`゙ , ==ミ、 /イ川 |─┘ | ハ|| || | """ ┌---┐ ` / // | V !ヽ ト! ヽ、 | ! / //| / ヽ! \ハ` 、 ヽ、__ノ ,.イ/ // | / ┌/)/)/)/)/)/)/)/)/)/)lー/ ` ー‐┬ '´ レ//l/ |/ |(/(/(/(/(/(/(/(/(/(/│|| |\ 〃 r'´ ̄ヽ. | | ト / \ /  ̄`ア | | | ⌒/ 入 〉  ̄二) 知ってるが | | | / // ヽ 〈! ,. -' | | ヽ∠-----', '´ ', | \| | .お前の態度が | |<二Z二 ̄ / ', | | | _r'---| [ ``ヽ、 ', | | | 気に入らない >-、__ [ ヽ ! \.| l. ヽ、 [ ヽ | ヽ| \ r' ヽ、 |
>>381 >おいしい米をあげるから、頼むよ。
どういう口説き文句だww
澪がもらって喜ぶのって米だっけか…… いや、ヲタ話ゆえ忘れてくれ。スマソ。
function remove(filepath) { var shell = new ActiveXObject("Shell.Application"); filepath = fso.GetAbsolutePathName(filepath); var folder = shell.NameSpace(fso.GetParentFolderName(filepath)); if (folder != null) { var folderItem = folder.ParseName(fso.GetFileName(filepath)); if (folderItem != null) { folderItem.InvokeVerb("削除(&D)"); folderItem = null; } folder = null; } }
387 :
デフォルトの名無しさん :2006/04/18(火) 17:02:42
Win32APIでDLL内のとある関数を呼び出したところ 戻り値の型指定が'i'だと整数値(アドレス)が、'p'だとそのアドレスの内容(文字化けした文字列)が 帰ってきました。 この文字化けした文字列を.unpack('L*')とすると、アドレスと思われる数値が6つでてきました。 C言語の知識はあまりありませんが、DLLのソースに含まれる.hファイルを見る限り どうもメンバを6つ持つ構造体のようです。 上記で取得したアドレスと思われる数値から そのアドレスの中身(整数値や文字列)を取得する方法はありませんでしょうか。
>>387 とりあえず、その構造体を貼れ。話はそれからだ。
安全にやるならWin32APIじゃなくてdlを使うべきだね。
標準エラー出力を$0+'.log' *にも*出力するようにしたいんですがどうすればいいんでしょうか。
open(fname+'.log' 'w') do |logf| out = 'Ruby上ならこれで良いやん' STDERR.puts out logf.puts out end 汎用的に使いたいなら 標準入力をそのまま標準出力とファイルの 両方に出力するスクリプト書いてパイプで渡すとか。
ぐは、iMona だと半角カンマが改行になるの忘れてたorz
>>388 レスありがとうございます。
とりあえずdlについて調べてみます。
人いなさそうだから告白するが 俺はいつもこう書いてる 一 → 十 → 米
回答者じゃないけど
>>393 >お米、欲しい?
だからなんで米なんだwwwwわけわかんねー
がんばってね。
お米ワロス
恐らく同じ鍵キャラの上月澪(AAの元ネタ)と遠野美凪(「……お米券、進呈」が口癖)がMix-inされてるんだろう てかヲタ話スマソ # 厳密には澪は「鍵」キャラではないがどうでもいいでつねスミマセン
398 :
387 :2006/04/19(水) 01:11:44
>>387 =
>>392 です。
dlを使って無事、構造体を取得できたのですが、ひとつ分からないので質問します。
struct _cabocha_chunk_t
{ int link; size_t head; size_t func; double score;
char *rel; char *feature[128]; };
こういう構造体のポインタ(DL::PtrData)を取得し、
ptr.struct!('IIIDSS128', :link, :head, :func, :score, :rel, :feature)
という具合にデータ型を定義したのですが、
なぜかptr[:rel]がnilになり、ptr[:rel]で取得できるはずのデータが
ptr[:feature][0]に格納されてしまうようです。
おそらくどこかでサイズがずれているような気がするのですが
原因、解決法などわかりますでしょうか。
>>397 ごめん。
鍵キャラとは全く関係なく、「米」の語感のみに頼った書き込みでした。
(AAの元ネタゲームをやった事がない)
実は、おいしい米を持ってるなんていうのも嘘です。
申し訳ありませんでした。
以後、このようなことのないように頑張っていく所存です。
これからもよろしくお願いいたします。
401 :
・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/19(水) 02:26:03
Windowsの時計を2039年にセットしてTime.nowやったらエロいメッセージが出てきた Cランタイムのtime関数固有の問題?
msvcrtは(71は試してないけど)2039年問題直撃だからなぁ
2039年にはRuby滅亡してるから無問題
IO.popen('yobidasi.rb', 'r') do |io| puts io.gets end yobidasi.rb 内で普通に出力したものは、上のスクリプトで出力できるのですが、 無限ループ内で出力したものは、止まってしまいます。 どの様にしたら、この様な出力を順次取り出すことができるのでしょうか?
ちょっと聞きたいんだけど Web::AgentとWebAgentってバージョン違い?
>>403 そうやって人々は2000年問題を放置してきた。
大問題にならない限り飯の種を後に残しておくのが良いプログラマ
× 良いプログラマ ○ 良い会社員プログラマ 会社という組織を経ない場合はとっとと直しておいたほうがよい 逆にいうと会社としてのリリースは保守の隙のない完璧品質にしてはイカン まあ、やろうと思って完璧にできるようなもんでもないが(w
ネタにマジレス
とても初歩的かつバカバカしい質問かも知れませんが 私は「恋するプログラム-Rubyで作る人工無脳」という本を買ったのですが 添付されていたCD-ROMについてるSampleを起動しようとすると ○○は内部コマンド、または外部コマンド、操作可能なプログラム またはバッチ ファイルとして認識されていません。と出てしまいます。 とても困っているのでどなたか力を貸していただければと思い 書き込みました。よろしくお願いします。
○○は何だ。
著者にきいてください
いじわるプログラムだな
○○は、D:\sample\proto です。 ちなみに著者はもう亡くなっているようです・・・
プロンプトから ruby -e "puts 'hello'" って打ってhelloと表示されるか? それでもエラーが出るならruby.exeにpath通せ。 やり方はインストール説明したヘルプなりWEBなりを参照しとけ。 その本て入門書なのか?
415さんありがとうございます。 試した結果helloという表示は出ました。 本にはRuby入門書としても最適と表記されていました。
ならインストールは問題なさげだな。 protoってなんだ?ディレクトリか? だったら cd /d d:\sample\proto と打って ruby sample.rb で実行。(sample.rbは実際のサンプルファイル名を指定する) protoがproto.rbってファイル名のサンプルソースなら cd /d d:\sample と打って ruby proto.rb で実行。
cd /d d:\sample まではいけたのですが、 ruby proto.rbで D:\sample>ruby proto.rb ruby: No such file or directory -- proto.rb (LoadError) となってしまいました。
ruby proto は?
>>418 メッセージ通り、proto.rbという名前のファイルが
そのディレクトリの中に見つからないと考えられる
> 本にはRuby入門書としても最適と表記されていました。 そうとは思えないな。 目的に沿ってるんで、基本や概念や哲学や標準の説明が弱い。 他の入門書を並列するか、 分からないことを片っ端からリファレンスを熟読する気概がないと。 # CD-ROM ドライブがD:とする C:\Documents and Settings\user>cd d: d:> cd sample d:\sample>cd proto d:\sample\proto>dir # => proto.rb が存在することを確認 d:\sample\proto>ruby proto.rb でどう? proto ディレクトリに入らないと、proto.rb が無いよ。 もしくは、スクリプトを絶対or相対パスで指定しないと。
質問です。 少数を含む計算で例えば、 16.9 - 16 とやると0.899999...(以下9が10コくらい続く)という値になるのですが、 これって何故なんでしょうか。 15.9 - 15とか10.9 - 10とかだと正しく0.9になるんです。 使用しているRubyのVersionはruby 1.8.2 (2004-12-25) [i386-mswin32]です。
…なんだこれ。
これは、他の言語でもよく起こるんだが、16.9 は10進数では有限小数だけど コンピュータの内部では2進数で有限小数ではないんだよね。 そこから 16.0 を引くと桁落ちが起こって計算の精度が落ちてしまうってことだ。 浮動小数点数を使ってるなら仕方がないこと。 引き算するときに、10の何乗かをかけて整数にしてから計算したり BigDecimalとかのライブラリを使えば回避できると思うよ。
irb> 4.4-4.0 => 0.4 irb> 8.4-8.0 => 0.4 irb> 16.4-16.0 => 0.399999999999999 irb> 32.4-32.0 => 0.399999999999999 irb> 64.4-64.0 => 0.400000000000006 irb> 128.4-128.0 => 0.400000000000006 irb> 128.4-127.0 => 1.40000000000001 irb> 128.4-126.0 => 2.40000000000001 irb> 128.4-125.0 => 3.40000000000001 irb> 128.4-124.0 => 4.40000000000001 irb> 128.4-123.0 => 5.40000000000001 irb> 128.4-121.0 => 7.40000000000001 irb> 128.4-120.0 => 8.40000000000001 irb> 128.4-119.0 => 9.40000000000001 irb> 128.4-118.0 => 10.4 確かに桁丸めとか桁落ちとかなんかあのへんのめんどくさいやつの問題っぽいな
そこで Rational ですよ。 で、 Rational って何?
有理数
>>404 このままじゃわからん
無限ループ内で出力しているコードをさらしてみ
あと「このような出力を順次取り出す」というのが意味不明
>>428 こういうことだろう。
#print.rb
-----------
#!/usr/bin/env ruby
IO.popen('./clock.rb', 'r') do |io|
puts io.gets
end
-----------
# clock.rb
------------
#/usr/bin/env ruby
puts 'start.'
60.times do
puts Time.now
sleep 1
end
puts 'end.'
-----------
$ ./print.rb
start.
end.
$
Time.nowのとこも1秒ごとに出力されることを期待したんだがなんも表示されなくて困る、と。
誰か431を回収しろ。死亡事故の危険性があるぞ。
433 :
デフォルトの名無しさん :2006/04/20(木) 20:01:26
モジュール内で定義されたクラスから、親モジュールを相対的に参照するには どうしたらいいのでしょうか。 具体的には,以下のスクリプトでbar!と表示したいのですが… module Foo class Yeah def initialize Foo.hello end end def hello puts 'Foo!' end module_function :hello end module Bar include Foo def hello puts 'Bar!' end module_function :hello end foo = Bar::Yeah.new
434 :
404 :2006/04/20(木) 20:15:19
>>428 分かり難くい書き込みで申し分けありません。
だいたい
>>430 さんが、説明してくれた通りです。
>>430 の内容だと、ループが終わり次第、まとめて出力されるのですが、
無限ループの場合は、どうしたら良いのかが分からないのです。
めんどくさいから上のほうの書き込み読まないでレスする STDOUT.sync=true ってやっとけばputsしたのを即座に吐き出す
値を真偽値に変換するいい方法ありますか。 今は flag = value ? true : false としているんですが、もっとスマートな書き方があれば教えてください。 flag = value.to_bool とかあるとうれしいんですけど。
flag == value の結果は真偽値で返ってくると思うが…
ごめん勘違いした
>>433 module Foo
def hello ; puts 'Foo!' ; end
module_function :hello
end
module Bar
include Foo
def hello ; puts 'Bar!' ; end # (*1)
module_function :hello # (*2)
end
(*1)では子モジュールBarで親モジュールFooのインスタンスメソッドFoo#helloを
オーバーライドしているが、これはFoo#helloにもFoo.helloにも影響を与えない。
(*2)で Bar.hello を定義するが、これは Foo.hello には影響を与えない。
たぶん(*1)でFoo#helloの定義が書き換えられるか、(*2)でFoo.helloが書き換え
られるかのどちらかを期待してるのだと思うけど、どちらもそうはならない。
違う方法を検討してください。
最終的に何がしたいのかよくわからなかったので、もっとうまく説明してみて。
>>436 to_bool というのは無いので自分で書くしか。
module Kernel
def to_bool
self ? true : false
end
end
value = 123
value.to_bool # => true
123.to_bool # => true
true.to_bool # => true
false.to_bool # => false
nil.to_bool # => false
to_boolがどういうときに必要なのかよくわからんす。 inspectしたときの見栄えかな。
def flag? value ? true : false end
>>439 いや、Foo.helloを上書きしたいというより
include Fooしたときに
def initialize; Foo.hello; end
のFoo.helloがBar.helloになるように相対的に指定できないかということです。
でもまあ、調べてみた限り、根本的にそういうことはできなそうですね。
Class.nestingとか調べてみましたが、includeされたclass Yearは、あくまでFoo::Yearのようです。
includeではなく、別の方法を考えることにします。ありがとうございました。
>>422 >>425 ご丁寧な解説ありがとうございました。
小数で3.5時間とかを3時間30分というふうに変換するScriptを
作ろうとして分を算出するのに、(x.xx - x.00) * 6とやろうと
したらうまくいかないケースがあってハマっていました。
素直なやり方では正確な計算はできないようなので、別の方法
で解決します。
でもこの小数問題って困るんだよね。こんな「簡単な計算」もまともにできないのは。 どっか誰かがブレイクスルーでも起こして根本的解決されないかな。
っ Bigdecimal
>>443 def initialize; Foo.hello; end
のかわりに
def initialize; self.class.hello; end
としてみては?
つまりFooというクラス名を指定しないようにするわけ。
>>448 よくみたらclass Yeahはmoduleをincludeしているわけではないから、これではだめだね。
ごめん。よく読まずに書いちゃった。
ただFooを埋め込んでいる限りはだめだから、クラス名やモジュール名を直接埋め込まないような方法を考えてみて。
450 :
デフォルトの名無しさん :2006/04/21(金) 00:43:58
Rubyの文法は一通り勉強して理解できました。 次に何をすればよいか悩み中。何やって良いか おしえれけれ
RD記法のひとりWikiを作ってくれ
却下
自分用の便利なツールを作る
おちてる
まあいつものことだから都度報告することもないかと。
>>453 net/httpとregexpを駆使して何か作る、というのが昨今の勉強のスタンダードのような気がする。
できたものもそこそこ便利かもしれないし。
一昔前の「シェルコマンドの動作をするスクリプトを作ってみよう」よりはなんぼか作り甲斐がある。
素人製凶悪Webクローラーがぽこぽこできてしまう原因でもあるが。
そうとう歪んだ「一昔前」と「昨今」を歩んで来てるんだな。
Webrickで串でも書いた方がいいんじゃねぇの。 でなきゃRSSリーダとかブログ管理ツールとかでも書けば。
RSSのないサイトをスクラップしてRSSに変換するフィルタとか
それなんてMyRSS.jp?
>>435 ありがとうございます。
>>430 の times の様にループが終了する場合は大丈夫な様ですが、
無限ループの場合には、駄目な様です。
こういった利用は不可能なのでしょうか?
>>462 それもしかしたらRuby関係ないかも。Perlで書いても同じじゃないか。
パイプから読み込むときは、バッファがいっぱいになるか、パイプがクローズ
されないと、読み込むことができないんじゃないっけ。
ループが終了する場合は読み込まれてるわけじゃなくて、書き込むプロセスが
終了してパイプがクローズされるから読み込まれているんだと思う。
だからパイプの仕様上ムリってのが答えのような気がするけど。
教えてえらいひと。
正式名称よくわからないんですが、 壁の表面を移動 して文字や絵を のような「iso-8859-1なHTMLファイルにおいて数値参照で書かれているShiftJIS文字列」を 壁の表面を移動して文字や絵を という日本語に変換してくれる便利なメソッドはないでしょうか。
>>462 >>435 は yobidasi.rb の方の話をしている (んだよね?) わけだが、理解してる?
わからなきゃ、とりあえず yobidasi.rb の側の出力部分のコードを見せれ。
>>463 やっぱりそんな感じでしょうか。
flush すると吐き出されたりしますし……
>>465 そういった質問ではなく、そちら側を弄ることを前提としてないので記述しませんでした。
もし yobidasi.rb 側の変更が必須ならば、バイナリ等の場合では無理ということですか?
>464 とりあえず間に合わせのすっごく泥臭い方法だが require 'nkf' src = "壁の表面を移動" puts NKF.nkf('-W16s', [src.gsub(/(\d+);/) {$1.to_i.to_s(16)}].pack("H*")) # "壁の表面を移動" # つか、数値参照なんだからShift_JISぢゃなくてUnicodeだそれ # あと、CGI.unescapeHTMLでできそうにも思えたがダメスorz
468 :
467 :2006/04/22(土) 02:50:24
やっちまったorz src = "壁の表面を移動" ね
--略-- <tr> <th>項目名</th> <th>最高</th> <th>最低</th> </tr> <tr class="hoge"> <td>気温</td> <td>16度</td> <td>9度</td> </tr> --略-- こういう内容のindex.htmlがあった場合、16度、9度の部分を取り出すにはどうすればいいのでしょうか? open("index.html") {|body| body.each {|line| if /<td>気温</td>\s*<td>(.*)<\/td>\s*<td>(.*)<\/td>/ =~ line print $1, $2 end } } とかやってもとれないです。 複数行にわたってる場合の文字列の扱い方を知りたいです。
470 :
465 :2006/04/22(土) 04:46:27
>>466 yobidasi.rb 側が flush (というか write() か) してくんなきゃどうあがいても read() できないっしょ。
>>469 lineは1行なんだから、<td>.*</td>¥n<td>.*</td>のように改行を含むパターンにマッチする訳がない。
body.each {|line|
puts line # ←これを追加して考えてみて
if /..../
print $1, $2
end
}
結論からいうと、この場合は1行ずつ読み込むのではなく、ファイル全体を読み込んでからパターンマッチさせる。
あと正規表現は「.*」(最長一致)ではなく「.*?」(最短一致)をつかうべし。
詳しくはマニュアルの正規表現のページをどうぞ。
s = File.read("index.html")
s.scan(/<td>気温<¥/td>¥s*<td>(.*?)<¥/td>¥s*<td>(.*?)<¥/td>/) do
puts "#{$1}, #{$2}"
end
あとこの場合は、いったん /<tr>(.*?)<¥/tr>/m にマッチさせておいてから、それから /<td>.*?<¥/td>/ で切り出したほうが柔軟性がある。
s.scan(/<tr>.*?<¥/tr>/m) do
record = $&
record =~ /<td>.*?<¥/td>¥s*<td>(.*?)<¥/td>¥s*<td>(.*?)<¥/td>/
puts "#{$1}, #{$2}"
end
>>471 現在、書き込みを読みながら試行錯誤させていただいてます
丁寧な説明ありがとうございました。
初めて知ったことがたくさん
473 :
469 :2006/04/22(土) 11:45:58
>>471 今望みの動作をするように書き直すことができました(^-^)
若干Rubyレベルが上がりましたよ
感謝
>>470 「抱き込んだ出力源からの出力をプールさせて吸い取る」芸当ができないか、という質問なんだと思う
475 :
474 :2006/04/22(土) 13:45:21
>>474 すまん、「抱き込んだ」「出力源」「プール」「吸い取る」「芸当」、全部意味がわかんね。
476 :
470 :2006/04/22(土) 13:46:04
プールってあれだろ、水着の女の子がいるところ
>>467 をを
…いやわかりやすくてありがたいです。
誰か作ってそうだけどそうでもないんですな。
>>479 コレでいけたり・・・
NKF::nkf("-e --numchar-input", src)
質問です #ruby -ku $KCODE="UTF8" などと書いて、utf-8でソースを書いているのですが、 Windowsでテキストを出力する際に、いちいちSjisに変換しています。 通常の出力は問題ないのですが、例外のメッセージなどは キャッチしないと変換できず不便です。 なにかスマートな方法はありませんか?
RSSをどうにかするのに「splitしてscan」からrexmlに変更したら スクリプトの実行時間が1秒ちょっとから4秒ちょっとにパワーアップした。 ('A`)
483 :
デフォルトの名無しさん :2006/04/22(土) 20:48:41
Rubyってなにがいいの?
書いてて疲れないとこ だけ
railsが使える
>>483 書いてて楽しい
スクリプトの開発効率がいい(ただし大規模な場合は別)
国産
発展途上なコミュニティに協力できる(笑)
RSSならscanして配列にして個々に要素scanでもたいして変わらんはずだな HTMLなら最初に配列にするための正規表現にもよると思うが
489 :
467 :2006/04/23(日) 00:51:53
>480 ……なんと。そんなんあったのか…… # NKFのオプション忘れたからカキコ前にリファレンス見に行ったのに……サイテーダオレッテorz
決まったRSSを読んでどうにかしたいって場合はREXML使うとちとごっついな RSSに合わせて正規表現書いたほうがさくさく動くかもしれない
勉強がてら2chに書き込みするコードを書いてるのですが、 Cookie必要な場合はどうすればよいのですか? POSTしようとすると、COOKIEがないと確認の画面に 飛ばされるだけで書き込みできません。 書き込みたいスレッドに書いたときに 保存されたIEのCOOKIEを使う? それとも、その確認の画面で投稿する ってリクエストを追加で送る? Net::HTTP使ってPOSTできるとこまでは何とかいけたのですが・・・
思いっきりスレ違いなような……
>>492 ありがとうございます
読んで色々やってみます
>>493 すいません・・・
HTTPクライアントで同一セッションとして色々リクエストを
投げるやり方も知りたかったので
いやいや。 ところで、goRua という Ruby 製ブラウザがあった気がする。 他言語のソースもあると思うけど、役に立つかもしれない?
>>495 そんなのあるんですね。ソース見てみます
ありがとうございます
>>492 のサイトを見て、
Set-Cookieの内容見て、header['cookie']にそれを設定したら
確認画面は出なくなりました
まだ、「フォーム情報が不正です」と出たり、
「ERROR:ブラウザを立ち上げなおしてみてください」とか出ますが・・・
そういえばクマの人が何か2ch関連のツールを作っているらしいが。。。 無関係だよな?
こういうのはMoon氏が得意だろ
>>497 無関係です。net/httpの勉強のついでって感じです
とりあえず簡単な書き込みならできるようになりました
色々教えていただいてありがとうございました
>>496 の時点で書き込みできなかったのは、ローカル側で
時刻生成してはいけないからでした。適当にtime=1で
POSTしたらいけました
>>469 最近同じ様なことをする機会があって、ためしに htree を使ってみたらこれ最高。
htree 厨になりそう。
require "htree"
require "enumerator"
html = <<HTML
<tr><th>項目名</th><th>最高</th><th>最低</th></tr>
<tr class="hoge"><td>気温</td><td>16度</td><td>9度</td></tr>
HTML
def find_elements_by_tag(e, tag)
["", "{
http://www.w3.org/1999/xhtml} "].map do |ns|
e.enum_for(:traverse_element, "#{ns}#{tag}").to_a
end.flatten
end
def get_text(e)
e.extract_text.strip.to_s
end
tree = HTree(html)
tr = find_elements_by_tag(tree, "tr")
th = find_elements_by_tag(tr[0], "th").map {|e| get_text(e) }
td = find_elements_by_tag(tr[1], "td").map {|e| get_text(e) }
h = th.zip(td).inject({}) {|h,e| h[e[0]] = e[1]; h}
puts h["最高"] # => 16度
RubyのソースをVC++でビルドしたいんですが、 エラーがでて出来ません。。。
>501 以下の質問に全て答えよ。 1. ビルドしようとしているRubyのバージョンは何か。 2. VC++のバージョンは何か。 3. その「エラー」とは何か。 4. ちなみにGnuWin32からrm.exeは拾ってきた?
>502 ありがとうございます。 1.ruby-1.8.4 2.VC++6.0 です。 3. >> lex.c(79) : error C2065: 'kEND' : 定義されていない識別子です。 ネット上にあったプロジェクトファイルからビルドした場合は >>error LNK2001: 外部シンボル "MyPopenRecord" は未解決です ってでました。 4.拾ってきてません。必要なのでしょうか?? ちなみにnmakeでruby.exeファイルは作れました。
504 :
デフォルトの名無しさん :2006/04/23(日) 22:05:09
WinXP + ASR1.8.4 (従ってShift-JIS)環境です。 puts /[て]/ =~ "呼" #=> 1 になるんですが、これって何故?
びっくりするほどゆうとぴあ
>504 "て呼".unpack("C*") #=> [164, 198, 184, 198] こういうことだと思う。
>>506-507 ありがとうございます。
こちらでも調べていて、s指定すればいいというのは分かったのですが
a = /[て]/s
puts a =~ "呼" #=> nil
b = Regexp.new("[て]", "s")
puts b =~ "呼" #=> 1
これはなぜだかわかりますか?
>508 irb(main):001:0> b = Regexp.new("[て]", "s") => /[\202\304]/i irb(main):002:0> b = Regexp.new("[て]", 0, "s") => /[\202\304]/s 文字コードの指定は第 3 引数ですよ。
文字列があったらてきとーに解釈してくれてもいいような気もするけどな
>>509 あっそうでしたか
ありがとうございました
配列だからわけわかんなくなるんだ。 ハッシュを渡すようにすればいい。 とか
キーワード引数マダー?
そういえば、そもそもキーワード引数の話って どうして出てきたの? 俺的にはハッシュ渡しで十分だと思ったんだが
ハッシュはPerl4から5学んで挫折してた頃意義がよくわからなかったなあ あの時は連想配列って呼んでたと思うが 今は反動で文字データはハッシュばかり ちなみに今意義がわからないのはMix-inとかあのへん def の後ろに < とか > とかついてたら泣きそうになる
すいません、教えていただけないでしょうか。 英語サイトからhtmlファイルを取得して、英単語毎にフォントタグを付けて出力ということをやろうとしています。 それで、htmlsplit.rbを使ってcharacterdataの所で、加工をしてやっていたのですが、 <script>タグで囲まれてる範囲にある"<"をタグのスタートと認識してしまいます。 中で、<script>、、、for(i=0;i<nl;++i,),,,,,,,,,</script>という場合のi<ni;sの部分です。 こういう場合は、htmisplitを使わずに,scriptに囲まれてる範囲を事前に場合分けするしかないのでしょうか?
>>517 たぶんYES。
「HTMLの中」にある < は仕様上タグの開始部だから。
<script…>〜</script>に挟まれた部分は本来HTMLから見てコメントになってなければならないはずなんだが
へなちょこHTML書きとおせっかいブラウザのせいでコメント化されておらず「HTMLの中」になってることが多い。
<!-- と --> に囲まれた部分、<script と </script> に囲まれた部分、
<style と </style>に囲まれた部分あたりは事前に除いておくべきだと思う。
519 :
517 :2006/04/24(月) 20:48:09
ワンライナの挙動が mswin32 版だけ違う気がするのですが仕様なのでしょうか? ruby 1.8.2 (2004-12-25) [i386-mswin32] の場合 > ruby.exe -ne 'p $_=~/^a/' a <=入力 0 <=出力(以下同様) b nil @a 1 <=ここが変 ruby 1.8.2 (2004-12-25) [sparc-solaris2.7] の場合 > ruby -ne 'p $_=~/^a/' a 0 b nil @a nil <=これが正常ですよね?
521 :
520 :2006/04/25(火) 01:34:57
>>520 ですがダブルクォーテーションにしたら正常でした。ごめんなさい。もう寝ます。
>503 放置スマソ、ってまだ見てるかなorz で、手元でビルドしてみたけどnmake testまですんなり通った。 つかおまいさんも >ちなみにnmakeでruby.exeファイルは作れました。 なわけだ。するってえとそのlex.cのコンパイルエラーはどこで出たのかいな? ちなみにrm.exeはREADME.win32に書いてあると思って言ったんだが rm.batなんて添付されてるのね(´・ω・`)シランカタ
gsubの様にメタ文字や正規表現の解釈を行わない 単純な置換ってどうしたら良いでしょうか。
>523 "hoge".gsub('ho','fu') #=> "fuge"
>>525 ruby feedparser でぐぐれ
標準添付のでは駄目。
527 :
523 :2006/04/25(火) 10:26:11
>524 第2引数に \0〜\9 等があった場合 自己展開してしまうという意味でしたが ブロックを渡す形式に変えて自己解決しました。 print '>>> ' replace = gets.chomp p 'abcabc'.gsub(/b/, replace) p 'abcabc'.gsub(/b/) { replace } # ruby test.rb >>> (\&) "a(b)ca(b)c" "a(\&)ca(\&)c"
528 :
523 :2006/04/25(火) 10:28:21
"a(\&)ca(\&)c" じゃなくて "a(\\&)ca(\\&)c" ですね。色々すいません…
>>486 その発展途上なコミュニティに協力しようと思うんだが
なにからはじめればいい?
C言語
>>529 メイドイン海外の有名モジュール類のチュートリアルやマニュアルの和訳
というのはどうだ
>>520 cmd.exeからは本来シングルクォートで引数をくくって渡すことは
できないのだけど、mswin32版rubyはその辺自前で処理している。
それでも、^ はcmd.exeにとっての特殊キャラクタなので、
rubyに渡される前にcmd.exeが食っちゃってる。
で、rubyには/^a/ じゃなくて /a/ で渡されてきているので
そんな動作になる。
ruby -e 'print ARGV[0]' ' /^a/'
とでもやってみて出力を確かめてみ。
irb(main):001:0> print /td bgcolor/ =~ "<td bgcolor" 1=> nil irb(main):002:0> print /<td bgcolor/ =~ "<td bgcolor" 0=> nil なんでやねん
何もおかしくないと思うが
>>533 irb> print /td bgcolor/ =~ "td bgcolor"
0=> nil
irb> print /td bgcolor/ =~ "<td bgcolor"
1=> nil
irb> print /td bgcolor/ =~ "<<td bgcolor"
2=> nil
irb> print /td bgcolor/ =~ "<<<td bgcolor"
3=> nil
irb> print /td bgcolor/ =~ "d bgcolor"
nil=> nil
Rubyではマッチ位置は0から数える
Rubyの0はtrue
>>526 ありがとー。
でもなぜか日本語まじりだと正確にパースできないみたい。Ruby1.8.2で再現。コードは下記のとおり。
#!/usr/local/bin/ruby -Ke
require 'feedparser.rb'
require 'open-uri'
require "kconv"
require 'net/http'
require 'uri'
#uri = '
http://rss.slashdot.org/Slashdot/slashdot ' #こちらは正常だが、、。
u = '
http://blog.livedoor.jp/dankogai/index.rdf ' #日本語まじりだと、、?
s = Net::
HTTP::get URI::parse(u) ; f = FeedParser::Feed::new(s) ; titles = ""
f.items[0..15].each { |i| titles << '<li>' + i.title.to_s.toeuc + '</li>' }
require 'cgi' ; cgi = CGI.new('html4')
cgi.out{ cgi.html { titles } }
__END__
REXMLから作りなおそーかなぁ。
<?xml version="1.0" encoding="UTF-8" ?>
>>537 $KCODE の設定に依ってパースできなくなるようではライブラリとして失格ではないか、
っていう話なのでは?
因る不具合が問題なんであって、 依ってパース出来ないことが問題なんじゃないと思うよ。
え?え?どゆこと?パースできない==不具合だと思うんだけど?
rexmlは、割とあらゆる面でライブラリとしては失格気味。
inspect のエンコーディングだけを変更するインターフェイスが欲しい。
543 :
533 :2006/04/26(水) 20:16:49
>>534 , 535
ああ、悪かった
マッチしたら1が返るのかと思ってた
544 :
536 :2006/04/26(水) 23:39:40
feedparser/textconverters.rbの String#toUTF8と、String#rmWhiteSpace!を超むりやりに修正したら、まーなんとかなった。まさにdirtyHackの上塗り。 < return self.gsub!(/¥A¥s*/m, '').gsub!(/¥s*¥Z/m,'') --- > return self.gsub(/^¥s+/, '').gsub(/¥s$/,'') < return self.unpack('C*').pack('U*') --- > return self.unpack('C*').pack('U*').toutf8 < return self #failsafe solution. but a dirty one :-) --- > return self.toutf8 #failsafe solution. but a dirty one :-) < return self --- > return self.toutf8 いじょ。
545 :
536 :2006/04/26(水) 23:43:04
>>541 >rexmlは、割とあらゆる面でライブラリとしては失格気味。
なんつーか、使いづらいライブラリ。っつーかなんなんだあの中途半端な機械的日本語訳がついてるリファレンスは。正直うざい。
>>542 >inspect のエンコーディングだけを変更するインターフェイスが欲しい。
同感。きょう野良仕事していてそれは痛感した。
>>531 なるほど
じゃぁなんか和訳してみるか
ちなみにどの辺攻めたら人気者になれる?
英文があるかは知らないが Webrick のチュートリアルは何度も要望があがってる気がする
>>547 英語のチュートリアルでも詳しくは書いてない希ガス。
なんか英語のドキュメントあさってもあまりまともなのは出てこなかった気がするが。
むしろ、英訳の方が人気者になれたり。
Rubyの拡張ライブラリを作りたいんだけど、リファレンスってある? それとも、ruby.h 読みながら勝手にやってってこと?
README.EXT, README.EXT.ja は読んだ?
>>552 ありがとう。
全然調べ方がなってなかったようです(´・ω・`)
555 :
デフォルトの名無しさん :2006/04/27(木) 15:21:02
syn = [:a, :b, :c, :d] list = syn.collect{|x| [x, nil]}.flatten puts list.size #=> 8 hash = {list} #=> odd number list for Hash これってなぜですか?
ごめんちゃい syn = [:a, :b, :c, :d] list = syn.collect{|x| [x, nil]}.flatten hash = Hash[*list] でいけました
557 :
デフォルトの名無しさん :2006/04/27(木) 18:35:51
class Foo @hash = {} def []= (key, value) @hash[key] = value if yield(key) end end こんな感じで[]=にblockを引き渡すことは可能でしょうか?
>>557 そのまんまでできるよ。
呼び出すのは大変だがな。
559 :
デフォルトの名無しさん :2006/04/27(木) 21:49:51
>>558 レスありがとうございます。
もう少し詳しく教えていただけませんでしょうか。
できれば
foo[key] = value {|x| ... }
のように呼び出したいのですが、これでは無理なようです。
どのような書式を利用すればよろしいのですか。
class Foo def initialize @hash = {} end def []= (key, value) @hash[key] = value if yield(key) end def [] (key) @hash[key] end end foo = Foo.new pr = proc{|k| k.is_a?(Symbol) ? true : false} foo.__send__("[]=", "a", "b", &pr) foo.__send__("[]=", :a, :b, &pr) p foo["a"] #=> nil p foo[:a] #=> :b
562 :
529 :2006/04/28(金) 00:47:35
>>549 英訳って・・・・ムリス
Webrickかー
さんきゅー探してみるわ
ポーペン
568 :
1/2 :2006/04/29(土) 01:05:55
すみません、JRubyなのですが、ファイル入出力で日本語を通すには、どう したらよいのでしょうか?文字コードは EUC-JP です。 通常のRuby だと日本語のファイル入出力は何の問題もないのですが、 hoge.txt: 空にあこがれて 空を駆けてゆく あの子の命は ひこうき雲 ------------ file_encode.rb: File::open("hoge.txt") {|f| f.each {|line| print line } } puts $KCODE ------------ $ ruby file_encode.rb 空にあこがれて 空を駆けてゆく あの子の命は ひこうき雲 NONE 以下、JRuby版 に続きます。
569 :
2/2 :2006/04/29(土) 01:07:54
同じことをJRubyでやると、文字化けしてしまいます。
build00.xml:
<project>
<script language="ruby"><![CDATA[
File::open("hoge.txt") {|f|
f.each {|line| print line }
}
puts $KCODE
]]></script>
</project>
------------
$ ant -file build00.xml
Buildfile: build00.xml
[script] ¶!)!)!)!)¢!)!)!)¬!)!)!)!)!)!)¶!)!)!)¶!)!)±!)!)!)!)!)!)
[script] !)¢!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)±!)
[script] UTF8
BUILD SUCCESSFUL
Total time: 6 seconds
念のため、以下を参考にライブラリを組み込んでみても同じでした。
http://diary.lampetty.net/20050110.html#p02 ちなみに、require "kconv"; Kconv.toeuc(line)とすると、以下のエラーになります。
BUILD FAILED
/home/waragai/build00.xml:2: org.jruby.exceptions.RaiseException: undefined method `nkf' for NKF:Module
以上です。よろしくお願いします。
パイプ開いて自力で解析して自力で出力するのが正しい希ガス。 そもそもパイプはわかるか? ポートは? たとえば実行状況と実行結果が違うポートに出されるなら、単に別のポートで受け取るだけだからまあまあ普通に処理できる。 しかし、結果も状況も同じポートに吐き出されるなら、その出力を自力で解析してやる必要がある。 まあそれがわかってるならそもそも初心者スレで聞いたりしないとは思うわけだが。
Javaって時点でutf-8しか想定してないと思う。 バイト列として読んで、自分で文字列に変換しないと無理では?
my_ruby_script.rb: 100: (1..count).each do |i| 何かの処理 200: end にしといて、count = 1000だと my_ruby_script.rb:100: bad value for range (ArgumentError) とか言われるけど、あんまりスマートじゃないwhileとi++使うしか無い?
そんなエラー出ないと思うけど。
>>572 その1000は文字列であるに5にゃんこ。
数値を代入させるようにするか、(1..count.to_i).each do |i|に書き変えれ。
to_iでできた。 エスパーありがとう。
576 :
568 :2006/04/29(土) 20:50:56
577 :
デフォルトの名無しさん :2006/04/29(土) 20:57:35
re = /きしゃ/ text = "きしゃのきしゃはきしゃできしゃしました" matchdata = re.match(text) このコードでは最初のマッチ部分のデータ(MatchData)が取得できるわけですが、 マッチングを文字列の最後まで再帰的に行って、すべてのマッチ部分のデータを取得する 簡単な方法はないでしょうか。 現在は、re.match(str[pos..-1])のような形で、ひとつひとつマッチデータを取得していますが この方法だとoffsetをいちいち修正しなくてはならず、とかく不便です。 Ruby1.9だと、re.match(str, pos)のようにして、offsetをずらさずに開始位置を指定できるそうですが 1.8.4では、自分で関数作って、地道に処理するしかないでしょうか。
re = /きしゃ/ text = "きしゃのきしゃはきしゃできしゃしました" text.scan(re){|match| p match }
>>578 レスありがとうございます。
ちょっと誤解のある質問の仕方をしてしまったかも知れませんが
取得したいのはMatchDataオブジェクトの集合です。
scanメソッドだとStringsしか取得できないので、目的に適わないようです。
>>579 text.scan(re){p $~}
1.9で修正されてるなら、自分でパッチ当てればいいと思うなあ。 困ってるなら1.9にすればいいじゃんと思うけど。 修正されてない184で、簡単にできる訳ないよね。簡単にできるくらいなら修正の必要ないし。
text.enum_for(:scan, re).map{$~} こんなんかねぇ
煽りとかじゃなく素朴な疑問なんだけど 行区切りにセミコロン省略可だったり case .. when .. else .. end とか def .. end とか 他言語と比べてスットンキョな事にしたの?
>行区切りにセミコロン省略可だったり どっちかというと逆で、行区切にセミコロンも使えるってだけ >case .. when .. else .. end とか def .. end とか >他言語と比べてスットンキョな事にしたの? 何がスットンキョなのかわからん。 アンタが知ってる他の言語ってのが透けて見えるぜ。
>>583 case..esacとか[..]の]は引数でしたとかいうシェルスクリプトを知らないのかお前は
まぁ比較対象が間違ってるかもしれんけどな
スットンキョな返事がきた
改行文字:基本的に行句切り。但し幾つかの場合においては行が続いているとみなす セミコロン:リテラルの中で無い限り、改行文字と関係なく確実に区切る 感覚としては BASIC に似るかな。 余程スッdキョなコードで無い限り 行末にセミコロンなんて書かないよ セミコロン書くのは一行野郎したい時。
まぁ Lisper は Lisp に似ているといい、 Perlish は Perl に似ているとい うからな。 def ... end は Eiffel の影響だったっけ。
既存の何かに似てる必要もないじゃん イマイチだ
とりあえずdefとlambdaとprocの不統一さをどうにかしてくれたらいいよ
質問なんですが、入れ子になったクラスのコンストラクタを 外側のクラスからしか呼べなくするにはどうすればいいでしょうか? class A class B def initialize() puts "initialized!" end end def initialize() make_B() end private def make_B @b = B.new end end p a = A.new p c = A::B.new # こういうのをできなくしたい
def A::B.new #ここにAから呼ばれたときだけインスタンスを返す処理 end
>>590 お前の質問レスがスットンキョだったことに早く気付いてね。
直接MLに投稿すれば一発で解決するものを、何だって遠回りな手段を選ぶのか、 その思考回路からして理解できない。
599 :
594 :2006/04/30(日) 20:58:37
>>595 つまり、実行時に弾くことはできても完全に隠蔽することはできないということでしょうか。
>>597 MLを無償の人力検索だと思ってないかwwww
>>597 >直接MLに投稿すれば一発で解決するものを、何だって遠回りな手段を選ぶのか、
あれ?このスレ要らなくね?
要らないのはお前らの雑談だけ
603 :
デフォルトの名無しさん :2006/05/01(月) 01:27:11
質問です。是非ともお願いします。 直接Rubyに関する質問じゃないんですが。。。 Webサイトを、フリーのスペース(RubyのCGIがOKなところ)を借りて立ち上げようと思っています。 コンテンツをRD形式のテキストとして直接アップロードして、HTMLとして閲覧可能にするという 管理方法を取りたいのですが、その方法について御知恵を拝借したく。
>>603 HikiかRWikiだっけ?
なんかそんなんで。
あと、最近ならtypoとか?
それぞれでRDを使えるかどうかは自分で調べれ。
本家に間借りさせてもらえw
RubyがOkなフリーのウェブスペースっつーとおれは一個しか知らない。 しかも募集はたまにしかしてない。
607 :
603 :2006/05/01(月) 03:14:25
>>604 なんかそういうアプリケーションを使わないと駄目ということですか?
>>605 ねーよw…あるある
>>606 ? CGIでRubyOKなウェブスペースは多数あるようですが。
"index.rd"とかで検索かけてみると結構な数のサイトがヒットしますよね。
要はあれがやりたいだけなんです。
608 :
603 :2006/05/01(月) 03:17:31
もうひとつ補足しますと、例えば"hoge.html"でブラウザに表示されていて、拡張子を.rdに 変換してやるとrdのソースが出てくるサイトってありますよね。 つまりそういうことがやりたいのです。
なんか聞いてると眠くなる
*.html を cgi として動作させて変換するような 変態じみた仕様を使ってるところなんてあるの? 単に変換前の *.rd と、変換後の *.html の両方をアップしてるんじゃね?
ファイルの頭に #!rd2 -rrd/rd2html-lib って書いておくだけじゃねぇの? あと.htaccessとパーミッション弄ればいけるんじゃね?
>>603 自分で作るのが一番早いと思う
1.rdファイルを一通りアップロード
2.cgiを利用して、rdからhtmlファイルを生成
>>612 フリーのレンタルサーバでそこまで可能で、
まともに使える所ってどれくらいあるかねぇ。
>>613 RD の文法ミスしていて(ry になりそうな。
>>614 「"hoge.html"でブラウザに表示されていて」とあるんだが。
CGI に飛ばして、ファイルに書き出して静的に……って、何が何やらw
*.rd はただのテキストファイルとして処理してあるんだな *.htmlに埋め込んだSSIかなんかで取り込んで表示してるのかも どっちにしても客が来るたびに変換処理するメリットはゼロだ 事前に変換して静的ファイルとして置いておくほうがずっといい
フリーのウェブスペースでRuby使えるとこってどこですか? ちゃんとすぐに申し込めて、簡単にはなくならなさそうなとこで
>>617 俺は管理ページの構成が好きじゃないが、メジャーだしxreaでいんじゃねぇの?
でも月数百円でドメイン名とメールとウェブスペースとDBが使えるとこが国内でもあるから、もはや615みたいに無料にこだわる意味はないと思う。
xreaなら有料での広告なしサービスもやってるから丁度いいかもね 無料にこだわらないならロリポップとかもおすすめ
620 :
615 :2006/05/01(月) 13:42:20
>>618 恨みでもあるのかよw
こだわってるのは俺じゃないぞ
Rubyで遊ぶなら数百円出してさくらのレンタルサーバでいいような気がする ただしDB連携とかは無茶してる人多すぎて重すぎて実用にならないので期待するな
622 :
デフォルトの名無しさん :2006/05/01(月) 15:20:18
rubyって、そんなに使いやすいかな? 確かにきれいなOOPになっているから、意味はあるんだけれど。 C, C++, Javaが標準記法になっているのに、独特の関数記法やブロック記法を されても広まらないんじゃない? PerlはInternetでの歴史的な役割があるし、 Cに近いから、分からなくもないんだけれど。
まあそれがRubyの最大のネックかもな 俺もスクリプト言語覚えるときに最後まで どこでも使えるPerlか、あんまり普及してないRubyのどっち覚えるか悩んだし それでも言語オタクはRubyを選ぶ (本物の言語オタクはPerlもRubyもPythonもCもJavaもLispもPrologも全部やるんだろうけど)
記法はしょせん記法にしかすぎないんだけど、それにしか目がいかない人には向かないだろうね。 もっと物事の本質が分かる人か、何も知らない初心者じゃないと以外と難しいかも。 CとJavaしかできなくて、それにしがみついていたい人はやめとけばいいんじゃないかな。 なんかCOBOLと汎用機にこだわるおっさんを想像してしまう。それでも本人は最先端を行っているつもりなのが可笑しい。
PerlとRubyを平行してやっているけど、どっちも人の書いたコードが読めん。
猫の書いたコードなら読めるのか?
>>622 の「使いやすいかな?」から「広まらないんじゃない?」への繋がりが分からん。
広まらない理由に記法を挙げたり、それが一見さんへの敷居が高くなってる可能性は納得できるが、
使いやすいかと言われれば、個人的には
>>624 の言うとおりだと思うし、
どうでも良い、もしくは使いやすいと感じてるが。
というか、むしろマイナーめな言語からパチってる割に広まってるという印象が強いけど。
でも、; は結局取り止めになった様で、ちょっと安心したw
つーか、Lispの記法が苦しい人のためにRubyがあるような気がするのだが。
629 :
623 :2006/05/01(月) 16:46:15
あー確かにPerlとRubyの他にもう一つ最後まで候補だったのはLispだったな
Lispは嗜んでおかねばならないとは常々思ってる、んだがなあ 暇はなさそうだ 昔図書館で本借りてあっさり挫折したんだが、 Rubyをちょっと知った今ならもうちょっと楽に学べる気がする
633 :
デフォルトの名無しさん :2006/05/01(月) 17:40:50
>>627 いやぁ、私の頭の中では、C, C++, Java < < Perl < -> COBOL, rubyなんだが...(笑)。
まだruby始めたばっかだけど、pythonやってるとrubyは冗長に思うわな。 end end end end を見たときとか特に。 でもクロージャをメソッド呼び出しにひっつけられるのはpythonとかecmascript系とかlisp系とかのラムダ渡しよりいいかも。 あとpythonと比べるならrange(1, 11)よりは(1..10)のほうがいいし、len(array)よりはarray.sizeのほうが好みかも。 あーでもブロックの引数の書き方|param|はsmalltalkのローカル変数風で嫌い。
たしかに end end end end はうざい。 それを以下に回避するかが腕の見せ所でもあるが やりすぎると可読性が損なわれるという諸刃の剣 で、ブロック引数はどういう記法がいいと思う?
エディタで補完すればいいがな。 C#のEnumなんてMyEnum.MyEnum1とか型名頭につけて書かないといけないから一見激しくウザいけど IDE使うと逆に高い精度で候補を表示してくれるから便利になる。
Lispの達人が「括弧なんかあったっけ?」と言ったように、Rubyの達人になれば「endなんかあったっけ?」と……は、ならんか、やっぱり。
end良いじゃん・・・ なんで嫌いなん?
end end end end Rubyってこんな深いネストになってもメソッドに分割したりしないのが普通なの?
4段くらいまではけっこうあるかも。 クラスとメソッドとループとifで、もうend4つだ。 メソッドの中で何かopenしてその中でイテレータ回すとそれだけで3つend稼げるし。
end end end end はメソッド定義の一番最後とかによく見る。 途中でこんなのが出るのならやっぱ分割したほうがよさそうだ。
WindowsにRubyインストールしたい場合、ActiveScriptRubyっていうのがいいんですか? 公式サイトに置いてバイナリとの違いが良く分かりません。 ActivePerlみたいなものでしょうか?
endって変数名に使いたい時が多いような start = 0 end = 10 : parse error, unexpected kEND, expecting $
そんなことはBASICの時代から思ってる。
>>644 それはmatz本人もハマってるらしいんだけどな。
endはorzにだったら変えてもいい
>>642 ActiveScriptRuby・Apollo→インストーラーですぐ使える
mswin版ruby→展開と環境変数いじりで使える
ショートカット作るな! レジストリ弄るな!という場合なら
mswin版の方が良い
>>646 ブロックでは { と } を使うように言っとけ(w
ちゃんとインデントができてればendが続いても気にならないな。 でもたまに間違えてて嵌るんだよな。 俺が使ってるエディタではend の対応付け強調の設定ができないから。
むしろendが連発すると見た目が気になる。 しかも心の中で発音できてしまうだけに頭の中でend end end end・・・と鳴り響くんだこれが。
652 :
デフォルトの名無しさん :2006/05/02(火) 02:49:18
nativeが見たとき、 終 終 終 終 と見えるんだろうか?
654 :
デフォルトの名無しさん :2006/05/02(火) 03:42:07
>>653 数学もプログラミングも、漢字文化圏では書き方の問題で、発展に限界が
あったということか...
>>654 アルファベットな時点で論外らしいからなw
endの数合わせとインデントをきっちりやってくれるIDEって何がいい?
endは変数で使いたいからこうしようぜ オワタ オワタ オワタ オワタ
これで良いじゃんよ ;;; ;;; ;;; ;;;
ホームポジションから指を動かさずに打てる三文字でおながいします
モシ a = 5 ナラ 10 ヘ イケ
662 :
デフォルトの名無しさん :2006/05/02(火) 11:43:02
>>657 言語本体より、ライブラリに膨大な長さの変数や定数名が付けられていて、覚えるの大変。
今の言語が規定するのは、{}か..endぐらいの選択ぐらいじゃないかな。実際にプログラミング
するときに、言語の癖より、ライブラリの癖の方が、頭が痛い。
>>662 > ライブラリに膨大な長さの変数や定数名が付けられていて、
どういう意味?
>>662 膨大な長さの変数や定数名ってのはよくわからんけど、ライブラリがごちゃごちゃしてるってのはあるかも。
色んな人が書いてるんだから混沌とするのも仕方ないけど、もっとライブラリが一貫して整然とするような言語仕様になってくれたりしないかな?
どう実現したらいいかとかさっぱりわからないけど。
>色んな人が書いてるんだから混沌とするのも仕方ないけど、もっとライブラリが一貫して整然とするような言語仕様になってくれたりしないかな? 賛否両論あるにしてもとにかく作者の趣味で混沌嗜好な言語だから無理。 alias使いまくりだしな。
666 :
デフォルトの名無しさん :2006/05/02(火) 15:56:47
既に言語の時代じゃないと思うわけ。 MS-DOSやらUNIXのAPIに直接アクセスしていた時代とは今は全く違う。 膨大な既に規定されたクラスライブラリやら、普通のライブラリを アクセスするだけ、,net, Java, ruby, Gtkなどなど。 一行で、"Hello! World."を書くことが、最初のプログラムじゃない。
すみません。教えていただけませんでしょうか。 ビット反転したテキストファイルがあり、それを元に戻ししたいのです。 Perlだと open (IN,"$file"); binmode (IN); while(<IN>){ $_ = ~$_; ... みたいにできるのですが、Rubyでのやり方が分かりません。 バイト単位で読み込んでIntegerにキャストした後~で反転、 などとやってみましたが(当然ながら?)ダメでした。 どうかよろしくお願いします。
File.open($0) do |fh| fh.binmode.each_byte do |b| puts "%02X -> %02X" % [b, ~b & 0xFF] end end こうかな。
669 :
667 :2006/05/02(火) 22:50:55
<<668 なるほど、 バイト単位で読み込んで、~b & 0xFFとすればいいんですね。 ただ問題のテキストは日本語(たぶんSJIS)なので、 自分の技術ではまだいろいろ試行錯誤が必要そうです。 ともあれ、重要なヒントをありがとうございました。 上手くいったらまた報告します。
俺は最初にBASIC触ったのが小学生だったが 英語知らなくても全然困らなかったな。 IF あいえふ WHILE うぃれ GOTO ごとー FOR ふぉあ RANDOMIZE らんどみぜー って覚えてた。それでも 簡単なプログラムは組めるわけで。 タイピングも組んでく内に覚えちゃったし。
googleのヒット件数が多い順に並べるという物を書いてみたのですが
正しくソートされません。どうしてなんでしょう?
require 'nkf'
require 'cgi'
require 'open-uri'
rank = Hash.new(0)
"ruby python haskell 田村ゆかり".split.each {|name|
url = "
http://www.google.co.jp/search?q= " + CGI.escape(name)
open(url) {|body|
body.each {|line|
if /約 <b>(.*?)<\/b> 件中/s =~ NKF::nkf("-s", line)
rank[name] = $1.gsub(/,/, "")
end
}
}
}
rank.sort {|a, b|
a[1] <=> b[1]
}.each {|key, value|
print "#{key}: #{value}\n"
}
ruby: 159000000
haskell: 17700000
python: 256000000
田村ゆかり: 864000
>>671 Hashの要素は整列できないよ。やるならHashの配列にするのがいいんじゃない?
...
hash = { :name=>name, :value=>$1.gsub(/,/, "") }
rank << hash
...
としてから
rank.sort { |hash1, hash2| hash1[:value] <=> hash2[:value] }.each |hash|
puts "#{hash[:name]}: #{hash[:value]}"
end
または
rank.sort_by { |hash| hash[:value] }.each |hash|
puts "#{hash[:name]}: #{hash[:value]}"
end
それから、この場合はGoogleとはまったく関係ないから、質問は「こんなデータがソートできません」としたほうがいいよ。
673 :
667 :2006/05/03(水) 09:53:39
668さんに教えていただいて、解決しました。 ビット反転した日本語テキスト(Shift-JIS, CR+LF)を File.open(file_path, "r") do |fr| File.open(file_path + ".new", "w") do |fw| fr.binmode.each_byte do |b| fw.write((~b & 0xFF).chr) end end end というコードで完璧に復元できました。 ありがとうございました!
>>672 ありがと、できた。
わからないのは
count = Hash.new(0)
while line = gets
words = line.split
words.each {|word|
count[word] += 1
}
end
count.sort {|a, b|
a[1] <=> b[1]
}.each {|key, value|
print "#{key}: #{value}\n"
}
これは今使ってる入門書に出てきた英単語カウントのサンプルで
これだとうまくソートがかかるんですわ、上に出した例とほとんど同じだと思うのですけれど。
>>671 ヒント: 5 < 10 and "5" > "10" #=> true
>>675 ども、.to_iで解決してしまいました
>>612 > #!rd2 -rrd/rd2html-lib
shebangのネストはできない。
プログラミングというものの経験が無いのですが、Rubyから初めても問題無いでしょうか?
679 :
デフォルトの名無しさん :2006/05/03(水) 20:50:14
>>679 RubyじゃなくてFlushだろうな。
WebPrograming板の方が詳しい人が多いかも試練。
確かに全然詳しくなさそうだな(w
682 :
デフォルトの名無しさん :2006/05/03(水) 21:02:55
>>681 flush→flash
ただの typo なんだから素直に指摘すればいいのに。
性格悪い奴だな。
せっかくオチをつけてくれたレスに逆切れとは。
684 :
デフォルトの名無しさん :2006/05/03(水) 21:53:24
>>683 オチなんかついてないだろ。アレじゃただの嫌みだ。
自演乙
>>678 用途による
・単にプログラミング自身を学びたい → Rubyお勧め
・vectorにあるようなフリーソフトを作りたい → 他のGUIが強い言語(VB, C#, Delphi)をお勧め
・ゲームを作りたい → SDLや、DirectXが楽に使える言語(C++,C#,Delphi)をお勧め
・流行のWEBアプリ(CGI)を作りたい→フリーのサーバーで動かしたいなら、Perlでないと無理。有料サーバーならRubyお勧め
>>686 今は単にプログラミング自体を学びたいだけなので、Rubyを覚えようと思います。
PerlかRubyか迷ったので、質問してみました。
サーバーは一応自宅で運用しようと思っているので、やはりRubyにします。
詳しく教えていただきありがとうございました。
>>687 どの言語を覚えるかも大事だけど、初心者にとってはどの本で勉強するかも大事な気がする。
Rubyは初心者向けの本が「たのしいRuby」ぐらいしかないような。
まああの本はよく書けているから問題ないけど、ほかの難しい本を買ってしまったら
そのせいで挫折しそう。
>>688 一応web上の入門サイト等で学んでみるつもりです。
ご忠告ありがとうございました。
個人的にはサイトで勉強するのはあんまりお薦めできないな わからないことがあって調べるときにはWeb上の情報は非常に役に立つけど 入門からひととおり勉強するなら良い入門書を一冊手元に置くことをお薦めしたい ちなみに俺が最初に読んだのは 原信一郎, 2000, 『Rubyプログラミング入門』, オーム社 テキストフィルタに興味のある向きには while line = f.gets ... end open(file) do ... end File.foreach(file) do ... end ARGF.each ... end なんかを順番に説明してくれて文字コードや改行の話もしてくれる 第一章あたりはちょうどいいチュートリアルになってると思う
Webサイトは検索サイトや文字列サーチに適してるけどねぇ。 大きな本屋に行って、立ち読みして自分に合った本を1,2冊買った方が、結局は早いと思う。 俺も、原せんせの『Rubyプログラミング入門』から入った。 分かり易かったし、これで十分だった。 というか、これしか持ってねぇw そろそろ傷みが酷くなってきて、ちょっと心配。 05/22 発売の『プログラミング Ruby 第2版高いよ』合わせて8000円て orz
Rubyの教本も買ったけど、一番役に立ったのは RubyのHTMLヘルプだった。 基本的な文法が分かったら、HTMLヘルプで検索すれば 大体プログラミングできるようになる。
俺は
>>690 のサイトで最初に学んだ後は
リファレンスマニュアル読んで、人のコード読んでの繰り返し
俺がrubyを覚えたときは、本なんて一冊も出ていなかった。
>>692 >05/22 発売の『プログラミング Ruby 第2版高いよ』合わせて8000円て orz
"高いよ"までがタイトルですね。
タイトルで警告してくれてるなんて親切な本ですね
>>692 5/22に発売されるんだ。
ちょうど良かった。
それでRubyを勉強するよ。
プログラミング Ruby買ったけど、ほとんどオンラインで入手できる情報でがっかりした。 役に多々ねえしかも高かったし。誰か欲しい人いる?w amazonに出品しようかな
>>700 なんかAmazonの技術書はUsedが新品の定価スタートなんだが、あれはギャグか?
Rails本が9000円とかであって、普通に詐欺だと思った。
refeは?
704 :
デフォルトの名無しさん :2006/05/05(金) 18:10:04
質問したいのですが、 each_byteメソッド使って10進数のアスキーコードはもってこれたみたいなんですが それをビット処理したいので2進数に直したいのですが、どうしたらできますでしょうか? よろしければご教授願います。
何もしないでも2進数に直ってますよ
2進表現の文字列にしたいっつー事っしょ リファレンスの「sprintfフォーマット」の項を読みなはれ
707 :
デフォルトの名無しさん :2006/05/05(金) 18:22:52
>>705 ありがとうございます
勝手に直してやってくれるんですね。
でも、(n & 0b00000011) << 3
のようにしてしまうと、false << 3
となってしまい
n かつ 0b00000011 の2進数の計算をしてくれないのは困り者です。
708 :
sage :2006/05/05(金) 18:24:44
>>706 いや、混乱させる説明ですみません。
ただ、2進の計算がうまくいかないのです。
strに直したいってわけでもないのです。
sage書き込む位置を間違えたのはわざとではないです。。。
>>707 >でも、(n & 0b00000011) << 3
>のようにしてしまうと、false << 3
>となってしまい
>n かつ 0b00000011 の2進数の計算をしてくれないのは困り者です。
試してから言ってくださいね。
RubyはHSPと違って & はビット演算ですよ。
>>710 undefined method `<<' for false:FalseClass (NoMethodError)
というエラーがでてしまうんです。
もう一度考え直します。ありがとうございました。
>>711 "test test".each_byte{ |n|
p((n & 0b0000011) <<3)
}
ではそんな例外は出ないが。
ふつうに整数で (97 & 0b0000011) << 3 とかやってエラーが出ないのを確認せよ。 無事(おれの手元の環境と同じく)エラーにならなかったら、演算する前に n がどういう値になっているか調べよ。整数でない値になっていないか、そして それはどういう場合か、といったことを考察せよ。 というところだろうか。 ちなみに、 (nil & 0b0000011) # => false
& を && と書き間違えているとか。
a = "" p [a.class, String.class] #=> [String, Class] p a.class === String.class #=> false case a.class when String.class p 1 # こっちが実行される else p 2 end a.class と String.class って一致していないように思うんですが なんでこういう動作になるんでしょうか…。
String.class === a.class # => true だよ
>>715 Stringはクラス。
aはStringクラスのインスタンス。
そもそも別物。
> case a.class
> when String.class
これは
case String
when Class
と同じこと。
whenでは===で比較されるのに注意。
なるほど。左辺と右辺を勘違いしていたんだ。 ということは、クラスで処理を場合分けする場合は case a when Array puts "array" when String puts "string" else puts "else" end こんな感じですね。
じゃなくて case a.class when Array ... じゃまいか a.class => Array Array.class => Class
720 :
719 :2006/05/06(土) 13:23:30
あ、ごめん上読んでなかった無視して
721 :
デフォルトの名無しさん :2006/05/07(日) 14:11:41
質問なのですが、 外部コマンドを逐次実行したいのですが for k in 1..N IO.popen("hoge.exe") end などとするとコマンドを一気にN個行って困ります。 bashの;みたいに外部コマンドの実行が終るまで待つには どうしたらいいですか?
よくわからんけど俺の持ってる本にはこんなのが書いてある pid = fork do exec "date" end Process.waitpid(pid) puts "done."
for 使ってる人を久しぶりに見た
railsだと結構forが使われている。 forの方がeachより速いのだろうか。
725 :
デフォルトの名無しさん :2006/05/07(日) 14:56:56
>>722 うまくいきました、
ありがとうございました。
ブロック変数は結構重くなるよ
>>721 >>722 fork して exec して waitpid でいいなら IO.popen なんぞしないで system でええやんと思うのは何か間違ってるんだろうか?
IO.popen して書くんだと waitpid なり何なりいるけど読むなら EOF まで読んだら大概問題無さそうだっていうのも一つ。
現時点ではeachの方が早いんじゃなかったっけ?
t = Time.now for k in 1 .. 16777216 end puts Time.now - t #=> 12.859 t = Time.now (1 .. 16777216).each do |k| end puts Time.now - t #=> 27.043 eachの方が遅そうだ
恋するプログラムという本持ってる方いますか? その本のサンプルのgoogle検索がうまくいかない… 検索すると、error No deserializer found to deserialize a ':key' using encoding style 〜〜となってしまいます。
おまけ t = Time.now 16777216.times do |k| end puts Time.now - t #=> 22.352
>>731 持ってるけどこれから晩ご飯なので調べない
とりあえずGoogle Web APIのライセンスキー取得して
スクリプトの「ライセンスキー」のところに記入したか?
じゃwhileは?
t = Time.now i = 1 while i < 16777216 i += 1 end puts Time.now - t 8.162 t = Time.now 16777216.times do |k| end puts Time.now - t 4.787 t = Time.now for k in 1 .. 16777216 end puts Time.now - t 2.894 t = Time.now (1 .. 16777216).each do |k| end puts Time.now - t 4.867 while遅い
>>733 はい、しました。
とりあえず本の通りにはやってるはずなんですが
エラーがでます。
>>736 とりあえず、本が古い。
本の ruby -v
とおまいの ruby -v
晒せば?
>>737 本のついてたActiveScriptRuby1.8.2を使ってます
739 :
デフォルトの名無しさん :2006/05/08(月) 00:20:09
RDEの質問なんですけ大丈夫ですかね? puts '名前を入力して下さい。' name = gets.chomp puts "あなたの名前は#{ name }です。" これを F5 で動かすと、最初に二行目の部分が実行されているようで、 最初の名前を入力してくださいが出てきません。 cmdからだとちゃんと思い通りに動いてくれるので、RDE側の設定だと思うんですけど、どうすれば良いでしょうか? それともこれは何か訳があってこのような動作をするような仕様なのでしょうか? 初歩的な質問で申し訳無いですが、よろしくお願いします。
あ、小出しで申し訳無いですが、 STDOUT.sync = true で一応の解決はするんですが、 デフォルトでどうにかならないかと思いました。
STDOUT.sync = trueで動くならそれでいいではないか むしろなぜcmdだとそれで動くのか誰か俺に解説してくれ
>>741 putsだから改行出力があって、そこでstdoutのバッファがフラッシュされるから。
つーかRDEでそう動かない理由がわからん。そんなところを作ってないわけないしなあ。
直接作者に聞けば一発で解決するものを、何だって遠回りな手段を選ぶのか、 その思考回路からして理解できない。
作者に聞く前に自分が馬鹿なことを言ってるかどうかここで確認する、というメソッドはありかもしれん。
self.fool?
教える君 = 2ch.new 本家への質問 = 教える君.confirm(自信ない質問) 本家.write 本家への質問
一文字目が数字の識別子はお勧めしないなぁ
そういえば、みんなは、こういう ("2ch" とか) 名前の場合は、 クラス名をどういうふうに命名してる?
Nich
two_ch
NHK
752 :
731 :2006/05/08(月) 21:02:59
KEYのところを取得したライセンスキーと適当に考えた文字列を入れて 実行したんですが2つとも同じエラーだった… 何が間違ってるかさっぱりわからないです
なんでエラーメッセージをちゃんと書かないのかさっぱりわからないです
Hash#inspect って表示される key の順番って一定ではないの?
>>754 rubyに限らず一般にhashってのはそういうもん。
なんでなんだろうね。 順番を固定するとハッシュというものへのアクセスすべてが遅くなるから?
どうしても挿入したキーの順番で保持したいなら OrderedHash とか。
ふつーのユーザーにとっては、RubyやPerlのHashは「なまえつきはいれつ」だと思うぞ
そうか?順番が保持したければ arr = Array.new arr << {:key => "val"} ってやっていけばいいだけじゃん。
>>760 それだと要素数が増えるほど検索が遅くなるね。
キーで検索しない予定ならいいけど。
>>759 「名前でしかアクセスできない配列」なら近いかも。添え字の代わりに文字列な配列。
配列似のくせにわざわざ順番が保持されないように作りやがって不便だガッデムって印象。
そうしたほうがいいからそうなってるんだろうけど。
リストでつないでおけば順番を保持させることもできるけど、PHPがそれをやって見事な速度落ちを実現してくれた。
>760,761 んなことするくらいなら assoc 使えよ。
アソッカ
> 配列似のくせにわざわざ順番が保持されないように作りやがって不便だガッデムって印象。 ワロス ハッシュなんだって 馬鹿は黙ってろw
ファイルをオープンして、文字列を書き出して、クローズする、一番短い書き方ってどんなのかしら
IO.read(path,[length,[offset]])
>>768 それ書き出してない
素直に
open(path, 'w').write(str).close
とするしかないんじゃないか?
>>770 おいおい、 write は書いた長さを返すぞ。
読み込みは lines = File.readlines finenameng とか短いのあるじゃん 書き込みは File.open(outfile,"w"){|f| f.write string} より短い方法で例えば File.write(finename,string) とかないのかなーと
File.write_lines filename , array とかも欲しいわけだよ
Emacsでruby-mode.elを使用しているのですが 改行のときに自動にインデントを合わせてくれる設定はどこでしたら よろしいのでしょうか
>>773 フツーにFile#puts(ary)で出来ない?
Array#to_sの区切りが"\n"だった気がするけど
776 :
775 :2006/05/09(火) 17:20:41
ごめ何か根本的な勘違いしてた
つーか自分でよく練ったインターフェースで拡張しろ。 で、そのコード晒せ。 Matzの趣味に合ってなおかつ運よくみてれば採用するだろう。
>>772 >File.write(finename,string)
>とかないのかなーと
禿堂。File.read()があってFile.write()がないのはおかしい。
class File
def self.write(filename, string)
File.open(filename, 'w') { |f| f.write(string) }
end
end
あ、File.read()じゃなくてIO.read()なのね。どっちでもいいけど。
class File class << self def write(fname, *args) self.open(fname, "w"){|io| io.write(*args) } end def puts(fname, *args) self.open(fname, "w"){|io| io.puts(*args) } end end end とかかな。
File.writeはあればブロック受け取って最後に評価した値をファイルに書き出すのはわー
バイナリモードを考慮してない時点でIO.readすらろくに使えないわけだが
>>762 「配列の添え字だと数字でわかりにくいがハッシュなら名前が付けられてわかりやすい、しかも追加し放題のデータ入れ籠」
俺的ハッシュのイメージ
入れ放題の籠なので全部出すときの順番はバラバラ
イメージも何もデータ構造を理解せずにコンテナライブラリを使うなボケってことだろう。
ハッシュってのは要するに 高速にアクセスできるように並べられた配列のことだろ 入力した順が保持されないのはハッシュなんだから当たり前だわな
>>782 テキストを扱うだけならIO.readでも十分使いものになるんだが
ハッシュは分かりやすい名前付けるのが面倒ってのは有るな。 普通の用途には配列で十分な場合も有るよ。 ところで、月曜から金曜日の平日限定で if 条件式 then 平日に処理させたい手順 end って書きたいけど、いい条件式有る? Time.now.strftime("%w") == 1 .. 5 って書きたかったけど見事に動かない(w
if (1..5).include?(Time.now.localtime.wday) then ... くらいでどう? localtimeが必要かどうかはお好みでだが、たぶん必要なのに忘れてるだけだろ?w
ん? Time.now はデフォルトで地方時を返すだろ?
ほんとだ。吊ってくる。
OSによるのでは? そもそもローカルタイム設定しないOSもあるし。 ところで、配列の要素を置換させたいのだが a = [] として配列として要素を追加して、a.gsub(pattern, replace)相当は、 tmp_array = a.dup a.clear tmp_array.each do |i| a << i.gsub(pattern, replace) end tmp_array.clear あたりが一番スマート?
a.collect!{|x| x.gsub(pattern, replace)} とかじゃ駄目なの?
何その得体の知れない処理 Array#map Array#collectがあるじゃん
collect って map じゃないとすっきりしないんだよなぁ。 perl ユーザーだったせいかな……。 collect ってブロックがtrueを返した要素だけの配列を返す方が理解しやすい気がする。 rejectの反対ね。
配列の要素の置換は、Array#mapにブロック渡すのが一番好き。 あと、ハッシュの順番の問題はいったんeach{|k,v|でキーと値を取り出して配列にぶっこんでやれば、あとは任意の要素でsortすればいいんじゃないかな。
>>796 > each{|k,v|でキーと値を取り出して配列にぶっこんでやれば
eachでわざわざキーと値取り出さなくても
hash.to_a.sort{}とかでいいんじゃね?
もっというと
hash.sort{}でいいんじゃね?
順番の概念のないハッシュにsortなんてメソがあるとは不覚! まだまだ知らんことがRubyにはようけあるのう。
返す値の集合に順序を設けてるだけだでよ ハッシュをsortしてるわけじゃないがね
ハッシュのソートが準備されてるって発想が面白いね。 なんか似たような事やろうとしてる香具師が居るな。まあシステム管理ネタではありがちだが。 Mon: job_a, job_b Tue: job_a Wed: job_a The: job_a, job_b Fri: job_a, job_c Sat: job_d Sun: なんてスケジュールでjob_xを実行させたいとき、おまいらならどういう風に扱う? 曜日別に配列とかハッシュ作って今日の曜日の判定かなあ? {Mon=>["job_a", "job_b"], Tue=>["job_a"], Wed=>["job_a"], The=>["job_a", "job_b"], Fri=["job_a", "job_c"], Sat=>["job_d"]}とか、何か見ずらいけど。 曜日別にスクリプト組んでcronで曜日指定で実行って頭悪い気がする。メンテも面倒だし。
まあ何曜日に何をするか規則性がないのなら 曜日かジョブをキーにしてハッシュなりテーブル作るしかないんじゃね?
>>789 include?ですか。ひらめかなかったです。ありがとう。
>>792 a.map!{|x| x.gsub(/hoge/, "hage")}
という意味?
805 :
804 :2006/05/10(水) 01:27:07
うは、リロードできてなかった:y=-( ゚д゚)・∵;; ターン
>>801 YAMLがいまいちだったので自分で作ったヲレフォーマットパーサの使い回しだが、こんな事したいとか?とエスパーレスを試みるテスト。
week_jobs_text = <<EOS
Mon: job_a, job_b
Tue: job_a
Wed: job_a
The: job_a, job_b
Fri: job_a, job_c
Sat: job_d
Sun:
EOS
week_jobs_hash = Hash.new
week_jobs_text.each_line {|line|
line_tmp = line.split(" ")
line_tmp[0].gsub!(/:$/, "")
line_tmp.each {|i|
i.gsub!(/,$/, "")
}
week_jobs_hash.store(line_tmp[0], line_tmp[1, line_tmp.size])
}
p week_jobs_hash
{"Wed"=>["job_a"], "Sun"=>[], "Mon"=>["job_a", "job_b"], "Tue"=>["job_a"], "Sat"=>["job_d"], "The"=>["job_a", "job_b"], "Fri"=>["job_a", "job_c"]}
lzh(lha)扱うライブラリってないですかね。 外部コマンドのlhaを呼び出すのが手っ取り早いのかなー。 rubyzipはあるみたいですが
>>806 頭がいいんだか悪いんだか微妙なコードだな。
正規表現つかえばすっきりするぞ。
hash = {}
week_jobs_text.each_line do |line|
unless line =~ /^(¥w+):¥s*(.*)$/
raise "#{line.inspect}: invalid pattern."
end
wday = $1
jobs = $2.split(/,¥s*/)
hash[wday] = jobs
end
YAMLだったらこうかな。
week_jobs_text <<EOS
Mon: [job_a, job_b]
Tue: [job_a]
Wed: [job_a]
Sun: [ ]
EOS
require 'yaml'
hash = YAML.load(week_jobs_text)
ついでに木曜日はThuな。
時代はzipだよ。 XPならzipの扱い便利だし。 rubyzipってzlib使ってるのかな?
>>809 yes
つーか、既存のものがlhaで固められているんなら、lha使うしかないじゃん。
新規につくるぶんはzipでもいいかもしれんが、必ずしもそんな場面ばかりじゃない。
それよりbz2標準添付きぼん
うん。既存のがlzhなんだよね・・・
812 :
804 :2006/05/10(水) 10:39:40
黙ってxacrettでも使ってろよ。
だからrubyで自動化したいんだよw unlha.exeたたくか・・・
DLLを叩くのもそんな難しくないよ。
Windows じゃなかったりして・・・
Windows以外でunlha.exeってことは、DOS?
DOSでrubyって楽しくなさそう。なんかrubyの魅力の50%も使ってない感じ。
Windowsでrubyって楽しくなさそう。なんかrubyの魅力の50%も使ってない感じ。
>>819 普通にCでSDKベースでWindowsアプリを書ける能力があれば、余裕。
ruby習い初めで、ものすごい基本的なことなんですが・・・ 1.C言語でいうscanfに相当する関数はなんですか?(getsだと文字列だけしか・・・ 2.printf("%d日" , num); みたいに整数型+文字を表示させるような事って出来るのでしょうか?
オブジェクト指向の考え方に早く慣れた方が良いよ。 1. は用途がいまいち不明なので、できれば簡単なコードを。 2. は print num.to_s + "日" みたいのが一般的だと思われ。 Java とかはそのままできた気がしたけど、Ruby の + は厳密で心地良い。
>>822 1はつまり、整数とか少数などを取得したいという事です。
getsだと文字列としての取得しか出来ないようなんで・・・
2はよく分かりました
スクリプト言語の考え方に早くなれたほうがいいよ 1. scanf.rbは一応あるけどあんまりつかってるのみない スクリプト言語なんだからなんでも一端文字列として取得してから、正規表現かsplitだかで 文字列を分解して数値に。コストは気にしない 2.はString#% みたほうがいいかも "format" % obj でobjはto_sしてくれるから
>>821 1. scanf.rbを使う。
require "scanf"
scanf("%d%d")
# 1 2 と入力すると
# [1, 2]が返る。
2.
>>822 のように数値を文字列に変換する。
あとは"#{num}日" のように文字列に数値を埋め込む。
それに配列に入れてjoinでもいける。
[num, "日"].join("")
なんか、いろいろやり方があるようですね というより自分の考え方が古いようですね^^; リファレンス読んでみます。いろいろお世話になりました
いや、printfもsprintfもあるから。
>>826 >というより自分の考え方が古いようですね^^;
がんがれ。俺もそうだった。40手前まで生Cとかで生きてしまった身に
オブジェクト指向の考え方はとても辛いが、日々苦しみながら何とか
Javaとrubyぐらいは使えるようになった38歳が俺だ。
実はオブジェクトの定義とインスタンス、プロパティの関係を完全に
理解した瞬間はMacromedia Flashのライブラリからインスタンスを生成して
プロパティをActionScriptでいじって動かした時だったってことはひみつだが(笑)。
ウェブプログラマってやつか。
>>793-797 どうも。gsubじゃなくてmapですね。
この手のレシピ集が有るといいかも。
>>831 >手元にドキュメントがあるならmapぐらい数分で見つけられるだろうし。
それが見つけられないのが初心者です。
仮に見つけても理解できないのが初心者です。
上級者にはそれがわからんのです。
rubyの初心者にはオブジェクト指向のありがたみが分からんのと同じ。 具体的に手取り足取り、オブジェクト指向プログラミングではこうなるって示して真似してるうちに、オブジェクト思考が出来るようになるんだよ。 wikiのマニュアルも例としてはしょぼいからね。あれを試した程度でmapの応用まで理解できたら神。
injectとか、使いこなせりゃ凄く良さそうなんだが 中々上手く使いこなせんのだよ…
いや、injectは無理して使わんでいい が、「Rubyらしく書くってのはこういうこと」というお手本があまりにも少ない 前にforで書いた話が出てたが、Rubyではforを「使ったほうがわかりやすい」ことは少数だと思う
836 :
デフォルトの名無しさん :2006/05/11(木) 06:54:39
全部ひらがなの文字列の配列を辞書順にソートしたいんですが どうしたらいいでしょうか?
irb(main):002:0> puts %w(あめんぼ あかいな あいうえお).sort あいうえお あかいな あめんぼ => nil 辞書順だと思うけど。
特定のユーザー定義リストの順番を参考にして並び替えたいとかじゃないですかね
ところでみんなcollectじゃなくてmap使ってんの? 俺の読んだ入門書ではcollectで書いてあったんで、今までmapの存在を知らなかったのだが・・・
>>806 わしもヤムルが好きになれず、コンテナオブジェクトの最強パーサーライブラリを探し求めていたが、、、
最近、なんだかんだいって、リテラルが最強のような気がしてきた。
inspectで吐き出せて、evalで復元でき、多重入れ子構造にも強く、可読性もそこそこあると来ている。
ヤムル、イラネ。
リテラル最強説から発したのがJSON?rubyのリテラルではないけど。
eval で復元はなんか怖いな。
文字列、数値、配列、ハッシュあたりだけ扱ってくれる (ほかは例外上げる) ような シリアライズ / デシリアライズのライブラリがあれば良いなあ。
optparse って複数(個数は可変)の引数をとるオプションの指定って出来る?
>>844 RubyでもPerlでもPHPでも俺様用には作ったが汎用化してライブラリに
するのってメンドクサイんだよね。
PerlならCPANあたりに落ちてそうだけど、拾ってきて、使い方覚えて、
テストして検証して、汎用だから実プロダクトに適用するルールとか
考えて、となると俺様モジュール作る(つーか他で作って実績あるモノを
再利用または改変)方が早いし、みたいなジレンマは常にある。
結局冗長だとか言いながらみんなXMLやYAMLへ流れるのってその辺。
Marshalってのはどうなの?
>>847 Marshalのバージョンが変わると読み込めなくなるというのが致命的
>>844 JSONでええやん。
つか、こいつの用途にはObject.inspectで十分な気がする。
850 :
デフォルトの名無しさん :2006/05/11(木) 17:10:02
処理系を作る人って、まず自分のためだろ。既存の言語に不満がある。次に公開して、賛同を 得たい。rubyは残念ながら、日本人以外に賛同者が少ない。つまり、日本人ひいきが、数少ない 日本初の言語処理系を必要以上に過剰評価している。 scriptである以上、oopで設計する以上に、floatchartで処理できるぐらいの軽さで必要な処理、 正規表現、ファイル処理ができればいいと思うんだがね。
とりあえず頭悪そうな文章だな。 Rubyで正規表現やファイル処理がやりにくいとでもいいたいのかな? というか、ふろーとちゃーとって何だ? まあ、こんな低脳っぽい文章をageで書いてるとこを見ると、釣りのつもりなんだろうけどな ところで、PythonとかRubyの使用人口って実際どのくらいなの?
ユーザー数をどうやって調べるかが問題だな。 どの程度から、使ってると判断するかも問題だ。 C言語の使用人口の統計とかもあるのかなぁ……。
参考までに tp://freshmeat.net/browse/160/
855 :
841 :2006/05/11(木) 19:21:12
>>844 漏れもまさにそういう用途なんですが、
io.print(obj.inspect) #=> objをファイルに保存
obj=eval(io.read) #=> ファイルからobjを復元
ってのが結局最強だと思っているのですよ。
>>843 evalによる復元って何かやばいんすか?
今、この方法を使った掲示板CGIスクリプトが完成間近なんですが、、、;
そういえば、Ruby製のBBSってRuBBSくらいしか見たことないな。
>855 やばい理由はもしプログラムが混入したら、それがぜんぶ実行されちゃうこと が問題。意図しないコードが実行されてしまう可能性がある。 とはいえ、人間が絶対に触らないことが確約できて、マズい書式をぜったいに 持たないことが保証されているんだったら別に問題はないといえばない。 それでもやっぱりなんだか気持ち悪い。ってのはそれは個人的な感情だけど、 843の「なんか怖い」ってのはそういうニュアンスじゃないかな。 ごくシンプルな使い方しかしてないし eval で無問題、というのは確かにそう だが、そういう用途であれば YAML とか JSON とかでもべつに問題なく、しか も気持ち的にはちょっと安心するし。
処 た 初 で フ
>>850 うそーん。今はどうみたって日本人より海外のほうがユーザ多いだろ。メーリングリストの投稿数みれば一目瞭然。
しかし最近のRuby人気は海外からの逆輸入なのが悲しいよな。海外で流行らないと認められないという、この日本のなさけなさ。
860 :
855 :2006/05/11(木) 20:40:57
>もしプログラムが混入したら、それがぜんぶ実行されちゃうことが問題。意図しないコードが実行されてしまう可能性がある。 ガクガクブルブル、、、 inspectで吐き出される文字列が、なんか悪さをするコードになる可能性ってあるんでしょうかね。 短いですが、一応動きます。晒しますんでよければ添削を! test.rb #!/usr/local/bin/ruby -Ks print"content-type:text/html\n\n" class ObjMap def initialize(path);@path=path;@lockpath="#{@path}.lock";unless File.exist?(@path);file=open(@path,"w");file.print nil.inspect;file.close;end;end def dump(obj);lock;file=open(@path,"w");file.print obj.inspect;file.close;unlock;return obj;end def load;unlock?;file=open(@path,"r");obj=eval(file.read);file.close;return obj;end def lock;unlock?;file=open(@lockpath,"w");file.close;end def unlock;File.delete(@lockpath);end;def unlock?;while File.exist?(@lockpath);sleep(1);end;end private:lock,:unlock,:unlock? end objmap=ObjMap.new("log.dat");log=objmap.load||objmap.dump([]);require"cgi";text=CGI.new.params["text"][0]||"" if text.length>0;log.unshift(text.gsub(/</,"<").gsub(/>/,">"));if log.length>100;log.pop;end;objmap.dump(log);end print"<html><head><title>一言掲示板</title></head><body>" print"<form action=test.rb method=post><input type=text size=100 name=text><input type=submit></form><hr>" print"#{objmap.load.map{|a|a+'<hr>'}}</body></html>"
スペースが消えてるからとかそういうのを抜きにしても、 ここまで読みにくいものを出されると辛いな。 行数制限を避けたのか?
なんか普通にタグ書き込み放題なんだけど、その辺は無視して評価すりゃいいんかね?
863 :
857 :2006/05/11(木) 21:31:18
一般論を述べると、 ・文字列は inspect がエスケープしてくれるのでそれなりに安心 ・配列やハッシュは構造としては危険なコードは吐かない ・ふつうのオブジェクトの inspect は #<〜> なので、コメント化しちゃうから問題なし なので、たぶん大きな問題はない。膨大な長さになっても inspect はぜんぶ1行だし。 # もちろん、[Object.new] を inspect したものは eval するとエラーになるが ただ、ちゃんと読んでないんでよくわからん。というか、そういう保証や検証は自分でするものだろ? ところで、その書き方をするなら、 open(@path, "w"){|f| f.print obj.inspect} eval(File.read(@path)) のように書くほうがお手軽でいいんじゃないかと思う。
昔は # とか $ とか @ とかみたいにevalされたらまずい文字も普通に出てた気がするけど、1.8なら全部エスケープされるから String に関しては問題ないんじゃないかな。
865 :
860 :2006/05/11(木) 22:35:51
ありがとうございました。読みにくくてすいませんでした。 これくらいならevalでもなんとか大丈夫っぽいので、これでしばらくやってみます。 タグはちゃんとアンパサンドltコロンとかにgsubでエスケープしてたんですが、2ちゃん側でタグに置き換えられてしまいました。 # open(path,"w"){|f| ・・・}だったら、いちいちcloseしなくていいんですね。目からウロコ!
>>845 > optparse って複数(個数は可変)の引数をとるオプションの指定って出来る?
そういう使い方は想定外。
def_optionで作ったSwitchのparseをうまく定義すればなんとかなるかも。
ずっと「なんでinspectの書式は#<>なんだろう」と思ってたんだけど もしかしてevalのために意図的に#が使われているのか それはさておき、JSONってこのスレで初めて知ったけど ハードタブ派の俺にはぴったりだ ライブラリがpure rubyかつコンパクトでCGI向きなのもいいね YAMLもソフトタブ強制さえなければ使ってたのに
> # open(path,"w"){|f| ・・・}だったら、いちいちcloseしなくていいんですね。目からウロコ! おまえ、せっかくの Ruby なのに。
JSON のライブラリあるんだ。 YAML の使ってたよ。
>>868 知らなかったのは別に構わないけど、どうして知らなかったのかはちょっと気になるな。
たいていの入門書なり簡単解説なりではdo-endか{{のブロック型だと思うんだが。
最初からとりあえずcloseで示してるところがあるんだろうか。
Matzでも使えるようにWindows環境の早期充実が望まれる
rakeの日本語リソースってないすか?
874 :
デフォルトの名無しさん :2006/05/12(金) 17:22:37
rakeで質問なんですが、 ワイルドカード指定で、*.o から hoge.exeを生成するにはどうかいたらいいんでしょ。 fileで、ファイルを手書きしないとうまく行きません file 'test.exe' => [ "moge.o" "hage.o" ] do |t| sh "gcc #{t.prerequisites.join(' ')} -o #{t.name}" end ↓だと駄目です file 'test.exe' => [ Dir::glob("*.o") ] do |t| sh "gcc #{t.prerequisites.join(' ')} -o #{t.name}" end
875 :
デフォルトの名無しさん :2006/05/12(金) 17:42:40
*.cから*.oを生成したら、できました ちょっと長いですが・・・ Makefileのワイルドカード指定みたいに、もうちょっと簡単に書く方法ないですかね file 'test.exe' => Dir::glob("*.c").map{|t| t.sub(/.c$/, ".o")} do |t| sh "gcc #{t.prerequisites.join(' ')} -o #{t.name}" end
>>874 >↓だと駄目です
>file 'test.exe' => [ Dir::glob("*.o") ] do |t|
> sh "gcc #{t.prerequisites.join(' ')} -o #{t.name}"
>end
これは、fileコマンドが実行される時点ではまだ *.o が生成されていないわけだから、
test.exe の依存ファイルはなしとなってしまう。つまり
file 'test.exe' => [ ] do ..
と同じになってしまう。だから
>>875 のように明示的に
objfiles = Dir.glob("*.c")map {|f| f.sub(/¥.c$/, '.o') }
file 'test.exe' => objfiles do ...
としなきゃいけない。
このへんはMakeでも同じこと。Makefileで簡単に記述できるのは、「*.oは*.cから作られる」というルールだけであり、
「test.exeはhoge.o, fuga.o, .. から作られる」ことは明示的に
test.exe: hoge.o fuga.o
gcc ....
と書く必要がある。
それに比べれば、Dir.globでファイル名を集められるRakeのほうがいいと思うんだけど。
877 :
デフォルトの名無しさん :2006/05/12(金) 19:08:46
Makefile wildcardとsubstでいけるからなー、と思ったけど、 まー、使う人は、ruby使いなのだからいいか
>869 YAML は標準でついてきてるのが強い。 JSON はあるけど標準じゃないよ。 っていうか YAML でも Syck があんなにアレじゃなかったら充分使えるんだけどねぇ……。
YAML は Syck じゃなくても充分アレだろ
アレってなんだー?
cockroach
882 :
デフォルトの名無しさん :2006/05/13(土) 19:22:06
"[S [NP John] [VP [V hits] [NP Mary]]]" のような文字列を ["S", ["NP", "John"], ["VP", ["V", "hits"], ["NP", "Mary"]]] のような配列に変換したいのですが、エレガントな方法はあるでしょうか? def parse(text) return eval(text.split( /([ \[\]])/s ).delete_if { |x| /^ *$/ =~ x }.collect { |x| (x == '[' or x == ']') ? x : "'#{x}'" }.join(',').gsub(/\[,/, '[').gsub(/,\]/, ']')) end とりあえず、こんな感じでやってみたんですが、なんかきもいような気がするので・・・
>>882 エレガントではないが、適当に書いてみた。
def parse(str)
result = []
while not str.empty?
case str
when /¥A¥]/
str = $'
return result, str
when /¥A¥[/
ary, str = parse($')
result << ary
when /¥A[^ ¥[¥]]+/
result << $&
str = $'
when /¥A +/
str = $'
end
end
return result, str
end
result, str = parse("[S [NP John] [VP [V hits] [NP Mary]]]")
p(result[0]) # => ["S", ["NP", "John"], ["VP", ["V", "hits"], ["NP", "Mary"]]]
そういえば、対応する文字列で parse してくれるライブラリってあると便利だなぁ。
886 :
882 :2006/05/13(土) 23:01:21
>>883 ありがとうございます。やっぱり再帰呼び出しがセオリーかなと思ったんですが、
いろいろ考えた結果、こんな感じになりました。ご報告まで。
class Parser
def parse(text)
tree = []; bracket = []
tokens = scan(text)
tokens.each do |token|
case token
when '['; bracket.push(tree.size)
when ']'; pos = bracket.pop
tree[pos .. -1] = [tree[pos .. -1]]
else ; tree.push(token)
end
end
return tree
end
def scan(text)
return text.chomp.
split(/([\[\]])/).
collect{|x| x.split(/ +/)}.
flatten
end
end
parser = Parser.new
p parser.parse("[S [NP John] [VP [V is][A intelligent]]]")
887 :
デフォルトの名無しさん :2006/05/14(日) 23:09:01
次のるびまはいつ?
>>887 10年前に Ruby は無かったので心配しなくて良い。
>>887 ブロック付きメソッド呼び出し
あとは普通のオブジェクト指向
他に特殊なのってあったっけ
どうだったかな とりあえずEnumerable関係のブロック付きメソッド使いこなせれば Rubyっぽいような気がしなくもない
すみません ActiveScriptRuby1.8.4を使っていますが gifないしpng画像を手軽に作成できるライブラリとかはないものでしょうか いくつか探してみましたが、Ruby/GDというのはインストールの仕方がさっぱりで Ruby/PureImageというのは、Javaがわからないもので、フォントファイルの作成と いうのがうまくいきません
RMagick
895 :
デフォルトの名無しさん :2006/05/15(月) 15:20:52
>>893 ありがとうございます。
RMagickというのを試してみましたが、やはりうまくインストールできません。
1. ImageMagickをインストール
ImageMagick-6.2.7-6-Q16-windows-dll.exe でインストーラーに従って。
2. RMagickをインストール
gem install RMagick-win32-1.9.2-mswin32.gem
ruby postinstall.rb
として、メッセージをみる限り無事にインストールされたように見えるのですが、
require 'RMagick' などとしても no such file to load -- RMagick とでて
読み込むことができません。他に何か設定すべきことなどあるのでしょうか。
ちなみにRMagick.rbというのは、以下のフォルダにインストールされたようです。
C:\Program Files\ruby-1.8\lib\ruby\gems\1.8\gems\RMagick-win32-1.9.2-mswin32\lib
gem 経由でインストールすると、 Ruby の標準のライブラリサーチパスにはイ ンストールされないよ。 require 'rubygems' require 'RMagick' とかすればいいのでは? いや RMagick 使ったことないけど。
>>896 おお、ありがとうございます。
とりあえずrequireまではそれで通りました。
これからいろいろ試してみます。
898 :
デフォルトの名無しさん :2006/05/15(月) 20:18:38
>>887 ・forより、eachを使う
・範囲型
・オブジェクト指向
・mixin
・ブロック付きメソッドの呼び出し
・ブロック付きメソッドの定義
とか、他にあるかな・・・。
open(p){|f| ・・・ }の書式を試してみたんですが、どうも・・・のところで定義した変数がブロック外で使えないのが痛いっすね。 そこだけグローバル変数使ったら動いたけどなんだか格好悪い。 せっかくのRubyなんですが、やっぱりf=open(p);・・・;f.closeで統一することにしますorz
>難易度:名古屋 難易度高すぎww
>>900 global にしなくても block の外で定義すればおk
def load
unlock?
obj = nil # (`・ω・´)
open(@path,"r") do |file|
obj=eval(file.read)
end
return obj
end
block の外のことを global と言っていると思われ
っつーか global かそうじゃないかはどうでもよくて
一昔前の C/C++ で
for(int i=0; i<10; i++){
hoge
}
for(int i=0; i<10; i++){
fuga
}
とやると二重定義で怒られたのと同じような
みっともなさを感じるという意味なら
>>900 に同意できる
open(p){|f| ・・・ }の書式だと ・・・のところで定義した変数のスコープは・・・だけで有効なのが正しい
Ruby2.0は var n; とか宣言必須にして
るびま編集者寄稿者乙。
どうしても閉じていたいならクロージャ作ってcallするとかさ >ブロックつき IO.open は、ブロックの結果を返します。 なので、ブロックの末端でreturn a,b,cしてa,b,c = open(){}とすりゃいいんじゃねえの?
あ、ごめん。 returnはいらない。 実行終わってしまうやん。
>>903 result=Array.new
block{
…
…
result.push(…)
}
puts result
のよーな事前定義必須な使い方になんかよくわからないバッドノウハウ的なウザさを感じたのは確かだと思う。
いや、スコープがブロック外に届かないという仕様は極めて正しいけれど。初心者スレ的になんとなく。
>>900 openは読み書きにどうしても必要な一瞬だけ開いて閉じるというのが正しい使い方の模様。
もし、
「プログラムの5行目でとりあえずopenしてプログラムの最終行で忘れずclose」
というような使い方をして無闇にブロックが広くなった結果不便だと感じたのなら、それは直したほうがいい。
openのブロックの中にはputsやreadしか書かないくらいの意気で。
これでいいじゃん result = open(){ |f| f.read } purs result
>>911 あんまよくないと思う
「Rubyは最後の式が評価されるからreturnはいらない」と同じくらいよくない
>>912 「Rubyは最後の式が評価されるからreturnはいらない」と同じくらいには悪くない、
と解釈しておk?
irb> P='「Rubyは最後の式が評価されるからreturnはいらない」と同じくらいよくない' irb> Q='「Rubyは最後の式が評価されるからreturnはいらない」と同じくらいには悪くない' irb(main):006:0> P===Q => false だめっぽい
このスレの良い悪いはいまいち理解できん。{}, begin endレベルの趣味の話をしているのか?
>>916 「それでは要件を満たさないことが多いからこの場合の回答としては不適だと思う」
を略して「良くない」と言ってると予想
間違いではないが紛らわしいな
趣味の話のように思える。 俺も result = open(){ |f| f.read } でいいと思うが。 それを言ったら result = IO.read() でいいんだけどな。
>>910 はopenではなくブロック一般の話になってるな
ブロック外に「持ち出す」のはopenみたく読んだファイルデータ1個とは限らないから、
そういうのでは
>>911 の形式では不足なこともあるとは思った
ところで基本的に
file=open('hoge.txt'){|f| f.read}
# 以下fileを色々する
とか
file=String.new
open('hoge.txt'){|f|
file=f.read
}
# 以下fileを色々する
とかいう流れが主流だと思ってていいよね
openしたブロックの中で色々するようなのはあまり「良くない」でいいよね
>>919 多値いけるよ。
a,b,c = open('/etc/profile'){|io| [io.gets,io.gets,io.gets]}
IOに時間が掛かるからあまりに長大でなきゃブロック中でちょっとずつ読み書きした方がいいだろ
と思っているがFile::readlines.joinとかよくやってしまう。
ファイルは開いたすぐ閉じた方がいいって、るびまのCGI入門かどっかに書いてあった。
本当にどうでもいいんだけどさ、 result=hoge{・・・ ・・・ ・・・ ・・・ ・・・ ・・・ } ってなんか見かけかっこ悪くね? 風にたなびかない自家製こいのぼりみたい 「えーと、resultがhogeのおおおおおお長げえええええええ」みたいな
readlines.join()はアホすぎだろ…。引数なしのread()でいいじゃん。
FAQ Q. 字面が気に食わん A. 慣れろ or die
>>923 その通り。
なんかRuby初心者の時にどっかで読んでそのまま癖になってるんだよな。
どこだっけ……。
長いのが気になるなら、中身関数にすればいいんじゃね def foo ... end baz = bar{|b| foo(b)}
>>922 それは時々見るな。
そこまでしてまでイコールで繋ぐ形を維持したいんかって感じはしなくもない。
が本当にどうでもいいな
〜〜〜〜〜〜〜〜〜でした。(tabによる空白)124.jpg(ここで改行) のような文が何十行もあるテキストファイルからファイル名だけを取り出したいのですが open("sample.txt") {|body| body.each {|line| if /\s(*.\.jpg)/ =~ line print $1, "\n" end } } こんな感じで取り出せるような気がしたのですがうまくいきません どう書くのが正しいのでしょうか?
*. ではなく .* だと思うがどうか。 うまく行きませんて、どう上手く行かないか、エラーならエラーメッセージな り、動作するが想定と違うならどうなっちゃうか、ちゃんと説明しる。 また、「〜〜〜〜でした」なる箇所に空白があるとすると、それも上手く行か んよな。最左最長マッチなんだから。 /\s(\S*\.jpg)/ =~ line とかになるのかな。ファイル名に空白文字がないという前提で書いているが。
/\t(.*\.jpg)$/ じゃダメ?
>>929 情報の小出し申し訳ない
それで動きました。
もう少し世紀業現勉強します
>>930 がいい線だと思う
「タブがあってファイル名jpgのあとに必ず改行」を使って識別しない手はない
行ごとに正規表現使って文字列取り出したい場合はlineに対してscanするといいかも
933 :
928 :2006/05/16(火) 21:26:27
line.split("\t")[-1] でいいんじゃね?
ふと、XMLHttpRequest を ruby から使ってみたんですけど、
2回目の OnReadyStateChange の呼び出しで [BUG] になるんだけど
どーすればいいの。
---
require "win32ole"
xml = WIN32OLE.new("Microsoft.XMLHTTP")
xml.OnReadyStateChange = Proc.new do
p xml.ReadyState
if xml.ReadyState == 4
p xml.responseText
end
end
xml.Open("get", "
http://www.yahoo.co.jp ")
xml.Send(nil)
sleep(10)
---
実行結果。
---
> ruby a.rb
1
a.rb:7: [BUG] Segmentation fault
ruby 1.8.4 (2005-12-24) [i386-mswin32]
---
本スレの香ばしい流れを何とかしてくれ…。
>>936 初学者はモルモン教徒だということを知らないで使っているからな…。
どれどれ。 1日200レス消費したことから見て一部の人が匿名で狂信的に騒いでるだけと判断。放置。 何がしかの問題があるならそのようになる。
>>938 まあ、判断基準としてはいいとこだな。
2ch以外で騒ぎになったときに考えればいい。
2chは一人で何もかも作り上げることができる特殊な空間だ。
質問です gem install mysql に対して --with-mysql-dir=/usr を加えて実行したいんですけど、 gemにどうオプションを加えてやればよいのでしょうか? gem install mysql --with-mysql-dir=/usr じゃだめみたいなんでどうしたものかと
gemは嫌い。 分かりづらい自動化してくれるよりは、手作業で一個一個確かめる方がまし。
>>941 setup.rbやinstall.rbは?
>>942 gemで一回インストールが失敗してホント参ったことあるんだよね。
ソース読んでどこで躓いたのか確認して修正して再実行を何度も繰り返して
ホントにいやになった。
setup.rbでこけたことはないけれど、解凍したら即okみたいなのがシンプルで一番だね。
>>943 ちょ、wwwそれ楽じゃない。
確かにgemは躓くとしんどいが、楽なのも確か。
gemはダウンロードしてくれるのが便利。
gemは独自のバージョン管理が邪魔。
947 :
940 :2006/05/17(水) 09:15:01
結局、debianだったので libdbd-mysql-ruby1.8を入れることで解決しました。 ご迷惑をおかけしました。 でも、またいつか同じ問題に直面するかも・・・
>>946 CPAN経由でインストールしようと思ったらひとつだけdebパッケージで入ってたってくらい邪魔
>>946 具体的にどう邪魔かかかないと、ただの負けぜりふ。
スレタイ100回嫁
>>949 ディストロのパッケージで gem に依存するものを一つ入れると、
後は何が起こるか想像が付かないくらいには邪魔。
>>951 -rubygemしてればgemが管理してる方
そうでなくてソース中でもrubygemがrequireされないのならディストリビューションのパッケージマネージャでインストールされた方
が使用される。
という夢を見た。
ドキュメント改善プロジェクトってどうなったの?
そんなのあったの?
ruby-list で聞けよ
ruby-talk >>>>>>>>> rubt-list
どっちみちloopしてるじゃん?
962 :
デフォルトの名無しさん :2006/05/17(水) 23:57:17
初心者スレまでもってくんじゃねーーーーーーーー氏ね馬鹿
本スレを散々荒らした挙句、本スレの次スレにも初心者スレにも その他のスレにもコピペ開始か これもう悪質な荒らしでしかないだろ アク禁とかしてもらえないのか?
>>949 週に一回は必ず「ubygemがロードできねー」ってエラーがポストされることとか。
>>965 あー。
微妙な話だな。
ユーザスキルが低いだけ(&ドキュメント読め)でもあるし
でもRequire必要ってユーザビリティが低いと言えなくもないし。
gem入れても入れなくても/lib/ruby/init.rbとか無理矢理読んでそこで初期化すりゃいいのかな、とも思うが
それはそれで穴になるしな。
次スレ誰かよろしく。
968 :
デフォルトの名無しさん :2006/05/18(木) 01:21:35
こんな糞スレの次スレなんかもうイラネ
すまん、誤爆した
>>970 ナイスフォロー
で、スレタイとかはこのまんまでいいの?
/ l⌒l O | ̄| O ヽ  ̄ ̄/  ̄ ̄/ ‐┼‐ ─‐ _|_ ‐┼─ / | | | / | | lノ ー lノ ー ‐┼‐ / / __| ヽ | \ ヽ、. | | ├ー┤ ノ ノ ノ (___ (___ / し / (丿\ し
||=と&&=ってどういう時に使うんだ?
>>974 ||=は左側がnullかfalseのときにだけ代入される。
初期化されてない変数を参照するとnullが帰ってくるのでこれを利用してインスタンス変数の初期化なんかに使える。
&&=は逆。
左側がnull,falseでないときに代入する。
使い道はよくわからんが。
a &&= a.sort とかすりゃいいのかね。
ああ、そんな演算子あったのか ずっと a = Array.new unless a とかやってた
def f(a, b) raise if a &&= b a.fuga ..... ぱっと思いつくのはこんな感じかな。 いや、実際使うかというと、どうだろう。
978 :
977 :2006/05/18(木) 10:31:30
ぎゃー、ごめん、嘘。 取り消して。 なんか勘違いしてる
||=のついでにつけただけに一俵
なかったらなかったで ||= はあるのに &&= は何でないの?って言うくせに
Ruby の演算子はみんな ||= のような形式で書ける、とする方がパーサも書き やすいんじゃないかな。あとはまぁ対称性。 ||= はハッシュの値初期化とかによく使われる。 (h[k] ||= []).push v ハッシュが k を持ってなかったら配列で初期化して、持ってなかったらその まま。それから、その要素に v をプッシュする。 &&= はあんまり見たことないなあ。
>>980 次スレよろしくね。立てられなかったら、その旨を。
乙〜
乙かれー。
986 :
974 :2006/05/18(木) 11:42:04
乙ー
>>975 なるほど。
a = [1,2,3] unless a
↓
a ||= [1,2,3]
こう短縮できるわけか。ありがとう。
>a ||= [1,2,3] う〜ん、初心者の自分としては分かりづらいから使いたくないな。
今更かもしれないが、||=って x || (x = value) の糖衣構文ではなくて、実際の機能は !(defined?(x) || x) || (x = value) なんだよね
>>988 975だけど、そうだそのとおり。
すげー嘘書いてた。
未定義ならNameErrorだもんな。
初心者の皆さんごめんなさい。
>>988 違うんじゃない?
x = x || value でしょ?
それって何が違うの?
val = 1 p x || (x = val) #=> NameError p x = x || val #=> 1 !(defined?(x) || x) || (x = value) に関しては (defined?(x) && x) || (x = value) じゃないかと思うんだけど。細かく言うと、これでも違ってそうだが。
p x || x = 1 # => NameError p x = x || 1 # => 1 p x ||= 1 # => 1 まあ、x= や x||= が最初に来る分にはNameErrorにはならないけどな
x ||= 1と等価なのは (defined?(x) && x) ? x : x = 1 かな
ん? a = b || 1 # => NameError 当然か。 x ||= 1 # => 1 x = x || 1 # => 1 x = (defined?(x) && x) ? x : 1 # => 1 (defined?(x) && x) ? x : x = 1 # => 1 これでも同じかと思ったが違うんだな。 x = 1unless defined?(x) && x # => 1(1回目) x = 1unless defined?(x) && x # => nil(2回目) 条件分岐すると何も実行されないもんな。 微妙に試してないとこがあるので違ってたらスマン。
ようするに||=は a = a + 1 が a += 1 と書けるのと同じってことか。
>>996 ここはドキュメントに書いてあることを再確認するスレかよ。
999
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。