>>401 >参照した影響っていつまで残るんでしょうか
sliceすると、sliceされた配列も新しく出来た配列もシェア状態になる。
シェア状態になった配列を破壊的に変更するとコピーが起きる。
コピーがされたらシェア状態じゃなくなる。
というわけで、破壊的変更がされるまで。
以前からArrayはcopy on writeに違いないと訳もなく信じていたのだけど、 今回の話でちょっと興味を持ったので少し実験してみた。 もしかして一部分でも書き換えたら、巨大な配列だろうと丸コピーしてる? irb(main):001:0> a = Array.new(1<<24) { |i| i } # メモリ使用量70MB程度 irb(main):002:0> b = Array.new(1<<8) { a[1..-1] } # メモリ使用量そのまま irb(main):003:0> b.each { |e| e[0] = 1 } # たった256要素も変更できない NoMemoryError: failed to allocate memory from (irb):3:in `[]=' from (irb):3 from (irb):3:in `each' from (irb):3 from :0 ソースを読むだけの気力も能力もないので適当なことを言わせてもらうけど 配列をブロックに小分けするようなことはしていないようにみえる。 ガチガチの配列ならともかく、RubyのArrayってどこにでも追加削除可能な 万能コンテナみたいだから、内部的にはある程度の長さのブロック(配列)と ハッシュやツリーなんかの混合構造の方が効率良さそうに思えるけど。 それとも、やり過ぎて添字アクセスが遅くなるのを嫌っているのかな?
>配列をブロックに小分けするようなことはしていないようにみえる。 その通り。 >ハッシュやツリーなんかの混合構造の方が効率良さそうに思えるけど。 >それとも、やり過ぎて添字アクセスが遅くなるのを嫌っているのかな? たぶん、ちゃんと検討されたことはない。でも、 - この最適化で速くなるRubyプログラムは少なそう(多いというなら説得が必要) - わずかだろうけど遅くなるプログラムは結構ありそう(添字アクセス) - 配列がflatなメモリだと期待している拡張ライブラリ(非常に多い)が動かなくなる というあたりから、標準のArrayに組み込むのは微妙かなあ。 SparseArrayみたいな別ライブラリがいいと思う。やるとしたら。
java で、 Vector → ArrayList さらに LinkedList や CopyOnWriteList と、言語のバージョンが上がるごとに List の派生クラスが増えていったように Ruby も Array の派生組み込みクラスが作られていくかな? Ruby の文化からすると、あまりそういうことはしなさそうだけど。
>>425 422じゃないけど、Rubyの場合は
基本的に変数はすべて参照になっているって事でいいのかな。
irb --prompt simple
>> a = [1, 2]
=> [1, 2]
>> b = a
=> [1, 2]
>> a << 3
=> [1, 2, 3]
>> a << 4
=> [1, 2, 3, 4]
>> b.size
=> 4
>> b
=> [1, 2, 3, 4]
この場合、aとかbってのはただのラベルで配列の実体は別の場所にあるってことでいい?
> 基本的に変数はすべて参照になっているって事でいいのかな。 いいと思うけど、俺にアンカーつける必要なくない? 他にもいい人はたくさんいるよ
428 :
422 :2009/04/15(水) 08:15:18
>>423 組み込みオブジェクトの内部表現が変わってもスクリプト側には
影響ないと思ってたんだけど、拡張ライブラリが駄目なのか。
>>424 の言うように派生クラスにするか、Arrayを初期化するときに
内部実装を選択するヒントとかパラメータを指定できるようになれば
面白いかなって思ったんだけど。
>>425 これ、Ruby Hacking Guideってやつだよね?
Webで見れたとは、こりゃありがたい。
後でゆっくり読ませてもらうわ。
初心者スレだったんだっけ
>>426 オブジェクトを「捕まえる」「入れておく」ことはできない
名前で参照するしかない
変数に対する = は、"右辺" の指すオブジェクトに新たなラベルをつける行為で、本当は「代入」ではない
irb> a = [1, 2]
irb> b = a
irb> a << 3
irb> p (a.object_id == b.object_id)
true
で、スレ的にもこれだけでいいと思うんだが、こっからがめんどい
irb> a = [1, 2, 3, 4, 5]
irb> p (a[0..2].object_id == a.object_id)
false
a と a[0..2] は違うオブジェクトなので、
[1, 2, 3, 4, 5]
と
[1, 2, 3] ← a[0..2] が返す、できたてほやほや配列
という2つの配列オブジェクトが(Rubyの「オブジェクト置き場」に)存在しているように感じるが、実は
[1, 2, 3, 4, 5] <共有済>
と
<注: id:3324 の配列を共有、0要素目から2要素目までを返す、ただし、破壊的変更が来たら配列内容をコピーして保持する>
という、1つの「share された」配列と1つの「share した」配列になってる
これらは自分が share 関係にある配列と自分が share 状態であるということを覚えていて、破壊的変更が自分に来たら share 関係にある配列にそれを通知する
通知または破壊的変更がきた場合の動作は
・ 自分が共有元(a)である場合は share 状態を解除し普通の配列に戻る(破壊的変更を自分が受けていた場合は受け付ける)
・ 自分が共有先(a[0..2])である場合は共有元の要素の参照をきちんと複製して share 状態を解除し普通の配列に切り替える
ということである、というようなてきとーな理解でいいか
>>421 array.c を読めばなんか書いてあるのかね
この最適化が入ることで、逆にそれ以外のところが遅くなるはずだが、 配列って部分参照することってそんなにあるっけ?
>>429 ん、単純に
[ <id:0011>, <id:0013>, <id:0015>, <id:0018>, <id:0411> ]
という普通の配列と
[ a[0], a[1], a[2] ] # a が変更されたらオブジェクトIDの参照に切り替えること
の関係になるという話なんじゃないの?
や、こんな 2段階やるくらいなら最初から [ <id:0011>, <id:0013>, <id:0015>] という配列作っとけよ、という感じではあるんだが
お、おまいらここは初心者スレだぜ( ´ー`)y─┛~~ コウドナワダイデビビラスナ
>>431 オブジェクトにラベルを新たに付けるという行為が、
配列をインデックスで参照するように指定するという行為よりずっとコストのかかる行為であった場合には、
[ a[0], a[1], a[2] ] のほうが有効だと思われ
ホントのとこはどうなのかは知らない
また仕様バグか
require 'benchmark' a = (1..1000000).to_a Benchmark.bmbm do |bm| bm.report('a に追加'){a.delete_at(0); a.push("s")} end a = (1..1000000).to_a Benchmark.bmbm do |bm| bm.report('部分参照して追加'){a[1..-1].push("s")} end 結果: user system total real a に追加 0.050000 0.000000 0.050000 ( 0.048458) user system total real 部分参照して追加 0.050000 0.010000 0.060000 ( 0.053062) 破壊的変更した際に別に遅くなるとも思えんのでバグではないな 部分参照だけをした場合が笑えるほど速いので問題は無い …まあ、push しただけなのにdeleteとpushの2段階と同レベルの処理速度に落ちるということ自体 コードの見かけと実際の関係上あまりよくないという観測もなくはない気もするが (つまり、「共有の配列」から「本当の配列」に変換される、Rubyの裏側の動作がかなりごっつい)
>>436 残念
遅いのは delete_at の部分
share の部分配列を通常の配列に変換する、というのは、
配列から要素を削除して詰める、という行為と大して変わらない
ちなみに、これがわりと速いぞ
a2 = Array.new
a2.push(*a[1..-1])
配列の一部分を得たい場合は配列のスライス arr[s..e] を使うほうがいい、ってことだな
438 :
デフォルトの名無しさん :2009/04/15(水) 12:41:21
エラーが出ても処理を止めず、最後まで実行するようにしたいのですが、どうすればよいでしょうか?? PHPのようにブラウザで実行したとき、エラーメッセージをエラーが出た部分に出力するようにしたいのです。 begin とか rescue を使えばできるのかな?と思っているのですが・・ ご教示頂けると幸いです。
>>438 エラーが出たってことはそれ以上処理ができないということ
で、まあ、使ってるフレームワークのヘルプでも読め
処理中に起こって止まる原因となった例外をWebブラウザ上に表示させる方法がたいてい載ってる
440 :
デフォルトの名無しさん :2009/04/15(水) 13:24:30
レスどもです。 PHPの場合はエラーが発生してもなんとか最後まで実行しようとしてくれますよね?? rubyだとエラーが発生したあとの処理はどう頑張ってもやってくれないということでしょうか?
とりあえず、いきなりCGI作るのやめろ RubyはCGIを特別扱いしない 普通のコンソールのスクリプトでどういうことができるか勉強してからCGIやれ きっとそっちのほうが早い
PHPはWebブラウザから入力してWebブラウザに出力する特化型言語だからなあ… > PHPの場合はエラーが発生してもなんとか最後まで実行しようとしてくれますよね?? いいえ
PHPのエラーってWarningのこと言ってるの? それ以上処理できなかったらPHPだって止まるよ
444 :
440 :2009/04/15(水) 14:50:12
あそうか、warningの時は続けて実行してくれるけれど、fatal error の時はPHPでも止まるのか・・勘違いしてました、すいません。 ありがとうございますm(_ _)m
klassってなんですか><
klassの部分をclassに修正してみれば分かるよ
447 :
426 :2009/04/15(水) 19:57:26
遅レスだが
>>429 だいたいその理解でおk
細かいこというと、共有元を破壊的に変更する場合は、シェア状態を解除
するのではなく、複製してそっちを指すようになる。つまり共有先と同じ
>>431 ,434
ちがう
449 :
デフォルトの名無しさん :2009/04/15(水) 23:01:12
このスレってmatz, yugui, yarv, shugoさんとかが名無しで答えてたりするのかなぁ
少なくともよく答えてることはまずないと思う。 1〜2週間スレを見てればわかる。答えてたら失望するわ、おれ。
ここまでMatzの自演
こんな金にならないスレに顔出すより、 ブログに何か書く方が大事だろw
453 :
デフォルトの名無しさん :2009/04/15(水) 23:34:02
しかし、こういう立場のひとってブログに大きな態度で書けないよな。 リーナス君のようにならないことを祈る。。
どっちもどっちのような
内容見ずに態度見るような馬鹿を気にしてもしょうがないよ。 有名になると、何書いたって行為と悪意を両方増やす結果になるし。
×行為 ○好意
>>449 Ruby1.9には2ch bot yarvを新装備!
RSpec で、 hogehoge.rb に対して hogehoge_spec.rb を作ったら、シェルの補完で hog <Tab> と打って hogehoge.rb が一発で出るとかそういうのが阻害されてしまうから不便だ、という話をしたら spec ファイルは spec/ ディレクトリにまとめて入れろバカ というツッコミが来た 知らんかった でもこれって spec ファイルのほうからどうやってオリジナルのスクリプト読むん?
>>458 > spec ファイルは spec/ ディレクトリにまとめて入れろバカ
Rails on Rails の流儀だな
spec ディレクトリは自動で追加される環境の人だ
自力でどうにかできるものではないので、Rails で作ってないなら無視してよし
一応 File.expand_path とか File.dirname(__FILE__) とか駆使したファイルパスを require するようにすればなんとかなるとは思うが
>>458 俺の場合は __FILE__ を基準にして、他の場所のオリジナルを読むようにしてる
たとえばlibディレクトリなら
Pathname.new(__FILE__).dirname.parent.parent + 'lib'
で探す
RSpec使ったことないけど 補完の問題だけを考えるとspec_hogehoge.rbにするのはどうか?
>>458 $LOAD_PATH << ".." << "../lib"
require 'spec'
require 'hoge'
...
オフィシャルなファイルと被るファイル名の自作ファイルがあると動作しないのが難点だが、
require はまあそもそもそんなもんだな
ただ、下手に lib/ と spec/ があると、Rails の auto_spec.rb とか
なんかあのへんが動作すると期待されてしまうかもしれない
>>461 一応、spec/*_spec.rb というファイルをまとめて実行して
一気に lib/ 内のファイルのテストを試すサポートプログラム(autospec)が存在するので、
いつか自動テスト実行を覚えた時用に hogehoge_spec.rb という名前であったほうが好ましい
が、一人で使うぶんには spec_hogehoge.rb にしておくのがいちばん無難だな、めんどくさくないし
>>458-459 別にRails流ってこともないだろ。
Gemsとかつくる前提のときも spec/ に入れるのが一般的だし、
autotestも標準で spec/以下 と lib/を関連付けて見てくれる。
といっても、慣例でしかない気がするけど
>>458 $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
とかかな。
いちいち書くのめんどくさけりゃ
>>464 のいうautotestや、
Rakeにspec/rake/spectaskのSpec::Rake::SpecTaskを使って
テスト実行を肩代わりしてもらう。
この二つはデフォでは spec/*_spec.rb を相手にするから
たかが慣習、されど慣習と。
ねーよw
ファイルのロックを File#flock でなく IO#fcntl で実装しようかと思ったんですが、 これシステムの struct flock に依存するから簡単には portble に書けないですかね?
どこまでのポータビリティを求めてるのかによる。 Windowsとか言い出すなら問題外。
あ、rspec の、エクスペクテーションの should をまとめたいと思ってメソッド定義するよね あれってどこに書くべき? before で作ったインスタンス変数が読めなかったり def で定義したメソッドが見えなかったりでどこがどう妥当なのかよくわからん
>>469 何を言いたいのかよく分からないが
it (specify) を、複数の ExampleGroup で共有したいって事なら
share_as メソッドを探すと幸せになれるかもしれない
…たぶん、 describe Hoge do before :all do @val1 = ... ; @val2 = ... # (1) end (2) describe "#foo" do matomete_val_tesuto end end としたいときに、 def matomete_val_tesuto を (1) に書くか (2) に書くかって話なんじゃね (1) に書いたら describe "#foo" の中では使えないはず (2) に書いたら @val1 にアクセスできんな
setter の返り値について質問 a.hoge = b.hoge = value みたいな書き方ができるようにしようと思うのですが、 def hoge=(value) @hoge = validate(value) @hoge end と def hoge=(value) @hoge = validate(value) value end ではどちらがいいでしょうか? 場合によって value != validate(value) となります。
> a.hoge = b.hoge = value みたいな書き方ができるようにしようと思う そういうのやめとけ めんどくさいから ちなみに、 = つきメソッドは引数を返すように作られていることが期待されてる つまり、 def hoge=(val) @hoge=val end だ
前者をよしとする人はいないんでないの a=b=c が a==b==c にならないのはバグの元だし オペレータオーバーライドの悪い点をわざわざ利用する必要はないよ
今調べたら、セッターとして使うと引数が問答無用で返って、 sendで呼ぶと返した値が返る
>>475 うわあこれ知らんかった
今まで引数の値をわざわざ返してたのにー
…。 いや、なんつーか、 hoge = 1 の返り値は 1 だというのは知ってるよな def set_hoge @hoge = 1 end これの返り値は 1 だし、attr_* 系で作られる hoge= みたいなメソッドも引数を返す
478 :
472 :2009/04/17(金) 00:48:14
皆さんレスありがとうございます。
>>475 >今調べたら、セッターとして使うと引数が問答無用で返って、
ほんとだw
そもそも返り値を選択できなかったとは……
def hoge=(value)
return
end
でも引数が返ってきました。
setter の呼び出しは処理系が特別扱いしてるんですね。
[ruby-core:00637]より。 |If an assignment method which doesn't return an argument is not |intuitive, why don't ruby force it? Agreed. Last time I thought that, I was too lazy to modify compiler itself, and then forgot. I will fix it someday. だって。
480 :
472 :2009/04/17(金) 02:25:15
>>479 なるほど。
その結果として 1.8 では setter の戻り値を破棄して
引数を返すように変更されたと
確認してみたらピッケル本にもそのことがちゃんと書いてありました(言語編 p76)
>>477 バーカ
というかお前322と似てるな。バカ具合が
わざわざ終わった話題に安全圏から罵倒、というのはつい最近どこかで
クラスメソッドのエイリアスはどうやって定義しますか。
class Hoge def self.hoge ; end class << self alias hage hoge end end これ以外の方法知らん。他のやり方があったら教えて。
>>484 alias メソッドを使うとしたらそれくらいしかなさそうだな
あとは普通に self.hoge の中で self.hage を呼ぶしかあんめえ
alias_methodを使うというひねりもできるが、メタクラスを使う以外の方法はない。
rubyでcgiを作ろうと思います postを受け取るにはどうすればいいですか
>>487 他の言語でpostを受け取るのと同じ方法でできます。
>>487 単純には、標準入力に環境変数CONTENT_LENGTH長だけ入ってる、はず。
マルチパートやらデコードやらいろいろあるので、ライブラリを使うのが吉。
どのライブラリをどんな風に使うのがいいのかは、詳しい人を待って(オイ)。
>>488 うん、変わらんな
というか一度は自力でPOSTとか全部やってみたほうがいいと思うんだ
>>487 標準で cgi というライブラリがあるからそれ使え
自力で外部ライブラリをインストールしてもいい環境なのなら、
rubyforge から cgialt をインストールしてそれを cgi 互換ライブラリとして使え
他にもいくつかあるが、cgi ライブラリの使用経験とかを前提にしてたりするんで、最初は素直に cgi ライブラリ使え
rubyのcgiはかなりアレ。
>>468 メジャーな UNIX (Linux, *BSD, Solaris あたり) で動けば十分なんですが、
Google ソースコード検索や Koders でも Ruby の fcntl の用例が少ないみたいなんで
Ruby Inline か拡張ライブラリで fcntl(2) を直接使うことにします。
>>492 IOクラスにfcntlメソッドがあるので、わざわざそんな難しい方向に行かんでもええよ
指示代名詞も知らないゆとり乙
>>493 491じゃないが、仕様と実装が残念だった。
1.9系で後者は改善されたけど。
>>494 その IO#fcntl ですが、例えば file.fcntl(Fcntl::F_GETLK, arg) するとき、
arg には struct flock に pack したものを指定する必要があるのですが、
struct flock にどんなメンバがあるかは Ruby レベルからは知り得ないので、
やっぱり C で書く必要があると思うのです。
>>497 なんだ、そんなレベルのポータビリティでいいのか。
初心者に標準添付以外をいきなり勧める人って何なの
今ならgem install rackするだけだろ? rubyみたいな日本だけのドマイナー言語を選んで、さらにcgiがやりたいなんて 茨の道を歩くのは覚悟してもらわなきゃ
> rubyみたいな日本だけのドマイナー言語を選んで、さらにcgiがやりたいなんて 海外の開発系カンファレンスに何度か出席しているが、 どうみても日本より海外の方が、Ruby の関心が高い。 むしろ日本人は「Ruby 出来ない子」が多い、と感じる。
> 海外の開発系カンファレンス そういうやつらは「寿司、天ぷら、藤山、芸者」の日本好きの変わり者geekだろ。 狭いコミュニティに閉じこもって「関心が高い」じゃないだろ。 目を覚ませ。もう戦争は終わったんだ。 今は蛇言語でgwtの時代なんだよ。
せめてこのスレでは、Ruby初心者に有益な情報を書くように心がけられないもんかね Pythonがいいよってのも、Rubyのことを聞きに来た人間を迷わせる効果しかないと思うんだがね アンチは本スレでもアンチスレでも行けばいいんだ。 初心者スレにまで顔出すことはなかろうに。本格的に人間性を疑うわ。
カンファレンスは知らないがおれもそれは感じる。 新しいバージョンとかでつまづいたときググると、 役に立つのは大抵海外のサイト。向こうの方が精力的にやって気がする。 2ちゃんなんてRubyスレ全般で「1.9は使うな」だもんな。 2ちゃん見てる時点でアレだろと言われたらそれまでなのだが。
裸で冬山に特攻する初心者がいれば「行くな」とも言いたくなるわな
>>505 お前英語苦手だろ
英語で書いてあるというだけで凄いって思ってるだろ
海外の人だって「初心者」は Ruby 1.9 を使ってない
Vimで入門始めたけど、アホらしくてNetBeans入れてみた 信じられないくらい快適になった
>>507 別に得意じゃないけど英語だけですごいなんて思わないだろ。小学生かよ。
新しいことに関して日本のサイトはほとんど引っかからないし、
読んで実際に解決することが多いからそう思う。
あと「Rubyスレ全般」ってわざわざ書いてるんだからちゃんと読んでな。
たった5行なんだからさ。初心者スレに限定してないだろ。
日本人はRuby初心者が多い印象がある 外国人の人にとってのRubyは日本人にとってのPythonくらいの「詳しい人向け言語」な感じ
ruby-talk読んでるが、初心者らしいというかほほえましい質問が半分くらい(たいかん)
詳しい人はこんなところこないと思うよ 前にmswinの人がキレてたじゃん わざわざ顔出して見ず知らずのしかも自分の足下にも及ばないようなやつに、 口汚くレスされたりしてストレスためる必要ないだろ あと日本のRuby好きはRubyで何か作るというよりも、メンテナとかをやるのが好きなのかもね
ゴルフやってるんじゃねーの
514 :
デフォルトの名無しさん :2009/04/18(土) 11:16:09
month = 4 などの数字が入ってるとき、これを to_sなどで "04"という風に変換したいんですが、どうすればいいですか? month = 11 のときは、"11"です。 どうかお願いします。
'%02d' % 2 => "02" '%02d' % 11 => "11"
もしくは $ irb irb(main):001:0> sprintf("%02d", 4) => "04" irb(main):002:0> sprintf("%02d", 11) => "11"
MySQLをDBIを介して使おうとしているのですが、 テーブル名一覧を取得する方法をお教えいただけないでしょうか? dbh = DBI..connect("dbi:Mysql:test:localhost","user","password") table_names = dbh.execute("SHOW TABLES") p table_names とやると全然違うものが出力されてしまいます。 すいませんが、お教えいただけますでしょうか?
聞くときだけは丁寧だな。がんばれよw
519 :
517 :2009/04/18(土) 16:44:37
自己レスです。 結局DBIを介して行う方法はわからなかったので、Ruby/MySQLで接続して行いました。 require "mysql" dbh = Mysql::new("localhost","username","password") dbh.query("use database") p dbh.list_tables これで取得できそうです。
FreeBSD 7.1-RELEASE-p4 で irb 使ってます Delete キーを押すと ~ が表示されるんですが、同じような症状をさくっと治したという方はいませんでしょか csh 上では普通に後ろの文字が消えます
端末は何を使っとるん?
ええと、アプリケーションは Windows 上の PuTTY で、端末文字列は xterm-color 、 csh から bash を起動して C-v したあとに Delete キーを押すと ^[[3~ が表示されてます(csh 上ではどうやるんだろう?) screen 等は(まだ)使ってません 接続先は具体的にはさくらインターネットのレンタルサーバです なんか Ruby あんま関係ないような気がひしひしとしてます
irb を起動するとキー操作の動作が違う、という場合はいちおう Ruby スレの範疇だと思う まあ、irb 自体が独自に何かやってるわけじゃないけどさ
>>522 自分もさくらのレン鯖契約しているのでやってみた。
ログインシェルが csh なので、bash にしたあとで irb 起動してみたけど、
C-v したあとだったら delete キーを押すと再現したけど、
C^v しなければ、irb のプロンプト中に delete キーを押したら、ちゃんとカーソル位置の文字が消えたよ
C-v って何のためにやっているの?
C-vは、つぎの入力文字を視覚的に表示する機能では?
526 :
521 :2009/04/19(日) 00:31:07
>>525 C-v って vi のと同じように、次の入力をキーコードそのまま入力する機能だと思う。
PuTTY が Delete で吐くキーコードが 1b 5b 33 7e ってことだよね。
FreeBSD 7.1-RELEASE-p4 & PuTTY 0.60 ごった煮版 2007年8月6日版だけど、
カーソル位置の文字が消えた。
もし Readline を入れてなければ入れて、
それでダメなら ~/.inputrc に↓コレ書いてみて。
"\e[3~": delete-char
527 :
デフォルトの名無しさん :2009/04/19(日) 02:37:16
RubyのDBIを使おうとしているのですが、 $ irb irb(main):001:0> require 'dbi' => true irb(main):002:0> DBI.connect('dbi:mysql:test','root','root00') DBI::InterfaceError: Could not load driver (undefined local variable or method `e' for DBI:Module) from /usr/local/lib/site_ruby/1.8/dbi.rb:312:in `load_driver' from /usr/local/lib/site_ruby/1.8/dbi.rb:154:in `_get_full_driver' from /usr/local/lib/site_ruby/1.8/dbi.rb:139:in `connect' from (irb):2 となってしまい、うまくコネクトできません。ドライバはインストールしたつもりなのですが、 何か間違ってるでしょうか?
528 :
527 :2009/04/19(日) 02:50:31
mysql-ruby-2.8.1.tar.gz をインストールしたらできました。 DBIだけじゃなくて、Ruby/Mysqlのドライバもインストールしないとだめなんですね。 失礼しやした。
529 :
464 :2009/04/19(日) 08:50:34
連投規制で書き込めなかった
>>464 の
> autotestも標準で spec/以下 と lib/を関連付けて見てくれる。
は、厳密には間違いで、rspecに含まれる autotest用のプラグイン?が spec/とlib/を関連付けてみてくれる
>>469-471 spec_helper.rb(か、もしくはそこからrequrieする.rb)内でshare_asで定義して、includeするとか
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]を使用しています open("|")(I/Oパイプ付)で起動した外部プロセスを強制終了する事ってできますか? 外部コマンドの結果でその後の動作を変えるようなことをしていますが 大体の場合全ての結果を受け取らずとも判定が出来るので 判定が出来た時点で外部コマンドを強制終了して判定にかかる時間を短縮したいです
>>530 IO#pid で外部コマンドの pid が取れるみたいね。あとは
>>531 の通りで。
UTF8のBOMを含むStringからBOMを取り除く方法は?
iirb> require 'kconv' irb> text = File.open('test.txt'){|f| f.read} => "\357\273\277test\ntest\ntest\n" irb> text.toutf8 => "test\ntest\ntest\n" まあ、ある意味盲点ではあるな
盲点ってかただの副作用では そういうのこそ、メソッドを用意すればいいのに
というよりは、 BOM 無し UTF-8 を出力する、だね
BOMについては特につけることも取ることもしない、というスタンスなんだっけか
.toutf8もNKFも、余計な変換をしそうで怖いです。 やりたいのはBOMを除くことだけで、変換とかいっさい必要ないんですが。 あと、BOMを含むかどうかの判定方法もお願いします。 今は str.unpack('H6').first == "efbbbf" としてるんですけど、どう考えても頭悪い方法です。
BOM = "\357\273\277" str[0,3] = "" if str[0,3] == BOM str.sub(/\A#{BOM}/, "") こういうのでいいんじゃない?
str.sub!(/\A\xEF\xBB\xBF/, '') あたりで
Ruby 1.8.7以降だとString#start_with?ってのがあるからそれで判定しても
自分でString#bom?とか適当なメソッドを定義すればいい 表面上スマートに見えても内部は泥臭いなんて当たり前
545 :
530 :2009/04/21(火) 00:17:20
>>531-532 レスありがとうございます
やってみました…が、外部プロセスの実行が終了したあとにI/Oパイプが開いている気が…
io.each_lineで読み出し中にProcess.kill(9, io.pid)しても実行時間が変わりません
仕様かな…
>>545 io.closeするだけで良いんじゃね?
require したファイルの一覧って取得できますか
自己レスですが
>>547 $LOADED_FEATURES というのがあるらしい。
マニュアルは読んでみるものですね。
549 :
464 :2009/04/21(火) 12:39:37
riに失敗してしまうのですが、これはどのようなエラーでしょうか? 回避する方法はありませんでしょうか? > ri String#lines (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:532:in `lookup_ancestor': undefined method `+' for nil:NilClass (NoMethodError) from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:610:in `run' from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:605:in `loop' from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:605:in `run' from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:588:in `each' from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:588:in `run' from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:311:in `run' from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/bin/ri:5 from (ruby installed directory)/bin/ri:19:in `load' from (ruby installed directory)/bin/ri:19 > ri --version ri 2.2.0 >ruby --version ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]
550 :
549 :2009/04/21(火) 12:46:51
名前の464はミスです。キニシナイでくだしあ
gemで自分でriを入れたのか。 それを消せばいいんじゃね?
1年前のスクリプトを眺める …ライブラリそのものをナチュラルに継承すんな、っていうか重要メソッド上書きすんな ライブラリのオブジェクトをインスタンス変数に保持してメソッドを依頼するラッパー操作クラス作るだけで十分じゃねーか 来年には「この改造無駄だったなー」と思えるようになるのだろうか
家庭用プログラムのテスト駆動開発とかなんかそのへんでしつもん a というメソッドを作ってる最中に、その中の特定の処理を a' というメソッドに分けたとして、 def a aaaaa bbbbb ccccc ... ↓ def a' bbbbb ccccc end def a aaaaa a' ..... その a' についてのテスト項目は作るほうがいい? それとも、 a についてのテストをちょこっと詳しくする程度で、a が完動したことをもって「隠して」おくのが普通?
「普通」がまだ決まってない。 テストしろ、とかpublicなメソッドのテストがパスしてるんだからおkとか、 モックとかスタブとか使えば、とか。
privateなメソッドはそもそもテストできないようなテストフレームワークもあるような?
テストしまくり中はメソッドのアクセス制御は敢えてしないと思うんだが ユーザーからの隠蔽だけが目的の場合(つまり大多数の場合)はふつうにめんどくさいじゃん?
>>553 基本的には作らないが、他のメソッドからも使う(ような気がする)場合は仕様書的にspecファイルに書く
return するものがたくさんあるようなメソッドにうっかり育ててしまった場合もやっぱ書く
最初は全部書いてたんだけど、describe がメソッド 1個に対応するような使い方をしてると引数とかで正直非常にめんどい
558 :
549 :2009/04/22(水) 07:43:36
>>550 うは。確かにgemのrdocに入っているんですね。
gem update rdocしたらエラーでなくなった!!
でも…
> ri String#lines
Updating ri class cache with 5126 classes...
Nothing known about String#lines
うーん。こういうことって普通にあるの?
gemのrdocのriが駄目かと思ってrdoc消してみたら、
>ri String#lines
(ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:805:in `report_
activate_error': Could not find RubyGem rdoc (>= 0) (Gem::LoadError)
from (ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:24
3:in `activate'
from (ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:50
:in `gem'
from (ruby directory)/bin/ri:18
orz
インスタンス変数へのアクセスと、クラス変数へのアクセスと、ローカル変数へのアクセスを 速い順にならべるとどうなりますか。 クラス変数へのアクセスはだいぶ遅そうだとは思いますが、インスタンス変数とローカル変数へのアクセスにどのくらい違いがあるのか知りたいです。
>>559 これが速度に影響するような用途のプログラムであるなら、Rubyで作らないほうがよい
ブロックつきメソッドとか使われてたら奇声上げてキーボード投げつけるレベル
ちなみに
アクセス遅い アクセス速い
クラス変数 > インスタンス変数 > ブロック外のローカル変数 > ブロック内のローカル変数
こんな順番だったと思うが、どっかに言及があったはず
tips: Hash[:symbol] > Struct > Hash["string"] >>>>>(越えられない壁) >>>> OpenStruct
>>562 例えば、これでどう?
require "securerandom"
p SecureRandom.uuid
def uniqid(prefix = "", more_entropy = false) id = "%s%x" % [prefix, Time.now.to_f*1_000_000] id << ".%.8d" % rand(100_000_000) if more_entropy id end
>>563 SecureRandom.uuidは1.8.7じゃ使えないからなぁ。
require "rubygems"
require "uuidtools"
p UUID.timestamp_create
>>564 「赤毛のアン」が検出されるんだが・・・?
Rubyも赤いからいいんじゃない?
そんな「Ruby界隈」は知らない。
>>570 気を悪くしたらすいません。
なかなか見やすいと感じたので気になっているのです。
>>571 気を悪くしたんじゃなくて、それが流行ってるのは「Ruby界隈」と言えるほど広い世界でもないし中心に近くもないだろ、と。
で、その辺の人たちはKeynote使ってるんじゃないの。
もしかして、「高橋メソッド」のことを言ってるとか?
>>569 このプレゼンはおもしろかった。
このなかで Rails は「ちょっとしたことをやるには大げさ」とあるが、
自分は Java → Ruby ときたけど、Java の web フレームワークに比べれば
Rails はずっと軽くて楽だと感じる。
この sinatra というのは、流行っているんですか?
最近名前聞くねぇ。 使ったことないというか、そっち方面は全然手がけないんだが。
Winでファイルのアーカイブフラグが立っているかを判定したり フラグをセットしたりするのってどうやるの?
>>576 File::Stat に見当たらないということはサポートされてないのかなあ
自分には Win32API の GetFileAttribute/SetFileAttribute を呼ぶくらいしか思いつかない
標準では無いよ gemのWindowsファイルシステム操作ライブラリで見た覚えがあるので適当なの使え
win32-fileにあったと思う
rubyscript2exeが動かなくなってしまいました。非常に困っています。 何か解決策はありませんでしょうか? > rubyscript2exe test.rb Tracing test ... Gathering files... c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb:60:in `gatherlibs': undefined method `list' for Gem::Specification:Class (NoMethodError) from c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb:30 from test.rb:1 hellow Couldn't execute this command (rc=256): d:\software\ruby\bin\ruby -r 'enumerator.so' -r 'rubygems/rubygems_version.rb' -r 'rubygems/defaults.rb' -r 'thread.so' -r 'thread.rb' -r 'etc.so' -r 'rbconfig.rb' -r 'rubygems/exceptions.rb' -r 'rubygems/requirement.rb' -r 'rubygems/version.rb' -r 'rubygems/dependency.rb' -r 'rubygems/gem_path_searcher.rb' -r 'rubygems/user_interaction.rb' -r 'rubygems/platform.rb' -r 'rubygems/specification.rb' -r 'rubygems/source_index.rb' -r 'rubygems/builder.rb' -r 'stringio.so' -r 'yaml/error.rb' -r 'syck.so' -r 'yaml/ypath.rb' -r 'yaml/basenode.rb' -r 'yaml/syck.rb' -r 'yaml/tag.rb' -r 'yaml/stream.rb' -r 'yaml/constants.rb' -r 'rational.rb' -r 'date/format.rb' -r 'date.rb' -r 'yaml/rubytypes.rb' -r 'yaml/types.rb' -r 'yaml.rb' -r 'Win32API.so' -r 'rubygems/config_file.rb' -r 'rubygems/custom_require.rb' -r 'fileutils.rb' -r 'rubygems.rb' -r 'ubygems.rb' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1' -I 'd:/software/ruby/lib/ruby/gems/1.8/gems/rubyscript2exe-0.5.3/bin' -I 'd:/software/ruby/lib/ruby/gems/1.8/gems/rubyscript2exe-0.5.3/lib'
-I 'd:/software/ruby/lib/ruby/site_ruby/1.8' -I 'd:/software/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt' -I 'd:/software/ruby/lib/ruby/site_ruby' -I 'd:/software/ruby/lib/ruby/vendor_ruby/1.8' -I 'd:/software/ruby/lib/ruby/vendor_ruby/1.8/i386-msvcrt' -I 'd:/software/ruby/lib/ruby/vendor_ruby' -I 'd:/software/ruby/lib/ruby/1.8' -I 'd:/software/ruby/lib/ruby/1.8/i386-mswin32' -I '.' -I 'd:/home/test/ruby/' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/lib' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/lib' -r 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb' 'test.rb' Stopped. > ruby --version ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32] > gem --version 1.3.2
undefined method `list' for Gem::Specification:Class (NoMethodError) Gem::Specification.listメソッドはgem 1.3.1になら存在する。 1.3.2では削除されたようだ。 gatherlibsを修正するか、gemコマンドをダウングレードする。 そしてrubyscript2exeの開発元に連絡をする。
x Ocraそこそこコンパクトな上に、起動が早くてよさげです。 o Ocraそこそこコンパクトな上に、exe化したプログラムの起動が早くてよさげです
どうして、ruby -pの後のgsubはレシーバが省略できるのですか? いつも使ってて便利だなあと思ってるけど不思議に思ってます。 ruby -p -i.bak -e'gsub(/hoge/, "fuga")' data.out
>>586 関数的メソッド gsub が呼ばれているだけだ(こいつは $_ をレシーバとして扱う)
String#gsub が直接ワンライナー用にいじられて呼ばれているとかそういうわけではない
588 :
デフォルトの名無しさん :2009/04/25(土) 08:35:56
class SomeClass @@message = "call myself Mr.#{@name}!" def initialize(name) @name = name end end このまま@@messageを参照すると、@nameが未定義の段階で定義しているため出力は"call myself Mr.!"となります。 このように後で@nameに値が入ったとき(あるいは変更されたとき) @@messageを参照する段階で@nameを再度当てはめるとしたら、どのように書けばよいでしょうか。
クラス変数を使わない いやわりとマジで 特定のインスタンスの状態に左右されるクラス変数というのは奇妙 特定のインスタンスの変数を参照する大域変数というのはそれは普通インスタンス変数にする というか、@@name を initialize の中で毎回変更してそれを @@message で参照するという形ではダメなん?
590 :
588 :2009/04/25(土) 09:24:21
>>589 ありがとうございます。た、たしかに言われてみたら使い方もちょっとおかしいし、
そもそもクラス変数でやってたのがよくなかったんですね・・・
試しに@@messageをメッセージを返すインスタンス"メソッド"にしてみたら問題なく置き換えられました。
なお試してみますm(_ _)m
591 :
デフォルトの名無しさん :2009/04/25(土) 17:51:40
はじめまして。困ってます;至急お願いします。 Rubyをはじめようと思うのですがどうすればいいかわかりません。 まず公式HPに行ってもどれをダウンロードすればいいかわかりません。 ソースコード以外に実行ファイルが見当たりません。 何かをインストール等する必要はないのですか? 僕はパソコンは上級者と言ってもいいほどなんでもできるのですが ここまでわけのわからないことは初めてで焦っています。 まずルビーのプログラムを書く段階までのやり方を教えてください。
またそんな玄人的なネタを投下してw
初心者だから教えてくれ、という意味? それは唯の対処療法で根本的原因の解決ではない。 頭痛がするから薬を使って誤魔化すのと同じこと。 また困った時に同じように薬使ってごまかすのかな。 使い方はそこらへんに結構転がっているよ。 自分の環境構築するのも技術の一つだよ。
いや、上級者だといってるだろ
595 :
デフォルトの名無しさん :2009/04/25(土) 18:09:52
もしかしてメモ帳で書く、ということですか? エディターみたいなものは公式サイトで配布していないのですか? 他の候補で見ていたC#なら公式サイトでMicrosoft Visual Basic 2008 Express Editionというのが配布されていました。 簡単に作りたかったのでRubyを選んだのですが本当に困っています。 小さいころにHSP(Hot Soup Processor)をやったことがあるのですがそこの公式サイトでもエディターやテストするためのものが公式サイトで配布されていました。 僕は今そのようなものを探しているのですが見当たりません。 そのようなものは存在しないのですか?
>>591 > ルビーのプログラムを書く段階までのやり方
1.エディタを用意します。なんでもいいです。目的はテキストファイルを作成することです。
例えばMS-DOSに馴染んでいれば、最悪
copy con hello.rb
なんてのでも大丈夫です。
2.思う通りのるびーのプログラムを書いたら、その内容をテキストファイルとして保存して下さい。
※ 上記の2は、書くまでの段階では必要ではありませんので、飛ばしても結構です。
以上です。
598 :
デフォルトの名無しさん :2009/04/25(土) 18:17:09
>>593 さんの書き込みをヒントに「ruby 開発環境」と検索したところ
RDEというエディターを見つけました。とりあえず解決しましたので
回答していただいたみなさまありがとうございました。
IDEがないというのは上級者にとっては最初に焦る事態なのか なるほど
>>599 俺は20代だけど、周りみてると統合環境から入るやつが大半だった
学生の時分とかね
つメモ帳 でよかったのか PC上級者は、プログラムは専用アプリで書くものと思いがちってことなのかな 勉強になった
時代は巡るねぇ。
どっちかというと 下地が分からないからIDEなんだと思う。
紙に書いてパンチカードで打ってた時代があったとか、知識や想像の範囲外なんだろうな デバッグは全部プリントアウトとか そんなの実際には知らんから、もしかして俺騙されてる?
プログラム全体が一望できた時代は、デバッグは全部プリントアウトでも良かったし それの方が効率が良かったんだよ 今はテストケース無しでは不可能だろう、そうするとIDEの力を借りる必要が出てくる。 今ではIDEが使えないのでは上級とは言えないだろう。
用は IDEしか使えないと IDEを使ってる ではぜんぜん違うということでしょ?
「IDEが使えない」と 「IDEがないと何も出来ない」はぜんぜん違うよ。
>>605 だが待って欲しい
それは本当に、まずルビーのプログラムを書く段階まで、に必要な事だろうか
ってあんまりこれ引っ張るのもなw
全部を知る必要も無いって事でもある
パンチカードの思いでをちょっと あれは一瞬で行が入れ替えられる、それを活用したデバッグやトラインアドエラー作業はいろいろと面白い効率の高さがあった。 でもね、あれはCOBOLやFORTRANの時代のプログラムが行単位で記述されているから効率がいいんだ。 今の自由文法でそれは可能だろうか?、否ですね。 今の時代には今のやり方があるって事だ。
先生! make や rake は IDE に入りますか? あるいは、IDE 足り得ますか?
>>610 ていうかプログラミングの形態ではなくて、backgroundはどうなっているか
を理解しているかどうかの話だと思ってた。
背景を追うと、ではどこまで追う気だって話になる、どこかで打ち止めしておかないと、話が進まない。 まあ、中にはC++のように背景無しでは思わぬ罠にはまる、しかもはまっている事に気づいていないなどという恐ろしい言語もあるのですべてとは言わない。
>>611 IntegratedなEnvironmentでないとIDEとは呼べないと思う。
ネタと信じたいと思いつつマジレス、あたりで。
>>591 つ
http://www.ruby-lang.org/ja/downloads/ 1.Windows版(mswin32、mingw)の場合
どこかでバイナリを配ってる
2.cygwinの場合
同じくバイナリ配られてる
3.Mac OS Xの場合
MacPortで入れればOK
4.Ubuntuの場合
sudo apt-get install ruby
5.Debianの場合
su -
apt-get install ruby
exit
6.Fedoraなどの場合
su -
yum install ruby
exit
7.その他Unix系の場合
まずgccやmakeがあることを確認
ソースコードを持ってきて解凍する(やり方はさすがに知ってるだろJK)
configureのあるディレクトリにcd
./configure
make
su
make install
exit
>>617 で、どうやってプログラム書くんですか><
って質問だったりするんだなこれが。
解決済みだし、もういいじゃんw
>>618 初心者スレにはちょっとヤな感じ。自重しよう。
とりあえず、大体皆が同じ認識を持ってることは分かったから なんか嬉しい。
>>618 1.まず適当なテキストエディタ(Windowsなら極論すればメモ帳でもいいが
あとあとつらくなる)を準備しましょう
2.次にこのようなプログラムを書きましょう
puts "Hello, world"
3.これを拡張子rbにして保存しましょう(メモ帳の場合はすべてのファイルにしてから
適当な名前.rbと名前欄に入力)
4.次にこのようにコマンドを入力しましょう(カレントディレクトリはさっきの
プログラムの場所で、rubyへのパスはすでに通っていると仮定する)
ruby さっきのプログラム名
5.すると次のように表示されるでしょう
Hello, world
これでプログラムが実行できていることがわかります
「IDEが面倒」と思ってる人に聞きたいんだけど Ruby開発において、それでもやっぱりIDEが役に立つ場面ってある? 何度か手を出そうとはしたんだけど、その度にやる気が出ず挫折している 「IDEのこんな部分が便利」という点があれば教えてほしい
RadRails使っているよ。補完重すぎるし、候補で過ぎて意味ねえ そんなにすごいいいかって言われると、ないよりマシって感じ。てか重い
RadRailsのいいところ
・GUIでデバッグできる。
・メソッドにカーソル合わせるとドキュメント表示(今は日本語化ける)
・インテリセンスみたいな構文考慮した補完が効く(重い、候補多すぎ)
・ファイル構造をツリー表示
・rake タスクをGUIで選択実行
他なにかあるかなー。文脈非依存の単語補完とかスニペットはテキストエディタでもあるしな。
基本的には、他のIDEと一緒だと思うけど、
全体的にはまだまだ。とりあえず、IDEほしいという人向け。
Visual StudioとかCodeGear(Borland)みたいなIDE想像したら駄目。
あと、
>>624 も言っているけど、静的型言語のIDEみたいな補完じゃない。
インテリセンスとかで高速で補完しまくってガリガリ書いていくのを経験してきた人が使ったら、
たぶんガッカリすると思うよ。
NetBeansはプロジェクトルートに.rb置けないww ので即アンインストールした
あと、クリップボード処理がうんこ。まともにコピー、ペーストもできないIDEワロタ
めちゃくちゃ軽くて初見はすばらしかったんだけどね
RadRails追加。というか、ほとんどEclipseの機能だと思うけど ・インクリメンタルでメソッド選択してジャンプ ・インクリメンタルにファイル検索して開く ・指定ファイルの指定行に飛ぶブックマーク機能 Aptanaの機能も入れるなら、Aptana Cloudと連携してIDEから一発デプロイとかまあ、あるけどさ (でもどうせデプロイはCapistranoとかで書いてるでしょみなさんは)
NetBeansは、autotest対応はよかったな。 autotest/screenみたいに、エディタの下に色つきで表示出る
628 :
デフォルトの名無しさん :2009/04/26(日) 22:43:18
1.8.7とVistaHPという環境でコマンドラインからRubyファイルを実行すると pメソッドもprintメソッドも日本語が文字化けします。 起動オプションで -Ks を指定しても文字化けします。 ファイルのエンコーディングはUTF-8ですがSHIFT-JISで保存し直しても文字化けします。 NetBeansでデバッグすると、printでは文字化けしませんがpだと文字化けします。 何が原因でしょうか?
629 :
ごすけ :2009/04/26(日) 22:59:17
こんばんは。質問させてください。 /*引数(自然数)n(<=1000)の入力に対して1~nの間の素数をすべて求めて、 コンソールに表示するプログラムを作成せよ。(ちなみに1は素数ではない)*/ のC言語でのプログラムの作り方を教えてください。ルートは使わず、なるべくfor文で お願いします。
>>628 Vistaのことはわかんけど、
>NetBeansでデバッグすると、printでは文字化けしませんがpだと文字化けします。
これはしょうがないんじゃないかな。他の環境でも同じだと思う。
-- hoge.rb --
puts 'ほげ'
p 'ほげ'
-----------
$ ruby hoge.rb
ほげ
"¥343¥201¥273¥343¥201¥222"
正確に言うと、これは文字化けではなくて、文字列をバイナリ表記したもの。
p は引数をinspectした結果を表示するけど、日本語を含む文字列だとinspectするとバイナリ表記になってしまう。
array への追加についての質問です。 DBのいくつかのテーブル数分検索し、検索結果を配列に追加したいです。 my_array = [] for table_name in table_names my_array.push = my_func(table_name) end 上記のコードだと、my_func が返す array を、my_array の要素とするので2重の配列になってしまいます。 result = my_array + my_func とすると、 配列の後ろにどんどん要素を追加することができ、これが自分のやりたいことなのですが、 Rubyのリファレンスをみると、array の + は my_array は変更せず、左辺に新しい配列を作成します。 上記の for table_name in table_names は結構なループ量になり、 かつ my_func が返すレコード件数(配列のサイズ)も大きいため、毎回 新しい配列を作って返すのは、コストが高いのではと懸念しています。 そこで下記のようなコードを書きましたが、+ でつなげるのと下記のコードと、 どちらがいいでしょうか? my_array = [] for table_name in table_names result = my_func(table_name) result.each do |val| my_array.push val end end
my_array.concat(my_func(table_name))
634 :
632 :2009/04/27(月) 14:09:10
>>633 ドンピシャです!! どうもありがとうございました。
おなじ Array のマニュアルページに書いてあるのに見逃してしまった。
Singletonをインクルードしたクラスのinstanceメソッドに引数渡せないのって不便くね?
生成時に渡す引数によってオブジェクトの振る舞いが変化するようなものは そもそも Singleton に向かないってことなんじゃまいか? 色々必要ならそんだけクラス作れよと
instanceに引数が渡せるほうが不安だ。
>>635 Singletonをインクルードしたクラスを生成するメソッドを書けばおk
どこで聞いたらいいのかわからんのですが、ここで聞きます。 Ubuntu 8.0 LTSだと apt-getで入るのが Rubyが1.8.6なのですが、1.8.7が使いたいです。 1.8.7使うには自分でコンパイルするしかないのでしょうか? Rubyスレの方がよかったら誘導してください
すいません、Ubuntu 8.0 LTS → Ubuntu 8.04 LTS です
641 :
635 :2009/04/28(火) 13:17:57
ごちゃごちゃやってたら、頭の中がこんがらがってきた。 結局コンストラクタに引数を渡せるようにしたままsingleton化したい場合は、Singletonモジュールは 使わずに、該当クラスのnewメソッドを複数のインスタンスを生成できないように書いてしまえばいい だけ? とか思ったが、何か根本的に間違ってるような気もするw クラスメソッドとしてのnewは明示的に書けてしまうみたいだけど、その場合自分(クラス)のインス タンスを生成するコードはどうやって書けばいいのかな? newメソッドはインスタンスを返すのが 普通だから、それを生成するコードがどうしても必要だよね?
>>640 自前ビルドでRubyを入れると、他のRubyに依存してるパッケージも全て
自前ビルドするか、パッケージの依存関係をごまかすかしなきゃならない。
どちらにしてもすごく簡単ではないけど大丈夫?
>>641 自己レス。
特定のクラスが(自分の定義中で)自分のインスタンスを生成するには、クラスメソッド(たとえばnew)
の中で<自分の名前>.allocateを実行すればいいらしい。(allocate自体はどこからでも呼べる)
ただしそのインスタンスをinitializeするには、(自分の定義中にある)他のインスタンスメソッドを
介さなければならない。
なぜなら、<自分の名前>.allocateの戻り値をinstで受け取ったとするとinst.initializeとしたくなるが、
initializeはprivateメソッドなのでレシーバ省略形式でしか呼び出せず、レシーバ省略形式で呼び出す
には、(クラスメソッドから呼び出せる)publicなインスタンスメソッドの中で呼び出すしかないから。
>>639 >1.8.7使うには自分でコンパイルするしかないのでしょうか?
うんそう。
UbuntsuってDebian系だよね。DebianだとRubyが複数のパッケージに分散していてインストールするのがめんどくさいから、
おれが試した時は自前でインストールするほうが簡単だった。
以下おれの方法。rubyのバージョンごとにディレクトリを分けているので、configureするときに--prefixをつけてる(つけなければ/usr/localになる)。
wget
ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p160.tar.bz2 tar xjf ruby-1.8.7-p160.tar.bz2
cd ruby-1.8.7-p160/
sudo mkdir -p /usr/local/ruby/1.8.7-p160
./configure --prefix=/usr/local/ruby/1.8.7-p160
make
sudo make install
パッチレベルすらディレクトリを分離してるのか。 まあその方が、トラブル時には切り分けやすいか…。
ディスクがたくさんあっていい感じだ
文字列、配列、ハッシュの初期化の書き方についての質問です。 以下のそれぞれのペアは、等価?(どっちで書いても良い?) my_string = "" my_string = String.new my_array = [] my_array = Array.new my_hash = {} my_hash = Hash.new
649 :
647 :2009/04/28(火) 19:37:17
>>643 inst.instance_eval{initialize} じゃダメ?
651 :
デフォルトの名無しさん :2009/04/28(火) 22:35:42
てか self.class.new でダメなことって少ないよな
今まで数年間、テキストエディタのみでプログラミングしていたのですが そろそろIDEにも、試しに手を出してみようかと考えています Rubyに対応したIDEを探してみると、RDEの他には Aptana Rails、NetBeans、Eclipse DLTKが見つかったのですが これらの中で「これがオススメ」というものはありますか? シンプルで理解が難しくないものを求めているのですが……
特にありません
テキストエディタのみとかおれには考えられん 環境がなかった昔はもちろんやってたけどな
俺は今のところ IDE なしでもそんな不便はしてないかな Cygwin + bash + vim + rake + 自作ツールっていう構成だけど ただ、やってるうちに Rakefile がでっかくなっていくけどw
テキストエディタのみって言っても UNIX環境の支援のもとに emacs やら vim 使ってるのと Windowsでメモ帳とか使ってるのとでは全然違うよな
emacs + αで十分IDEチック
メモ帳はまさにメモ帳であって。 emacsはフルカスタマイズ可能!ってか。 変態的な操作方法をもちょっと控えて、GUIベースのタブでバッファを切り替えるような ものなら、もうちょっとご新規さんにもアピールするかと思うんだが。
660 :
639 :2009/04/29(水) 09:15:30
>>659 (EmacsをEmacsとして理解できないものには)Emacsを使うのは難しい。
Aquamacsだとタブが出るけどな。
>>643 たぶん普通は
require 'singleton'
class C
include Singleton
def initialize
@i = nil
end
attr_accessor :i
def self.init(i)
c = self.instance
c.i = 1
c
end
end
p C.instance #=> #<C:0xb7d853e4 @i=nil>
p C.init(1) #=> #<C:0xb7d853e4 @i=1>
p C.instance #=> #<C:0xb7d853e4 @i=1>
>>662 それを許すんならもはや定数に代入した普通のオブジェクトと変わらない気が
ていうか、読みにくい
665 :
635 :2009/04/29(水) 15:10:47
みなさんレスありがとうございます。
>>650 >
>>643 > inst.instance_eval{initialize} じゃダメ?
それでよさそうですね。初めて知りました。
もともと
>>635 と書いたのは、「引数を渡したいのは初期化の時だけだが、一度instanceしてから
値を渡すのが面倒」というのがあったからなので、
>>662 のやり方が簡単で良さそうです。
>>662 の中の
> c.i = 1
は
> c.i = i
ですよね。
結局自分もsingletonにする意味あんまりないなと思い始めてしまってますが、最初の動機がたいした
ことじゃなかったということですね。
ruby-pg-0.8.0ってPGresultのresultって使えますか? num_tuplesとかは正常なのにresultとかstatusだとNoMethodErrorになります。 今までずっと古いやつを使っていたんですがメソッド名が変わったりとかしたんですかね?
>>666 おお!俺も数日前にそれで困ってましたw
俺がしたこと
1) requireの置き換え
require "pg" # require "postgres"
2) resultメソッドの置き換え
res.map {|rowmap| res.fields.map {|f| rowmap[f]}} # return res.result
resultが無くなったのか、名前が変わったのかは知りません。
statusのほうは使ったことがありませんのであしからず。
668 :
666 :2009/04/29(水) 18:39:50
>>667 ありがとうございます!取得できるようになりました!
根本的な原因は気になりますが、
とりあえず動くようになったのでよしとします。
669 :
653 :2009/04/29(水) 18:58:20
いろいろなご意見ありがとうございます!
基本的にエディタ派の方が多いようですね
ただ、655さんの環境も気になります
>>657 Windows環境で、主にNotepad++を使ってスクリプトを書いております
コマンドライン環境はNYAOS+GnuWin32の構成です
VRFormってどこにあるの?rubyのフォルダを検索しても見つからない。 ほとんどのコントロールはvrcontrol.rbにあるのに。
Array同士を簡単に同じでない行を調べることってできませんでしょうか? a - a2みたいだと、差分という感じではない気がします。 通常のdiffツールだと、出力結果が上から調べるので順番に依存してしまいます(´・ω・`)
>>672 あああああ、
pp (a2 - a)
pp (a - a2)
とお互い引けば、いいのかw
書いて気づいた
同じでない行ではあるか
メソッド呼び出しにおいて、メソッド名と引数を囲む括弧の間には、 スペースを入れないことをおすすめする。
排他的論理和は (a|a2) - (a&a2) でも
エクスクルゥーシブー・オアッ!!
677 :
デフォルトの名無しさん :2009/05/02(土) 19:53:16
勉強始めたらいきなりこんなもん見つけたんですけど。 バグでしょ? #ruby 1.8.7p72 mswin32 module A def f() print "test ok!\n" end end #include A A::f() test.rb:7: undefined method `f' for A:Module (NoMethodError) ちゃうか〜
Rubyに限らないけど、まず自分のプログラムに問題がないか考えた方がいいよ。 2〜3回くらい恥をかけば直るんだけどね。最初からかかないことにこしたことはない。
Rubyのめんどくさいところにいきなりぶつかるセンスは賞賛に値すると思う
681 :
デフォルトの名無しさん :2009/05/02(土) 20:17:12
そっか、バグじゃないかぁ コメントアウトしてあるinclue Aを生かすと、動作しちゃうんですけど。 変じゃね?
>>681 どうしてコメントをはずすの?
なんのためにコメントをはずすの?
683 :
677 :2009/05/02(土) 20:32:47
なんのためにといわれても... テストプログラムだからいろんなケースを比較して、 変じゃないかなと
つまり、意味もわからずincludeしたりしなかったりを試していると。
685 :
677 :2009/05/02(土) 20:56:15
print Math::PIは動くね。 もっとも、Mathはrubyインタープリターによって 特別待遇を受けているだろうから、あまり比較にはならんだろうけど。
>>685 >>681 は目の付け所いいなと思ったけど・・・
Module#module_functionは読んだ?
687 :
677 :2009/05/02(土) 21:37:08
なるほど、すくなくとも仕様であることは、理解しました。 どうもありがとうございます。 しかし、なんとも不可解に見える仕様。でも、理由があるんでしょう。 勉強します。
>>683 ちゃんと理由を考えながらテストしないと、あまり意味がないぞ
結論から言うと理解を間違えている
A::f() の形でメソッドを呼びたいなら、次のような方法を使うべき
(他にも特異クラスを使った方法とかあるけど、ここでは省略)
1.
def A.f()
end
2.
module A
module_function
def f()
end
end
module_functionというのは知らなかったので試してみた。
折角なので張っておく。 これで
>>677 の疑問も解けるとよいけど。
irb(main):001:0> module M
irb(main):002:1> def self.f() [:module, self] end
irb(main):003:1> def f() [:instance, self] end
irb(main):004:1> module_function
irb(main):005:1> def mf; [:module_function, self] end
irb(main):006:1> end
irb(main):007:0> class C
irb(main):008:1> include M
irb(main):009:1> def cmf() mf end
irb(main):010:1> end
irb(main):011:0> c = C.new
=> #<C:0x28de620>
irb(main):013:0* M.f
=> [:module, M]
irb(main):014:0> C.f
NoMethodError: undefined method `f' for C:Class
irb(main):015:0> c.f
=> [:instance, #<C:0x28de620>]
irb(main):016:0> M.mf
=> [:module_function, M]
irb(main):017:0> C.mf
NoMethodError: undefined method `mf' for C:Class
irb(main):018:0> c.mf
NoMethodError: private method `mf' called for #<C:0x28de620>
irb(main):019:0> c.cmf
=> [:module_function, #<C:0x28de620>]
irb(main):020:0> include M
=> Object
irb(main):021:0> mf
=> [:module_function, main]
さっきのを書いている間に生じた疑問がひとつ。 親クラスのクラスメソッドは継承されるけど、 インクルードしたモジュールのクラスメソッド(?)は継承されない。 module_functionのクラスメソッド側もやはり同じ。 いったいどういう理由でこうなっているの? irb(main):001:0> module M irb(main):002:1> def self.f() [:module, self] end irb(main):003:1> module_function irb(main):004:1> def mf() [:module_function, self] end irb(main):005:1> end irb(main):006:0> class C0 irb(main):007:1> def self.cf() [:class, self] end irb(main):008:1> end irb(main):009:0> class C < C0; include M end irb(main):010:0> C.f NoMethodError: undefined method `f' for C:Class irb(main):011:0> C.cf => [:class, C] irb(main):012:0> C.mf NoMethodError: undefined method `mf' for C:Class irb(main):013:0> C.new.mf NoMethodError: private method `mf' called for #<C:0x28d636c>
実はrubyにはクラス(モジュール)メソッドという仕組みはなくて、クラスに定義された 特異メソッドが他の言語のクラスメソッドと同じように使えるだけ(と思ってる) クラスの継承で特異メソッドが継承され、includeでは無視されるのは仕様としか 大体「クラスメソッド」として使うんだから「クラス名.メソッド名(引数)」の クラス名にはメソッドが定義されているクラスを使うべきだろう
継承してないから継承されない じゃ駄目かね
Mix-inてのは親子関係が木構造になるように制限をした多重継承だと 理解していたんだけど、Rubyのモジュールはちょっと違うということかな。 上のコードでいうと、c is_a M だけど C is_a M ではなかったから、一瞬 そういうものかと思ったものの、 C is_a C0 というわけでもなかったぜ。 うーん、いまいち腑に落ちないな。
694 :
デフォルトの名無しさん :2009/05/03(日) 20:27:14
>>690 メソッドを継承すると遮蔽定義によって、メソッドの動作を変更できてしまう
からじゃね?
モジュールは多重にインクルードできるから、継承経路によって、
振る舞いが変わる可能性があるので、そういう仕様になってるんじゃねえかなぁ
よくわからんけど
>>690 >親クラスのクラスメソッドは継承されるけど、
>インクルードしたモジュールのクラスメソッド(?)は継承されない。
>module_functionのクラスメソッド側もやはり同じ。
>いったいどういう理由でこうなっているの?
そういう仕様だから。
もちょっというと、includeはメタクラスには影響を与えないから。
自分で調べるなら「Ruby クラス階層図」でぐぐるといいかも。
あの辺の理論はこんがらがる Class.class => Classって辺りで混乱が最高潮
>>697 の気持ちは残念ながらわかってやれないが
整形されてないとここまで読む気が失せるものだと再認識させられた
Linux 版のデフォルト設定の irb は死ぬほど見づらい デフォルトで行番号表示つけるならもっと履歴を使いやすくしろ っていうか irb で出る例外の 99 パーセントは直前行だろ需要考えろよ
そういや、irb使ってるとき、ついシェル感覚で !10 とかタイプ してしまう。そして => false という出力をみてはじめて気付く。 !p => true とやってしまったときは、何がおきたか一瞬わからなかった。
wirbleかutility_belt使ったらどうだろう。 utility_beltはWindowsだとダメポだったけど
~/.irbrcに最低これくらいは書いとくよね # vim:ft=ruby require 'irb/completion' __history__ = File.expand_path('~/.irb_history') File.foreach(__history__) {|line| Readline::HISTORY.push(line.chomp) } END { File.open(__history__, 'w') {|f| f.puts Readline::HISTORY.to_a.join("\n") } } IRB.conf[:PROMPT_MODE] = :SIMPLE
あーいるよな、デフォルト設定の話してるときに「カスタマイズすればいい」とか脳のとろけた話する奴
もんだいはどちらがコストが低いかと言う話になる。
この場合、カスタマイズの例を実際に
>>702 が出してくれたので、
irb本体に手を入れるよりよほど簡単である。
許されてもよいのではないか。
RubyGemsで一発で解決することに対して、数行のモンキーパッチで解決するならまだしも、
長々とスクリプトを書くのであれば、どちらがコストが低いかは自明
自演乙
まあそのへんは果てしなくどうでもいい
自分用のスクリプトで引数にキーワードハッシュでも文字列ハッシュでも通常引数でも動作するようにしたり クラスメソッドでparseみたいな総合一連動作メソッドを作りまくったりしてると YAGNIということばを思い出す オチはとくにない
708 :
デフォルトの名無しさん :2009/05/04(月) 17:18:06
標準入力から読み込んだ画像を表示するビューアを探しているのですが、探す暇もない(面倒)なので 自分で簡単なビューアを作ろうとruby-gtk2のリファレンス読んでいたのですが... (まあこんな感じ cat image.jpg | imageviewer) Gtk::Imageをざっと目を通したところ、画像ファイルの名前を指定するようですが $stdin.read とか指定できませんかね?
あのへんはRuby関係ないからなー
710 :
デフォルトの名無しさん :2009/05/04(月) 17:55:29
708だけど、imagemagickで実現できたわ(^^ $ cat image.jpg | display でおk。 まあimagemagickも/tmp/magick-Xxxxのような一時ファイルを作成しているから 同じようにすればいいのかな。。
>>709 2ch は、7割が脱線で出来ています。
>>708 前に画像ビューア作ってたとき、漏れはこんな感じで
PixbufLoaderとcairo使ってごにょごにょやってた
require "gtk2"
ploader = Gdk::PixbufLoader.new
ploader.write($stdin.read)
ploader.close
drawing_area = Gtk::DrawingArea.new
window = Gtk::Window.new
window.signal_connect("destroy") do
Gtk.main_quit
false
end
drawing_area.signal_connect("expose-event") do |w, e|
context = w.window.create_cairo_context
context.save do
context.set_source_pixbuf(ploader.pixbuf)
context.paint
end
true
end
window.add(drawing_area)
window.show_all
Gtk.main
なんでRubyでそういうの作ろうと思うのかね もしかしてRubyしか使えないとか?
Rubyからアクセスすれば簡単手軽に作れるからだろ 実際問題として簡単でも手軽でもないような気もするがまあそれはそれで
楽だから
716 :
デフォルトの名無しさん :2009/05/04(月) 20:44:45
Rubyで書くと おちんちんきもちいいお(´;ω;`) だから
708でも712でも無いけど、どうしても速度が欲しければjavaかCで書く
でも普段はそんなん必要ないから楽ちんなrubyで書く
>>713 なら何で書くのさ?アセンブラ?まさかマシン語とか?
vistaのローカルにいれているRubyの1.86を 1.9xにアップグレードしたいのですが インスト方法どこかに書いてありますか?
それはアップグレードではなくアンインストール後の新規インストールになるな
>>718 あなたは、1.9x を使う要件を満たしません。
1.8x を使い続けてください。
まだヘソ曲げてんのかよw
722 :
718 :2009/05/05(火) 01:57:45
できました。 1.86アンインスト ↓ 1.9x解凍、C:\に置く ↓ windowsのシステム環境変数書き換え でしたね、できました。 複数バージョン置けたんですかね。 記法が変わりすぎで1.9xの中心にしか 覚えませんが。。
RDEを使いたいと考えて、インストールして、実行してるんだけど 以下のコードを書いたらエラーっぽいメッセージがRDEから出でる。 ---------------------- a = [] a.each do |x| x. ---------------------- メッセージ Access violation ta address 004B0137 in module 'rde.exe'.Read of address 00000015. x.の"."を打ったところで出るので、オブジェクトのメソッドを取得しようとして失敗しでもしてるのだろうか? エラーメッセージをとりあえず無視してるのだけど、気味が悪いので、対策知ってる人がいたら教えてください。
|| 時刻1 | 時刻2 | 時刻3 | … ------------------------------ 分類1 || d_1_1 | d_1_2 | d_1_3 | 分類2 || d_2_1 | d_2_2 | d_2_3 | 分類3 : というスプレッドシートっぽい概念がしっくり来るデータがあります (実際は2系統が直接関連付けられてないバラバラなハッシュです) データ.category("分類1") とすると [d1_1, d1_2, d1_3, ...] というようにす
…悩んでたら途中で送っちゃった こんなごっつい構造のデータでなくてもいいような気がさっきからずっとしてるので とりあえずキャンセルしますごめんね
キャンセル吹いたw
727 :
受付嬢 :2009/05/05(火) 21:45:30
また、いらしてください
以前から不思議だったんだが RDEはなぜこれほどまでにバグだらけなのだろう 何か理由があるのだろうか
マジレスすると玄人が使わないからバグ報告が少ないとかじゃないか
どこからかだったか忘れたけど require 'irb/completion' require 'irb/ext/save-history' IRB.conf[:SAVE_HISTORY] = 99999 IRB.conf[:PROMPT_MODE] = :XMP require 'pathname' require 'fileutils' require 'uri' require 'pp'
使われない→バグが取れない→使われない・・・・の 負のスパイラルに陥ってる可能性が
>>732 スレタイのRuby初心者となんの関係もない話題だが、
Division and Modulus for Computer Scientists でも読んでみたら?
>>732 おいおいスクリプト言語ぜいが全然周りと違ってて吹いた。
下手するとハマるね、これは。
こういうのって何かで規定されてないのかね…。
AA化してみた
負の剰余
C Java PHP Emacs Ruby Python Perl
(GCC (Sun JDK 4.3.10 22.0.50.2 1.8.2 2.3.5 5.8.4
3.3.5) 1.5.0_05) -16
-3 % 5 -3 -3 -3 -3 2 2 2
. 3 % -5 3 3 3 3 -2 -2 -2
-3 % -5 -3 -3 -3 -3 -3 -3 -3
こんなプログラムはいやだ: 負の剰余 - bkブログ
http://0xcc.net/blog/archives/000083.html
個人的にはスクリプト言語勢の振る舞いがしっくり来るなあ。 しかし数学的な定義はないのか?ありそうだが。
定義されてるよ。 「 A mod B は "AをBで割った余り"」だから「B と商 x をかけて剰余を足すと A に戻る」でいいよな? -3 mod 5 = -3 だとする場合 (C言語) 5 と 商 0 をかけて剰余 -3 を足すと 5 * 0 + (-3) = -3 に戻る…正解 -3 mod 5 = 2 だとする場合 (スクリプト言語) 5 と 商 -1 をかけて剰余 2 を足すと 5 * (-1) + 2 = -3 に戻る…正解 ということで、そもそも2通りあるから、「どっちでもいい」。 手計算の世界では「剰余は商より小さい正の整数」という条件がついてたりするんだけど (「10割る3」は「商3余り1」であるべきで、「商4余り-2」ではないと習ったはず) C言語は「割られる数が負なら絶対値で計算して結果を負に変換する」という流儀に従ってる。 まあ、剰余に関しては言語のマニュアル必ず読めって感じだな。
CやC++なんかの仕様では 「割る数と割られる数の両方が正である場合は商と剰余は必ず正であるが、 少なくともどちらかが負である場合は定義しないので処理系が得意なように作れ」 とかヤな感じに丸投げなことが書いてあったはず
>>738 CやC++の場合は、コンパイラが、「俺は知ったこっちゃねぇ。CPUに任せる」という
コード生成ができるという利点がある。
ってことは正確を期したいならどんな言語使うにせよ 正負の確認処理を挟むべきってことか
負の除算は意図をもって行われるべきだってことだね まあ、コンピュータにおける除算自体がそもそも日常視点では怪しさのカタマリだから慎重になるべきなんだけどさ
>>740 確認したってどうせ一つしか結果は出てこないんだから、
それなら最初から自分で関数組んだ方がw
一般的用途においては割る数と割られる数の両方を事前に絶対値とって使うべきかね 剰余を使う機会で負になるのはたいてい割られる数だし
>>744 ありがと!
足りないファイルを1.0.1からコピーしたらエラーでなくなったよ
rspec 使って遊んでます 「大量のファイルやら外部参照やらがあり、きちんと動作することが現状 おおむねわかりきってるひとまとまりの部分のテスト」 が 「今テストしたい部分を繰り返しテストして試す」 という行為にちょっとジャマ(処理に時間かかるし、ファイルアクセスがなんとなく無駄)です if false # 終わったので一旦スルー … end で囲うというのも考えたんですが、なんかこうスマートな考え方はないもんでしょうか?
>>747 つ pending
外部と接続する部分は、mockがうまく利用できる形に持っていくのもよい。
>>747 スペックファイルを分割すればいいのでは?
ネットからファイルを取得する処理のあるスクリプトなんかは困るよね specコマンド連打するたびにGETが大量に起こったり
そんなの、specファイルの中でメソッド再定義すればいいじゃん サーバへアクセスしてる部分を事前に保存しておいたローカルのファイルを読むように書き換えればいい
specファイルの中でオリジナル書き換えたらオリジナルのテストになんねえよ
なんという正論
>>752 そのメソッドをテストするときだけオリジナルの動作になれば問題ないだろ
html = $TEST_HOGE ? File.read("local.html") : open(uri).read
「実際にネットワークからモノを取ってくるオブジェクトX」自体 のテストではネットワークを使わざるをえないが、それのテストが 十分出来ているなら、Xの利用者をテストする際には、Xはmockで 代用できる。
>>754 実質的な動作は同じだしな
テストできないで終わるよりずっとマシ
>>754 だからこうするんだってば
def get(uri)
return uri.read
end
↓
def get(uri)
return File.read('local.html')
end
コストのかかる部分を全部メソッドとして吐き出せるようにクラスを作る そうすればその部分のメソッド定義を書き換えるだけでテストが書きやすい
インスタンス変数をメソッド内で利用するとテストで条件変えたときに書き換えられないから、 全部引数で渡すようにするのがポイント
RSpecのテストに対応させてスクリプトを作ると諸記述が2ランクくらい退化するというのはよくある 巷のRSpecの解説は一番大事なことをあえてすっ飛ばしてると思うんだ
>>759 なるほど
>>760 こっちは・・・どうなんだろう。
いずれにせよ、テストしやすい書き方も大事ってことか。
>>761 describe と before と it と should と eql しか使わせる気がなさそうな説明はいくつか…
これしか使わなくてもテストは書けるのでタチが悪い
これ以上のことを説明する気がないのならむしろRSpecを使わせないほうが効率も能率も高い
rspec といえば、あれって「○○と表示されること」をテストするのってどうするん?
>>764 素晴らしい先駆者であるがゆえに失速の影響が…
えー、「内部の○○メソッドを今は動作したことにしたい」というカジュアルな用途には、stub! が使えると思われ
require 'spec'; require 'open-uri'
class Hoge
def get(uri); open(uri).read; end
def pick_title(uri); get(uri).scan(/<title>(.+?)<\/title>/).to_s; end
def main
pick_title('
http://www.example.com/ ')
end
end
# -----------------------
describe Hoge do
before :all do
@hoge = Hoge.new
end
describe "#main: サーバからHTMLを取得してタイトルを表示する" do
it "たいとる!" do
@hoge.stub!(:get).and_return('<html><title>たいとる!</title></html>')
@hoge.main.should eql('たいとる!')
end
end
end
「@hoge の get メソッドが呼ばれたときは処理を横取りして and_return の引数を代わりに返すようにする」という記述
あんま小難しいこと考えなくていいのでとっても便利
…これはこれで stub! ばかりになりそうw
rspecにはTest::Unitの-nオプションみたいにテストを限定する方法はないの?
str = String.new p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65 #ふー。。。
require 'pstore' h = Hash.new{|h, k| h[k] = Array.new} h[0] << 'a' << 'b' << 'c' PStore.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h} これを実行すると /usr/lib/ruby/1.8/pstore.rb:349:in `dump': can't dump hash with default proc (TypeError) と言われます。 既存のハッシュを「無難な」ハッシュに変換してそれをまた戻す方法とかないもんでしょうか
うわー それじゃデフォルト値つきの配列やハッシュって駄目じゃん 普通の配列やハッシュのつもりで誰がMarshalするかわからないんだし怖くて使えん
hh = Hash[h] ではどう?
>>772 Proc つきのまま外に出すなってことなんだと思う
デフォルト値つきのハッシュはデータ製作用の仮形態のみにしておく
require 'pstore'
def makedata
h = Hash.new{|h, k| h[k] = Array.new}
h[0] << 'a' << 'b' << 'c'
return Hash.new.merge(h)
end
h = makedata
PStore.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h}
これなら動作する
開発者側が気を遣えってことなんだろうな
既存の誰かが作った(そしてどこに初期値つきハッシュが使われてるのかよくわからん)データを
マーシャル可能な形態に変換する方法は知らん
>>771 いっそのことYAMLにしてしまうとか
require 'pp'
require 'yaml'
#h = {0 => Array.new}
h = Hash.new{|h, k| h[k] = Array.new}
h[0] << 'A' << 'B' << 'C'
h["mage"] << '100' << 1234.56 << :hage
pp h
puts
y = h.to_yaml
puts y
puts
new_h = YAML.load(y)
pp new_h
pp h == new_h
わざわざ PStore するってことはオブジェクトとして一時保管したいのだろう YAML ではどうにもならん気もする
では、yaml/storeで #!ruby -Ku $KCODE='u' require 'pp' require 'yaml/store' #require 'pstore' h = Hash.new{|h, k| h[k] = Array.new} h[0] << 'a' << 'b' << 'c' YAML::Store.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h}
あああ、てか、procごと保存して復元したいってことなのか?PStoreってそこまで対応しとるノン?
Rubyist Magazine - 標準添付ライブラリ紹介 【第 9 回】 PStore
http://jp.rubyist.net/magazine/?0016-BundledLibraries > IO や Proc などの Marshal.dump が出来ないオブジェクトは保存することが出来ませんが、
> Marshal.dump 出来るオブジェクトなら何でも保存できて、Marshal.load 出来るものは何でも読み込めます。
駄目なんすね・・・まあ普通考えたらそうか
procで詰まるってことは、後でevalれるコードを格納できるように、
って難しく考えないで、1個1個個別対処しかないんじゃないのかなあ。
復元時にprocを戻すようにというか、Hash.new{|h, k| h[k] = Array.new} 生成して再代入と言うか
一応
>>774 が答ではあるのだろう
出しっぱなしにならないようにクラス製作者に気をつけてもらうしかなさそうだ
デフォルト値の動作が重要な代入可能な配列なんかを提供する場合は
Procつき配列をそのまま出すのではなくそういうデフォルト動作をするメソッドを自力で作れと
めんどいな
class MyHash < Hash def initialize(*args) super {|h, k| h[k] = []} end def marshal_dump Hash.new.update(self) end def marshal_load(data) update(data) end end
マニュアルのとこにちょろっと書いておいてくれるとよかったのにね 「ただし、ブロックは Proc なのでこのままではオブジェクトを Marshal することができません。Hash#merge して下さい」とか
784 :
753 :2009/05/08(金) 17:49:20
>>728 同じ事を考えたんだけどmarshal_loadしたオブジェクトは
initializeされてないからdefault_procが再設定されてないのよ
h = MyHash.new
h[0] << 'a' << 'b' << 'c'
h = Marshal.load(Marshal.dump(h))
h[1] << 'a' << 'b' << 'c'
#=> undefined method `<<' for nil:NilClass (NoMethodError)
initialize以外でdefault_procは設定出来ないしどうしたもんかね
785 :
784 :2009/05/08(金) 17:51:39
名前欄は無視してくだしあ
>>770 >p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65
これって fusiあな、、?
787 :
デフォルトの名無しさん :2009/05/08(金) 20:39:17
TSUKARETA
788 :
デフォルトの名無しさん :2009/05/08(金) 20:39:48
$ irb1.8 irb(main):001:0> str = String.new => "" irb(main):002:0> p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65 "TUKARETA" => nil irb(main):003:0>
String.new << e は、e.to_s した結果を末尾に追加するべきだと思う
まあ ASCII コードの取り扱いのへんはいろいろシガラミがあってだな
Rubyユーザとは思えない
>>772 のレスのせいで初心者が混乱しかねないので、
一応言っとく。
○デフォルト値はあってもMarshalできる(もちろんpstoreも)
h = Hash.new(1)
h = Marshal.load(Marshal.dump(h))
p h[:foo] #=> 1
○ダメなのはdefault_proc
h = Hash.new {}
Marshal.dump(h) #=> can't dump hash with default proc (TypeError)
○default_procはHash#default=で消せる
h = Hash.new {}
h.default = nil
h = Marshal.load(Marshal.dump(h))
p h #=> {}
○配列にデフォルト値などない
a = []
a.default = 1 #=> undefined method `default=' for []:Array (NoMethodError)
>>792 このスレでは1.9をデフォと思わないほうがいい。
794 :
784 :2009/05/09(土) 01:46:48
>>792 1.8.7だと undefined method になっちゃう(1.8.8とかで取り込んで欲しいな)
てかinitialize呼んじゃってもいいのね
def marshal_load(data)
update(data)
initialize {|h,k| h[k] = Array.new }
end
# あとアンカも間違えてた ×
>>728 ○
>>782
てか、自分でクラス作ってるならこんな面倒なことしなくても 「該当部分の見当つくんだから空のハッシュとマージさせとけ今からやれ」で終了なわけで ソース読むのめんどいくらいの他人様のライブラリを仮定してると思われる以上 そこで「1.9ならできる」というのはいささか的外れな気もする
>>791 こういうのまとめたwikiが欲しいな…
RubyのFAQ用のwikiみたいなのってなかったけ?
質問です オブジェクトが、あるモジュールに含まれるクラス群のインスタンスであるかどうかを 調べる簡単な方法はありますか? 現在、 obj.class.to_s =~ /MyModule/ みたいな判定の仕方をしているのですが、こういうことに正規表現マッチを 使うのも大げさな気がします。もっと簡潔なやり方はないでしょうか。
obj.is_a?(MyModule) で用が済まなくなったらまた来てくれ
>>802 済まないと思う
obj = MyModule::KlassA::Sub.new
obj = MyModule::KlassB::Sub.new
という可能性があるときにたとえば
if class_include_klassA(obj) then
# obj が MyModule::KlassA::Sub だと期待した処理
elsif class_include_klassB(obj) then
# obj が MyModule::KlassB::Sub だと期待した処理
...
というようにしたいのだろう
そうすること自体がなんか方向性間違ってるような気もするが
804 :
801 :2009/05/09(土) 10:52:24
>>802 すいません。言葉足らずでした。
MyModule はトップレベルに include されているため、コアクラスもみな
is_a? に対し true を返すという状況です。
ん?
>>801 あるモジュールに含まれるクラスのサブクラスのインスタンスの時はどうするの?
module Mymod
class A
# あるモジュールに含まれるクラスのインスタンスか調べるメソッド(仮)
def nesting?(mod) ; self.class.name =~ /#{mod}/ ; end # その一
def nesting?(mod) ; Class.nesting.include?(mod) ; end # その二
end
end
class B < Mymod::A ; end
Mymod::A.new.nesting?(Mymod) #=> 0(true)/true
B.new.nesting?(Mymod) #=> false/true
807 :
801 :2009/05/09(土) 11:36:19
皆さんレスありがとうございます。
インターフェースを揃えてそもそも処理を分けないで済む方法で自己解決しました。
お騒がせしました。
>>806 モジュールの外で継承されることが完全に抜け落ちてました(汗)
自分がやりたかったのは Class.nesting を使ってる方です。
勉強になりました。ありがとうございます。
質問 my/main.rb my/mod.rb というディレクトリ構成で、main.rb に require 'mod' と書いてあるとします これ、カレントディレクトリがたとえば HOME だったりすると $LOAD_PATH の "." が HOME になって HOME/mod.rb を探してしまって希望通りに動作しませんよね 「自分が存在するディレクトリにある自分用ファイルを require する」ということをさせたい場合の 決まった書き方はありますか?
809 :
デフォルトの名無しさん :2009/05/09(土) 15:28:32
require fine.join(__FILE__, $0)
>>808 どうするのが定石が知らんが、gemsとかのspecファイルとか見てると、
$:.unshift(File.dirname(__FILE__))
してから、require するか、
require File.join(File.dirname(__FILE__), 'spec_helper.rb')
という感じだな。
>>808 わかりやすいとこで
#!/usr/local/bin/ruby -Ku
$LOAD_PATH.unshift(File.dirname(File.expand_path(__FILE__)))
require 'mod'
...
require は引数をフルパスにしても動作保証がなかったはずだし Ruby のめんどくさいとこだな
そうそう、ファイルを2つに分けただけなのに $LOAD_PATH とかいじらないと動作しないというのはどうにも カレントディレクトリをデフォで追加しようとか考えた奴はお花畑だと思う
…そこまで言わんでも 1.9 でこっそり追加されてるとかそういうことはないかしら
まあ、めんどっちいな 何が面倒かっていうと cron とかそういう絶対パスで動作させるような環境にたまたま持っていったときに その cron の内部でだけよくわからんエラーになって露見するのが嫌 「っかしーなー動くよなー mod.rb もあるしなー」と(当該ディレクトリ内で相対パスで)スクリプト動かして首捻るわけだ
rubyに限ったことじゃないような。
Windowsのソフトでも作業ディレクトリ(カレントディレクトリ)をexeと同じにしないと、
まともに動かないのはザラだからな。
何がいいたいかというと、カレントディレクトリ依存とかはプログラマの仕事でもあり、
そうじゃなかったらユーザーが気を配る話でもある。
(Windowsはショートカットだとカレントディレクトリは最初自動で設定してくれるが、
バッチ処理とか、コマンドラインから起動したりするととたんに
>>814 みたいなことになるんだよな)
まあ、自動的に解決してくれる言語仕様ならそれにこしたことはないけど。
どんな仕様だったらいいものなのかね?
Rubyとずれるが、Windowsでゲーム作って公開したときに、 エクスプローラーから実行すると動かないという意味不明な問い合わせがきてだな、 アドレスバーに直接exeのフルパス打ち込むと、カレントディレクトリがアプリのディレクトリと異なるのでうごかない という現象に遭遇して、 結局、アドホックに"起動直後にexeのディレクトリをカレントディレクトリに設定"などという処理を入れて、 回避したんだよ。 Rubyだったら、最初に起動するスクリプトで Dir.chdir(File.dirname(__FILE__)) なんかだせえw
>>811 > require は引数をフルパスにしても動作保証がなかったはずだし
してるよ。
作者がウィンドウズ使ってない弊害だろう。リナックス使ってるのだっけか。
>require_relative いつのまにこんな便利メソッドが! Ruby 1.9.x で追加されたけど、あまり表舞台にあがってないメソッドっていろいろあるよね CHANGELOGとか見返せば分かるのかな
rubyにスパイウェア仕込んでメソッドの呼び出し状況を収集して ruby-lang.orgに送信して使われてないメソッドのプロモーションとかすればいいのに
822 :
デフォルトの名無しさん :2009/05/09(土) 22:30:06
推奨プラットフォームがLinuxだっけか。
*Supported* なのは唯一Debianのみ。 Supportedの意味はサイト参照。
デビアン使ってない信者は負け組だな。
825 :
デフォルトの名無しさん :2009/05/10(日) 08:41:33
l = text("0") メソッド text に引数 "0" を渡してるだけ スニペットってことはモジュール使用例の一部分だけを抜き出してるからこんな見かけなのだろう
("0") < オハヨウ!
Rubyの場合、コーディングでの改行は必須なのでしょうか? (言語によっては、改行は実質無視されるものもあります) 例えば、対話環境 irb で $ irb irb(main):001:0> print "Hello world\n" Hello world => nil irb(main):002:0> を $ irb irb(main):001:0> print "Hello world\n" Hello world => nil irb(main):002:0> と書くのは不可でしょうか?
>>828 区切りに改行か ; が必要。
>$ irb irb(main):001:0> print "Hello world\n" Hello world => nil irb(main):002:0>
・・・書かなくていいところまで書くなよw
>>828 irbに対するprint1つじゃ改行もへったくれもないぞ 。
>>828 ___ ━┓ ___ ━┓
/ ― \ ┏┛/ ―\ ┏┛
/ (●) \ヽ ・. /ノ (●)\ ・
/ (⌒ (●) /. | (●) ⌒)\
/  ̄ヽ__) / | (__ノ ̄ |
/´ ___/ \ /
| \ \ _ノ
| | /´ `\
ファイルの個数を拡張子ごとに数えるもっとシンプルな書き方ないですか? exts = v.inject(Hash.new(0)){|r,x| r[x['Path'][/[^\.]+?$/]] += 1; r } ちなみに、File.extname() を使っていないのはバグがあったからです。
>>833 なんかイラっとくる。いや俺も初心者だけど。vって何?
counts = Hash.new{|h, k| h[k] = 0} Dir.glob('*').each do |path| next if File.directory?(path) counts[File.extname(path)] += 1 end counts = Hash.new.update(counts)
extnameとしてくくり出す以外やること無いと思う
バグなら報告すればいいだろ
1.8.7以降だとこうも書けるかな Hash[Dir.entries('.').group_by{|n|File.extname(n)}.map{|k,v|[k,v.size]}]
97パーセントくらいまで「ディレクトリを除外しないバグ」だと思う
結局
>>835 が一番シンプルで一番正確な動きをするというRubyらしい結果に
まあ人に想像させるというか、空気を読ませる時点で「シンプル」ではないわな。
そういう意味では
>>835
俺は838の方がいいけどなぁ ま、人それぞれだな
>exts = v.inject(Hash.new(0)){|r,x| r[x['Path'][/[^\.]+?$/]] += 1; r } Ruby初心者で疑問なんですが、 injectブロックの|r,x|が何であるかとか、どこでどうやって決めているんですか? 例えばCだと、ヘッダに関数の宣言があってそれを見ればいい訳ですが。
というか、each 系ブロックに渡すファイル一覧として Dir.entries を使う時点でけっこうアレだ
>>844 ただのブロック用の仮引数(ローカル変数)に過ぎない
each do |引数| で x を使うか e を使うかどうするか程度
> injectブロックの|r,x|が何であるかとか、どこでどうやって決めているんですか? ソースコード的には、yieldに渡す値で決まる。 > 例えばCだと、ヘッダに関数の宣言があってそれを見ればいい訳ですが。 プログラミング時にどうしたらいいか、ということなら、リファレンスマニュアルを見る。
foreachの方がいいのかと思ったけどDir.foreachだと別に変数用意してやらなかったりしてショボーン
>>844 に挑戦しようとして挫折w
a.inject(Hash.new(0)){|r,x| 〜 += 1; r }
のinjectで+=1; rってね。これね。
今まで俺もひたすらこういう書き方してきたけど、
injectにおける; r部分はいつももやもやする。
最近のruby-1.9.2 headはsolarisでビルドすると Dir.glob("/**/")で死ぬから困る
852 :
デフォルトの名無しさん :2009/05/12(火) 05:48:28
(敢えて聞きます) Rubyの弱点て何ですか? Webで調べても長所しかないので。
> Webで調べても長所しかないので そんなあなたには使えそうもないところです
てか「Ruby 短所|デメリット」あたりで検索すればウンコみたく出てくると思うんだが
今のRuby自体はそれほど問題ないよね 用途に合わない使い方をすると果てしなく糞だというだけで
Windowsでは使いづらいことが多い。 ユニコードファイル名でファイルアクセスさせてくれ。
用途に合わない使い方をするから…
Windows使う奴は情弱
Windows上でRuby使う奴はアホ というかrequireが激遅な環境があるのをとっとと改善しろ
860 :
デフォルトの名無しさん :2009/05/12(火) 07:33:40
プログラマにとっても、posix環境を対象とする方が精神的にいいのかもな。 ライブラリなんかを見てもwinのための特別なコードを目にするし。
異なるOSを跨ぐソフトはどこもそんなもんだと思う Linux <=> FreeBSD <=> Solaris もそれなりに汚い
>>852 858や859のように、Windowsをバカにする人間が一定の割合いることが悪い点
あとは……プリコンパイルができないことぐらいかな
windowsをバカにされてムキムキする奴は情報処理から手を引いた方がいいよ
CUIからアプローチしたWindowsはヘボいという事実を認められない人はいないほうが平和だったりする
WindowsでRuby使う人は言語のためにOS選んでるわけじゃない 逆に特定の言語使うためにプラットフォームを選択しろとか理解しがたい
Windows使いたかったらPython行け
そのへん Java は使いやすいと思う c:\\ とか c:/ とか書いても動くし、/usr/local/hoge みたいなファイルを開くと、 勝手が c: だったら、c:\usr\local\hoge を開いてくれるし。
>>867 同じ事できたよ ruby 1.8.6 (2008-03-03 patchlevel 114) [i386-mswin32]
puts File.read('/cygwin/home/myname/test.txt')
#=> テキストの内容が出力される
>>851 > 最近のruby-1.9.2 headはsolarisでビルドすると Dir.glob("/**/")で死ぬから困る
kwsk
870 :
852 :2009/05/12(火) 12:59:47
なんかRubyって、Winsowsと相性が悪いみたいですね。 というか、Win7が出るのでさらに混沌とするのかな。
でも個人的には、Windows XPでRuby使ってて
>>862 以外に困ったことはないなー
今はパスの問題だってそうそう起きないし
(Vistaではまた違うのかもしれないが)
>>868 知らなかった……いつから絶対パス指定ができるようになってたんだ
>>871 > 知らなかった……いつから絶対パス指定ができるようになってたんだ
大昔からできるよ。
そもそもruby内部で/と\を変換したりしてるわけじゃなくて、元々APIレベルでは
どちらでもアクセスできる。
WindowsはPowerShellがあるからな。 Rubyの出番はもうない。
kogaidan 「ご愁傷さまです。UNIXなどを知ってしまうと、あまりにムカつくことが多いよ。 タダならともかく、Windowsを使うくらいなら、Mac OS XやUbuntuでもいいんじゃないのかな。」
PHP を使えば大丈夫
LinuxのGUIはWindowsのCUIと同じくらいむかつくのは事実
めんどくさかったので spec から書かずに従来どおりにスクリプト作ったら、 ある時期からスクリプトがどんな構造してるのかさっぱしわからなくなった
>>876 LinuxのGUIはWindowsのCUIと同じくらいオマケ機能と思えばどうということはない
Fusion楽しめればそれでいい
880 :
デフォルトの名無しさん :2009/05/12(火) 21:25:46
今日もキューブをまわすお( ^ω^)
>>871 > 今はパスの問題だってそうそう起きないし
ファイル名に♥とか特殊な文字が入ってなきゃおきないけど、問題に直面したら現状回避不可能なのは問題だ。
結局このためだけにPython使ったりとか、悲しいじゃないか。
というか、なんで Windows で無理して Ruby 使うんだろ。 適材適所という言葉を知らんのじゃないか?
かといってPowerShellをわざわざ憶えるのはまんどくせ Pythonだって別にベストフィットってわけでもなかろうし
884 :
デフォルトの名無しさん :2009/05/12(火) 21:51:39
だが現役シェルの中でPowerShovelが一番最強!(たぶん・・・)
そこでIronPythonですよ
Linux なり何なりをメインに使っていて、たまに Windows を使うというのなら、 他の言語を覚えるのは「まんどくせ」なのだろうが、Windows を使う機会の方 が多いんだったら、Ruby 以外を覚えて使ったほうがいいと思うけどね。
どのOSでも使えるのがスクリプトのメリットだろ
> どのOSでも使えるのがスクリプトのメリットだろ > どのOSでも使えるのがスクリプトのメリットだろ > どのOSでも使えるのがスクリプトのメリットだろ > どのOSでも使えるのがスクリプトのメリットだろ
889 :
デフォルトの名無しさん :2009/05/12(火) 21:59:15
・・・w
そんなメリットは聞いたことがないわ
俺、北千住で聞いたことあるよ
Windowsしか使わないならVisualBasicがおすすめ VisualStudio,MS-Office,WSH,etcetc VBが役に立たない場所は無い 逆にプラットホーム非依存なら日本語の扱いが楽な言語がいい 個人的にはjava,rubyがおすすめ
なんでいまさらVB・・・C#でいいじゃん
必要があってならともかく無理してまでプラットホーム非依存なんてことを 考える必要なんてないじゃん、という話の流れだと思うけどね。
コンパイルやらポリシーやらXMLやらでいきなりやる気90%減
なんかくだらない RubyやPythonやってるのにプラットフォーム気にすること自体ナンセンスだと思う
897 :
デフォルトの名無しさん :2009/05/12(火) 22:25:16
しかし全くプラットフォームを意識せずにプログラミングできるかというと、そうでもない。
どうせ依存しなけらばならないのなら, より適したものを使おうというのは自然な発想
>>882 そりゃLinux文化から生まれた言語だし、Windowsが二の次なのは分かってるよ。でも
> なんで Windows で無理して Ruby 使うんだろ
とか本気で言ってるのか?
WindowsユーザーがRubyを好きで、できるだけ楽しくプログラミングしたいと思うのは
そんなに奇妙なことなのか?
本人が好きで楽しいと思ってるんだったら使えばいいんじゃないの? 滝に打たれる苦行を楽しいと思い、喜んでやる人もいるわけで。 そんなのその人の勝手。 その姿を見て、変なやつ、と思い感想を述べるのは見てる人の勝手。
compizこそおまけ機能。OSインストールしたら速攻オフだろ、jk
>>899 禿堂
何故にこの流れの中で compiz? 素でわからん。
WindowsでRuby使っているが、ファイル名以外はそんなに困らんような…。
(webアプリはテストだけで、デプロイは動かすLinux鯖だったりするし…)
>>899 不用意に煽ってるだけだから、つられなさんな
Linux板とかmac板とか見ればわかるけど、不用意にWindowsユーザーを煽るというか、
何故か選民意識みたいなものがあるみたいなのでスルー推奨
>>835 いまさらだけどHash#defaultを使って欲しかったので…
path = './'
counts = {}
counts.default = 0
Dir.foreach(path) do |filename|
counts[$1] += 1 if filename =~ /\.([^.]+?)$/
end
p counts
教祖がデビアン使いの時点で選民思想だしなあ。 大多数が使ってるウィンドウズは非サポート。 マクは論外。あそこの教祖は癌らしいから余命わずかでしょ。 javaも漢字コードとか環境依存だからなんとも。おらに買収されちゃったし。
おらって書かれるとオライリーに思える
907 :
デフォルトの名無しさん :2009/05/13(水) 09:31:48
rubyなんて所詮は新興宗教の公用語。 教祖の気まぐれで仕様が変わる。 付き合ってらんねー。
>>909 公開されてから仕様が追加、修正、廃止されなかった言語ってのを挙げてくれよ
今日中で頼む、知名度の低い言語はカンベンな
909 じゃないけど、 Java の JCP や Python の PEP みたいなのあってもいいかもなーと思うときがある。 個人的に Ruby は不要だけど Rails にはほしいかも。
RCRというのもあったぞ。 今ならredmine.ruby-lang.org経由で[Feature]かな。
rspecで「この describe を一時的にテストから外す」ってできない? 重いテストや遅いテストがあって、そこは一旦外しておきたいんだけれども
914 :
デフォルトの名無しさん :2009/05/13(水) 19:54:45
916 :
デフォルトの名無しさん :2009/05/14(木) 01:08:13
WinXPでruby1.8.6を使っています。 ファイルを開くときの File.open('out.txt', 'w') {|f| の |f| はどういう意味なのでしょうか? 調べましたが分かりませんでした。
>>916 ブロックの仮引数。
def callback(f)
のみたいなもん。
918 :
デフォルトの名無しさん :2009/05/14(木) 02:19:22
いかん・・・Ageてしまった。
920 :
デフォルトの名無しさん :2009/05/14(木) 03:43:12
Time オブジェクトを to_f すればとりあえず用は済むと思われる irb> Time.now.to_f 1242241404.3147 irb> t = Time.now; puts t.strftime("%Y年%m月%d日 %H時%M分%S秒#{t.usec}") 2009年05月14日 04時03分25秒893515 ただ、ごく一般論としては、スクリプトでミリ秒を計るのはあまり意義のあることではないんじゃないかな 1000.times {|n| print "\r残り時間:%3i/1000"%n; $stdout.flush; sleep 0.01 }
処理系依存だしなあ。厳密じゃないし。
かなりどうでもいいんだけども、個々のデータ data の内容を適切にまとめてあるハッシュ results があって、 それに新規の key => value を1ペア追加するてきとーなメソッドを作りたいんよ def new(data) … return {key => value} end results.update(new(data)) と def add_to(h, data) … h[key] = value end add_to(result, data) ってどっちがフツーっぽいかな
そもそも change_obj(obj, data) はあまり好きじゃない obj = obj + scan_new(data) の返り値再代入(に準ずるように見える処理)が好みだ ということで前者おすすめ キーを指定する形式に比べたら明らかに処理が遅いはずだが気にしたら駄目だ
resultsをハッシュじゃなくResultsとか新しいクラスにしちゃって Results#[]=でペア追加するのがRubyっぽい気がする 使うときにはto_hash
多少のことではそういうことをしなくて済むように組み込みコレクションが機能的なのがRubyのいいとこなんじゃないのか や、もしかしたらあちこちで使い倒されまくるハッシュでクラスにするのが妥当なのかもしれないが、 普通はハッシュで済むならハッシュのままだろ
ini.path = "c:/test" p ini.path を内部的に ini.write("settings", "path", "c:/test") p ini.read("settings", "path") に置き換えるようなのって出来ますかね。 メソッド名がなかったらコールバック的に呼ばれる機能があったようななかったような。
そう動作するように書けばいいじゃん def path=(s) write('settings', 'path', s) end def path read('settings', 'path') end
> メソッド名がなかったらコールバック的に呼ばれる機能があったようななかったような。 method_missing
930 :
デフォルトの名無しさん :2009/05/14(木) 13:35:23
WinXPでruby1.8.6を使っています。
文字列中の『:』(コロン)の扱いで質問です。
tag0 = "<parm xmlns="
http://ruby_xyz ">\n" を実行したときコロンの箇所で
syntax error, unexpected tIDENTIFIER, expecting $end
というエラーが出ます。どうしたらよいでしょうか?
目的はtag0と他の文字列Aを組み合わせてできる文字列Bの生成です。
>>921-922 どうも。一応は出来るみたいですね。
ただ、Javaでも他の言語でも、ミリ秒計測は普通にできるものかと思っていましたので。
> 文字列中の『:』(コロン)の扱いで質問です。
違います
どの解説にもこれのやり方は載ってるはずなんだが、載ってない解説とかがあったら即晒せ
ダブルクォート「"」を含む文字列を表現するには " の直前に \ を置く
tag0 = "<parm xmlns=\"
http://ruby_xyz\ ">\n"
>>930 初心者らしい質問でなぜか安心した
エスケープしない限り「"」が次に出た所で文字列の終わりとみなされるので
tag0 = "<parm xmlns="
http://ruby_xyz ">\n"
と書くと,
tag0 = "<parm xmlns="
http://ruby_xyz ">\n"
と書いてるのと大差無い
エスケープして書くならこうすればいい
tag0 = "<parm xmlns=\"
http://ruby_xyz\ ">\n"
「"」をエスケープするのが面倒なら %Q を使って
tag0 = %Q!<parm xmlns="
http://ruby_xyz ">\n!
とかも書ける 詳しくはマニュアルなど参照のこと
> 目的はtag0と他の文字列Aを組み合わせてできる文字列Bの生成です。
の意味がよくわからないけど,これで解決しただろうか
>>931 言語に関係なくミリ秒の計測はソフトウェア上では正確にはできません
ハードウェアによる直接のサポートがどうしても必要
>>932 ,933
有難うございます。エスケープ文字列の問題だったのですね。
エラーの指摘箇所がコロンのところだったので、てっきりこの文字が原因だと思っていました。
>>935 エラーメッセージが教えてくれるのは転んだ場所でしかなくて
躓いたりぶつかったりの転ぶ原因は大抵別の場所にある。
遠く離れた場所で怪我してたから転んだなんてこともあるぐらい。
ありがちなのは想定外のオブジェクトに化けているパターン。
obj = ["hello,", "world"]
obj = "!" # 本当は obj << "!"
puts obj.join # ここでNoMethodError
文字列処理で質問です(ruby1.8.6) 日付と時刻を文字列化し、その末尾を2桁づつ抽出したいのですが、 片方で4桁になってしまいます。 nowTime = Time.now.strftime("%Y%m%d_%H%M%S") # 現在の日付と時刻 timeLen = nowTime.split(//).size # 上の長さ value01 = nowTime[timeLen-4, timeLen-3] # nowTimeの末尾4文字目と3文字目 ← ※4桁になる value02 = nowTime[timeLen-2, timeLen-1] # 同様に1文字目と2文字目 p value01+", "+value02 # 2桁づつで表示 ← 実行すると4桁と2桁 どうすべきでしょうか?
『まつもとゆきひろ コードの世界~スーパー・プログラマになる14の掟』 スーパー・プログラマってのが厨臭いなあ。書き下ろしだそうだから買っちゃうかもしれないけど。
>>937 そんなんTimeオブジェクトのメソッドで時間とか分とか出せばいいじゃん、というのはとりあえず置いておく
nowTime = Time.now.strftime("%Y%m%d_%H%M%S")
mm = nowTime[-4, 2]
ss = nowTime[-2,2]
puts "#{mm}, #{ss}"
>>937 最終的に欲しいのは YYYYMMDD_HHMMSS の中の DDSS なんだよな?
リファレンスマニュアルで Time#strftime とついでに String#size,String#[] を調べてこい
942 :
デフォルトの名無しさん :2009/05/14(木) 18:24:50
open-uri で each_line のように一行ずつではなく、 取得した内容全部を一気にごそっと変数に入れるにはどうしたらいいでしょうか
readで全部読む
っていうかread以外用途ないよね
サーバ側がchunkedでだらだら送ってくるのをeach_lineでだらだら処理、とか できるようになって...るんだろうか?
>>946 そのマニュアル、もう凍結されてるよ
今はるりまに移行してる
950 :
デフォルトの名無しさん :2009/05/14(木) 22:25:28
>>914 > ドキュメント
> Document
>
> matzの苦手なもの。彼は普段から「ソースがドキュメントだ。
> バグも完全に記述されている」と主張しているが、誰も受け入れない。当り前だ。
・・・w
952 :
デフォルトの名無しさん :2009/05/15(金) 08:02:23
>>949 Google の検索では凍結されたページが上位に来るのは問題だね。
るりまに転送とかできないのかな。
Googleさんに菓子折でも持って行けばやってくれるんじゃね?
単純にリダイレクトしたら。
ここにいる全員のドキュメント嫌いも相当なものですな
ソースがドキュメントでテストが仕様書
>>953 そういうこと言うとRubyユーザーはHTTPも知らないとか思われそうなのでやめてくれ
sinatra で require 'rubygems' require 'sinatra' get '/' do "hello" end とだけの場合、/test や /xxx みたいに定義されていない URL を叩かれるとエラーになるけど、 その場合は「ページが存在しないよ」と出すにはどうしたらいいでしょうか。
>>959 Not Found
When a Sinatra::NotFound exception is raised, or the response’s status code is 404, the not_found handler is invoked:
not_found do
'This is nowhere to be found'
end
とあるね。
962 :
デフォルトの名無しさん :2009/05/15(金) 16:29:18
>>962 そのリンク先の
>○シンプルタイマー(ソースコード)
がほぼそのまんま答えなんだけどな。
というか「作りたいと思っています」なら、動かないものでいいからコード書いてみ。
添削はするし、わからない部分は具体的に聞いてくれれば答えるから。
ちなみに4行で書ける。
965 :
962 :2009/05/15(金) 17:08:54
>>963 レス有難うございます。
直後に時刻のエポック秒変換の記述を手元の本で見つけましたので
なんとか動作するコードは書けました(下記)。
# OSC01.rb
count = 0
time0 = Time.now.to_i
while true
if time0 +3 == Time.now.to_i
puts "3sec"
time0 = Time.now.to_i
count+=1
end
#
if count>10
break # 11回以上でwhileループをBreak
end
end
・・・明らかに4行は超えてますw
>>965 何回で止めるっていう条件が出てなかったしね。
while
sleep 3
puts "3sec"
end
ちなみに分岐が一文だけならこういう書き方もできることを覚えておいて。
break if count > 10
>>966 有難うございます。
sleepってメソッドだったのですね。
969 :
デフォルトの名無しさん :2009/05/15(金) 19:58:36
CRubyがMRIだから松本さんが開発されたのかと思ったのですが、 検索でトップにくるのはGCを作成している方です。 Rubyの開発とはGCを開発することなのでしょうか?
最近の言語全般で強ち間違ってないような気もするが、多分そういう話でもないんだろうな
971 :
デフォルトの名無しさん :2009/05/15(金) 20:09:51
loop {break if count > 10} 上にあるこういう書き方ってRuby的にどうなの? Integer#timesを使わない理由って何?
countが不規則に増えるとか
初心者の書いたコードになに嫌味つけてんのw
>>969 マジレスすると、一般的にCRubyとは言わず、単にrubyと呼ぶことの方が多いからそうなる
モノ教えるのに幾許かでも慣れてないとこういう時困るよな
まあ少子化だしな 関係ねえか
978 :
デフォルトの名無しさん :2009/05/15(金) 20:38:50
979 :
デフォルトの名無しさん :2009/05/15(金) 20:59:28
すみませんでした。
次スレ立てろよカス
982 :
デフォルトの名無しさん :2009/05/16(土) 04:43:41
ruby1.8.6です。 ファイルアクセスが他のソフトとぶつかる場合で質問です。 Rubyで周期的にXMLファイルを上書きしていますが、この上書きのタイミングと 他のソフトによるXML読み込みが衝突した場合(と思われる時)、 in 'initialize': Permission denied - new XML.xml (Errno::EACCES) というエラーメッセージが出ます。 そこでRubyの振る舞いとして、他のソフトがファイルアクセス中は上書きを延期するか、 あるいは別の方法で衝突を回避したく思います。 何か良い方法はありますでしょうか? なお別のソフト側で衝突回避を試みましたが、上手くいかないためRubyに望みを 託すことにしました。
Rubyあんま関係ないな ファイルロック(またはロックファイル)でぐぐれ たいていの場合両方のソフトが対応してないといけないが、 たいていの場合相手のソフトはそんなもん作ってない なお、直接 File.open(path,'w'){|f| f.write(data)} するのではなく File.open(path_v,'w'){|f| f.write(data)} File.rename(path_v, path) と、ファイル移動をOS任せにしたほうがファイル書き込みアクセス衝突の可能性自体は減る ただし、これだと rename でファイルを掴むまでに起こったディスク上の変更を検知できない このへんの衝突可能性に気を遣ってるソフトはあらゆる永続的データ保存に「別名保存→名前変更」のプロセスを使ってるので そのソフトの使ってる別名保存名がわかればもしかしたらロックファイルのように使えるかもしれない
>>984 Rubyに関するまとまった初心者向けの解説サイトまたは書籍を通読しろ
単に基礎知識が足りない
わかりました。ありがとうございます。
Rubyだけに関する知識じゃなくて、 もっと一般的にプログラミングで使用される基礎的な概念に関する知識だな。
990 :
デフォルトの名無しさん :2009/05/16(土) 10:13:56
999
991 :
デフォルトの名無しさん :2009/05/16(土) 10:15:22
1000!
いやそこまでギリギリじゃないから
あれw 1000!にだまされた
1000なら今年Ruby2.0
こんなスローなスレでそんなことしてもw
1000ならRubyは俺のもの
エッチでリッチなかーちゃん、Rubyをせしめてフランスへ。
とうきょう ルビルビ リズム ルビルビ 心ズキズキわくわくー
1000 :
デフォルトの名無しさん :2009/05/16(土) 16:02:22
10^3
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。