488 :
名無しさん@そうだ選挙に行こう :
2009/08/30(日) 07:42:50 初めまして。 質問です。 今やってるプロジェクトが、以前、rubyのMVCフレームワークによって書かれました。 その開発した方が、/public_html/.htaccessで何らかの設定をしました。 今回、/public_html/manage/配下にphpのMVCフレームワークを使用して開発することに なったのですが、/manage/.htaccessで設定しても親ディレクトリの.htaccessの影響を受けて /manage/配下のファイルにアクセスしても、404になってしまいます。 /public_html/.htaccessの内容も分からず、なるだけ触りたくないのですが、 サブディレクトリの.htaccessで、親ディレクトリの.htaccessの影響を全く受けないようにすることは可能でしょうか。 お忙しいところ、すみません。 よろしくお願いします。
Ruby 関係ねえ .htaccess の書式勉強しろ
Ruby関係ないからスレチ > .htaccessの内容も分からず、なるだけ触りたくないのですが、 それを晒さないと。というより、せめて自分で読んでみないと。
491 :
488 :2009/08/30(日) 10:00:38
可能
/public_html/.htaccess <IfModule mod_rewrite.c> RewriteEngine on RewriteRule manage\/$ manage/app/webroot/ [L] RewriteRule manage\/(.*) manage/app/webroot/$1 [L] </IfModule>
てか Ruby 全く関係ねーということがわかってなお居座るのってなんなの頭悪いの
>>494 自分で正しいことをしていると思っているイタイタイプ
周りでは陰で嫌われているのに気づかないタイプ
自分の目的が果たされれば何をしても構わないと思ってるタイプ
497 :
sage :2009/08/30(日) 12:54:11
ソウダネ、IDナイカラ、ダレガダレダカサッパリワカラナイネ。
>>491 すげーなー。
そのhtaccessファイルの中身の何がおかしいのかもわからない・調べられないのに、
Webアプリケーションを開発しようなんて。
恐ろしくて使いたくないぜ。
>>497 テーブルの差異を調べるプログラム位、数十分で書けるだろ
二度と使わないかもしれないORMの調査に無駄な時間を費すの?
dbs = [file1,file2].map {|fn| SQLite3::Database.new(fn) }
dbs[0].tables.each do |table| # tablesなんてメソッドがあるとして
results = dbs.map {|db| db.execute("select * from #{table}") }
# results を比較
:
end
502 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 16:37:20
SQLを書きたくないんじゃなくて 書けないの間違いだろうな。。
クエリに文字列埋め込みステキです
何を言ってるの ユーザーがSQLを直接発行するだなんて悪手中の悪手じゃないか 適当にうまくやるよボタンを押すだけで内部でSQLが組み立てられて 結果のデータのみがユーザーに返ってくるというのが正しいありかただろう
>>504 そうなんだよねえ
結局SQLを書かせなければならないことになって深く絶望したわ
なんとかならんもんかね
> SQLite3::Database.new(file)で両方のデータベース開いて > テーブル毎にレコードの比較した方が楽な気がする 答えでてるじゃん。 終了
Ruby使うまでもなくdumpしてdiffとればいいんじゃない。
なんだろう。
>>501 を信じてそのままドンってやって、ガツンと応答不能になり得たりしそうなこの不安感。
初心者スレでこれはありなんだろうか。
>>501 の論旨からいうならもうちょっと、丁寧に逐次的に例を出す文脈ではなかろうか。
509 :
501 :2009/08/30(日) 21:41:49
>>508 俺に遠慮する必要は無い、君が教えてあげてくれ
510 :
sage :2009/08/30(日) 22:44:10
>>485 です。
ActiveRecordではなくてSequelというのが
良さそうというのがわかりました。
Sequel:
http://sequel.rubyforge.org/ こんな感じで書けます。
DBLeft = Sequel.sqlite("./left.sqlite")
left_table_foo = DBLeft[:table_foo]
DBRight = Sequel.sqlite("./right.sqlite")
right_table_foo = DBRight[:table_foo]
left_table_foo.each do |left_rec|
# right_tableのレコードと比較する
end
なんかしつこく質問してしまったみたいですみません。
でも回答してくれて助かりました。では。
511 :
デフォルトの名無しさん :2009/08/31(月) 01:39:52
WinXPで1.8.6です。 文字列を16進ダンプしたものの中に、2バイト文字が含まれているか どうかを判定するにはどうしたら良いでしょうか? 変換コードは下記の通りです。 arr0 = dataStr.unpack("H*")[0].scan(/[0-9a-f]{2}/) arr1= arr0.to_s + "\n" 対象のdataStrが Rec の場合 arr1 が 52,65,63 になりますが、 Rク では 52,83,4e です。この場合、真ん中の16進数の83を元に 判定するのでしょうか?
>>511 文字コード決めないと「2バイト文字」を定義できなくないか?
zenkaku=false arr0.each do |c| if c>128 do zenkaku=true end end
globってなんであんな低機能なまま放置されてんの?
cgiてなんであんな低能なまま放置されてんの?
cgiは酷いね。参考にも成らない。 いい加減、政権交代の様に入れ替えるべき。
cgiに関しては、政権交代!ばかりいってるだけだし民主党よりヒドイw
候補者はいるだろ。その候補者を使えるレベルまでもっていくやつがだれもいないだけで。 WEBrickのcgiライブラリのことなんだけど。
WEBrick::Sessionがないのはある意味象徴的
これは何度でも言うが、作るだけなら立候補は何人もいるしいくつも作品があるんだよ 作るということとメンテナンスを引き受けるということとは全く違う スレ違いだが
>>523 >作るだけなら立候補は何人もいるしいくつも作品があるんだよ
いくつもあるとは知らなかった。
ぜひ紹介してくれ。
ネット関連のライブラリは魔界だ バージョン0.3まで行かずに放置されるのばっかじゃん
Rackがバージョン1.0になって有力候補か? と思いきや CGIで動かすと落ちるバグがあり、しかもなかなか修正リリースが出ないというオチ
そんなに悪いところがわかってるなら自分で作ればいいじゃん
みんな忙しい。
出したコードにはコミュニティ上の責任もたんといかんのでな 書きっぱで後は知らん、というような人はどの世界でもノーサンキューだ
口だけじゃないかw
みんな忙しい。 みんな忙しい。 みんな忙しい。
532 :
511 :2009/08/31(月) 13:04:08
Perl や Python の CGI ライブラリを移植するのはどうだろうね
それは新しい実に新しい
じゃあわかりやすいところで Perl の CGI.pm から始めようぜ
(ぐるぐるぐる) CGI.rb ができましたー 新しいスクリプトが欲しいんじゃなくて、スクリプトを継続的にメンテナンスできる人材が欲しいのよ 新機能をガンガン盛り込む人材ってのはとりあえずはコア近辺には要らないんだ
だれだよお前
>>536 >新しいスクリプトが欲しいんじゃなくて、スクリプトを継続的にメンテナンスできる人材が欲しいのよ
それどうやって判断するの?人材がいたとして、そいつがおまえのいう条件を満たしているかどうかって、だれがどうやって判断するのさ?
だいたい、CGI.rbなんてtDiaryでもHikiでもつかってるんだろうが。それだけユーザ数が多いのに担当できるだけの人材がいない/いなかったのかよ?
ほんとうに人材が欲しいなら、公式にアナウンスしろよ。このライブラリのメンテな求めてます、条件はこうこうです、と公式サイトに載せればいいだろ。
ろくに求人活動もせずに人がいないだの条件はどうのこうの、言い訳がましいわ。
スレ違いの内容で長文とか勘弁 他でやってね
CGI.rbの上位互換wrapperがあればいいんだよね oreoreCGIなら作ったけど
>>542 あんまりよくないと思う
Rackの修正リリースが出て、標準添付になれば一番いい
配列A1, A2, A3, ... Anから要素を1個ずつ取り出した結果を網羅した配列Xを作る。 ・・・やってくれるメソッドなかったっけ?
>>544 Array#transposeのこと?
ありがとう、調べてみました。近いけど、違う。 p [[1,2], [3,4], [5,6]].transpose # => [[1, 3, 5], [2, 4, 6]] これが下のようになってくれたら期待通りなのです。 # => [[1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6]]
data = [[1,2],[3,4],[5,6]] p data[0].product(*data[1..-1])
てゆーか初心者はきちんとeach使え 小手先だけだと詰まるぞ
>>548 そうかproductか!1.8.7から入ったんですね。それっぽいキーワードで
ググってもなかなか見つからなかった。どうもです。
>>548 行列的操作関連はeach使ったほうがややこしくなりそうな気がする
転置行列は転置行列でしかないわけだし
すまん網羅って見落としてた
それにしてもdata.productって書けそうで書けないのかw
>>548 eachで実装した方法を提示するならともかく
初心者に書かせるレベルにならないと思うぞ
>>551 >eachで実装した方法を提示するならともかく
>初心者に書かせるレベルにならないと思うぞ
+1
def cartesian_product(*data) raise if data.size < 2 data.inject([[]]) do |product, items| product.inject([]) do |r, elem| r += items.map {|i| elem + [i] } end end end
554 :
488 :2009/09/03(木) 05:40:09
無知ですみません。 自分なりに色々調べた結果、Passenger/mod_railsを使っているため、 /manage/の.htaccessが、それによって上書きされているようです。 /public_html/フォルダはRuby railsで開発されており、 今回、/public_html/manage/にPHPで開発することになりました。 私は、Rubyを全く知らない&.htaccess初心者なので、このような事態に陥っています。 RailsAllowModRewrite On を使えば、なおるようなのですが、 /manage/.htaccessでそのように設定しても、/manage/.htaccessに設定してあることが 有効になりません。 どなたか知っていたら教えて頂けないでしょうか。 よろしくお願いします。
日本語もまともに掛けないのばかか
弁護するわけじゃないが普通に分かる おまえがRailsを分かってないだけだろ
たのしいRubyを読み終わったんだが、謎が一つあります。 count = Hash.new(0) ...カウントにkeyとvalueを設定する処理(省略 count.sort{|a,b| a[1] <=> b[2] }.each{|key,value| print "#{key}: #{value}¥n" } とあったとして、「<=>」という演算子が左右のオブジェクトを比較して、 <は-1 =は0 >は1 と返してくるのはわかったのだが、どうやってソート処理されているの謎。 内部のsortメソッドでイテレータが並び替えのアルゴリズムで処理してるのでしょうか。 詳しい解説求む。 ちなみに今まで並び替えのアルゴリズムには目をつぶって生きてきたので、 何種類かあってそれぞれに特徴と効率があるというぐらいしか、あまりよくわかってない。
-1と0と+1というそれそのものには深い意味はないよ 「今持ってるものが挿入先と比べて大きいか小さいか同じか」を調べてるだけ 手に持ってるものが大きかったら“上”に置いて、小さかったら“下”に置いて、同じだったら“横”に置く 普通にリアルに手元で何かを大きさ順に手動で並べ替えるのと同じ処理をしている 実際はもちろん事前グループ分けとか処理順とかにテクニックがあって単純ではないが、 並べ替えの行為そのものに着目した場合、理屈自体は「大きいか小さいか同じか」と一緒
sortメソッドに与えるブロックは「大小の判断基準」 人間に天秤を与えれば重さの大小になるし、ものさしを与えれば長さの大小になるようなもの その判断基準を元に実際に並べ替えるのはsortメソッドの内部で行われる sortメソッドは少量のデータを手軽にソートしたいような ソート手段にこだわる必要のない場合に向いている(大抵は事足りる) もし速度的に不足するような場合はアルゴリズムを選ぶ必要があるし それを自分で実装するかライブラリを使う必要がある
>>560 並べ替えのアルゴリズムに処理をわたす黒魔術ってことでいいですか?
>>561 なるほど、判断基準を渡しているってことか。
イテレータの章で判断基準を渡すってのが書いてあった。
「メソッドがどういう比較処理をおこなうかを渡して欲しい場合がある」と。
その処理がブロックで囲まれた a <=> b ってことか。
謎とけたー。気がする。
なるほど sort{|a, b| a <=> b } の {|a, b| a <=> b } ってなんだよ! いきなり b とか出てくんじゃねえよ! というとこですな
irb> p [5, 4, 3, 2, 1].sort{|a, b| p "a:#{a}, b:#{b}"; a<=>b} "a:5, b:3" "a:3, b:1" "a:4, b:3" "a:2, b:3" "a:4, b:5" "a:1, b:2" [1, 2, 3, 4, 5]
0が偽じゃない言語だから、perlみたいに、比較 or 比較 or 比較 みたいに書けなくて嫌だね なんでもいいなら、-1,nil,1 でよかったんじゃないのか
Cの標準ライブラリにあるqsortも、「比較方法」だけを別関数で 作っておいて、その関数(のポインタ)を引数として渡すような造りになっている。 Strategyパターンですかな。
判断基準を別に設けると、ひとつの枠組みを用意するだけで好きに扱えるからいいよね。 人間配列.sort{|a,b| a.身長 <=> b.身長}だとか、体重に変えてみるとか、逆順にソートしてみるとか。
>>566 (a.身長 <=> b.身長).nonzero? or (a.体重 <=> b.体重)
変数に型がない言語の場合、""や0が偽じゃないことで得られる恩恵の方が多い気がするな 無効値は偽であってほしいけど、正常値を数値や文字列で返す関数などは 0や""も正常値として扱うケースが多い。なので、これらが偽だと、戻り値をそのままブール式につかえない Perlなんかだと、0も""も偽だから、これらも正常値として返す関数の戻り値をチェックするときは、 die "エラ〜" unless defined get_string() とかやって、""のケースを除外しなくちゃならない。|| とか && も有効活用できないし
>>569 それって身長が不一致のときにtrueが返らない?
・・・返値はselfかnilなのか、よくできてるなぁ
0を偽にしろと言ってるのではなくて、0が返ってきてもうれしくないよねってことでしょ
>>573 あぁ、そっか。骨髄反射してた。さーせん
["foo", "Bar", "baZ"].uppereach{|i| puts i} FOO BAR BAZ みたいなマイ繰返子って作れんの?
>>565 黒魔術解明!!ありがと。スッキリしたぁ。
def uppereach hoge.each do |x| yield x.upcase end end みたいな?(Arrayに組み込むのってどうやるんだっけ)
class Array def uppereach self.each do |s| yield s.upcase end end end
newbie氏はブロックがわかってないとみた。 別に黒魔術でもなんでもない。
黒魔術というとevil-rubyみたいな。(よいこは検索しないように)
>>579 今回の場合、yieldに与える処理ってことですよね?
yield自体、今日、たのしいRubyを読んで知ったばかりなので…。
わかってないといわれれば、わかってないはず。
間違ってますか?
yieldって文脈次第でいろんな日本語になるんだな。 イテレータの場合は何だろ。「任せる」?
つまり yield (newbieさん.理解度) てことか
産むかと。
14歳から始めるruby買ったが外した 標準命令の説明あんま書いてないし 内容が詳しくない
「14歳からはじめるC」なら買ったんだけど
標準命令って何?
え、なにこいつ標準命令も知らんののかwwwwバカスwwwwww mesとかfontとかboxfとかくらい使えるようにしとけwwwwwwww HSPの
まあ言いたいことはそれなりに伝わっては来る お勧め本以外をいきなり買っても自己責任でよろしこ
高っかい金出して最初のデカいRuby本を買った初心者の人に比べればどうということはない
オライリーファン登場
Rubyを始めようと思っただけのプログラミング初心者の人には荷が勝ちすぎた薀蓄本だったな 知識さえあれば面白い本なんだけどね
>>593 自分の努力しだいだよ。
基本的なアルゴリズムをすっぽかしてきたみたいだけど
一度自分で手を動かして実装しておくと後の理解が断然楽になる。
バブルソートとか簡単なものだけでもやっとくのがオススメ。
いまどき、ソートのアルゴリズムを自分で書いてるような コーディングなんてしてたら、全面的に見直して作り直したほうがいい。
なんだ、まだそんなこと言ってる人がいるのか 自力でのソートの実装は並び替えをさせるために書くんじゃねえよ 書けるだけの抽象化知識と基礎的な実装力があることが重要 自作のソートのコードを利用する奴は95%までバカだが、 ソートのコードを書けないのは100%ただのバカ
>>569 nonezero?ってながいなあ。nz? くらいでよくない?
よくない
ブロック付きのsortってほとんど使わんよな 大抵sort_byで済む
>>597 本気でそう思うならredmineにfeature request
ソートの基準が2段階のとき sort{|o1,o2| if o1.a != o2.a o1.a <=> o2.a else o1.b <=> o2.b end } みたいに使ってるな
rubyの場合は、配列にして比較するんでしょ。効率の善し悪しは知らないが
Enumerable#sort の場合は Ruby スクリプトに降りてこないから遅いわけではないよ
俺もほとんど.sort_byだなあ
>>596 > 自作のソートのコードを利用する奴は95%までバカだが、
> ソートのコードを書けないのは100%ただのバカ
うむ
説明からソートをコードに起こせない人は時々いて、そういう人は例外なくアレ
ソートをコードにする練習はソートくらいでしかうまく鍛えられないから、
初心者のままでいいと思ってないのなら文句言わず今自分の手を動かしてやるべき
>>601 > ソートの基準が2段階のとき
でも条件が単純ならば大抵sort_byですむ
ブロック付sortなんてsort_byが出来てから使ったこと無いなぁ
A=Struct.new(:a,:b)
a = [A.new(2,4),A.new(2,1),A.new(1,5),A.new(1,1)]
p a.sort_by{|o| [o.a,o.b] }
文字列中の数字を数としてソートするなんかだとどう書くんだろう?
a = %w(3a 20a 100a b9 b80 b700 a9b100 a10b100)
p a.sort_by{|e| e.scan(/\d+|\D+/).map{|e| e[/\d/] ? ['0',e.to_i] : [e]}}
こんなんでいいのかな?
アルゴリズムの勉強していたら夏休み終わってたんだが。
>>608 ユークリッドの互除法を理解しただけで夏が終わった俺よりマシだ
気にすること無いぞ
610 :
デフォルトの名無しさん :2009/09/04(金) 20:14:34
Ruby 1 初めてのプログラミング(arton/宇野るいも 著)を買ったらRuby1.9.1が付いて来たんだが。
具体的に不便なところ(使えないもの)を教えてもらえないだろうか?
あと、このサイト(
http://www.rubylife.jp/ini/ )にある、
『オプション指定をプログラム内に記述』というソース内で文字コードを指定する方法が実行できないのだが、
1.9.1では使えないということなのだろう?
誰か頼む。
英文テキストを送って翻訳サイトで日本語化してstdoutに文字列表示するサンプルどっかにない
使えないだろ。嘘言うな
>>612 すげ〜。ありがとう。
いい加減CGIも勉強した方がいいのかな。
あとまだ10年くらいは通用する技術なんだろうか。
誰かruby-1.8.6-p383をgcc4.4.0のmingwでビルドしてない? make testしたらエラー出るんだけど。 not ok float 1 -- ./sample/test.rb:1172 not ok float 2 -- ./sample/test.rb:1173 not ok float 3 -- ./sample/test.rb:1174 って感じでエラー。
>>615 CGIもできないヤツがHTTPでなにかできるとは思えないから
通用云々よりまずできるようにしとけ
PerlのURI::Fetchに相当するような、CacheつきWebクライアントはないでしょうか?
vim-rubyをインストールしたのですが、vim-ruby-install.rbのセットアップが上手くいきません。 $ gem install vim-ruby >WARNING: Installing to ~/.gem since /usr/lib/ruby/gems/1.8 and /usr/bin aren't both writable. >WARNIG: You don't have /home/****/.gem/ruby/1.8/bin in your PATH, > gem executables will not run. >Successfully installed vim-ruby-2007.05.07 >1 gem installed $ sudo vim-ruby-install.rb >Can't find source directory. 上のように出力されてvim-rubyのセットアップができません。 気になるのが、/usr/bin/vim-ruby-install.rbファイルは存在するのに/usr/lib/ruby/gems/1.8/gemsディレクトリにvim-rubyが無いのです。(gemからインストールした他のgemパッケージは全てここにある) しかしgem listコマンドを叩くと他のgemパッケージとともにvim-rubyが出力される。 何か分かる方がいましたら教えてください。よろしくお願いします。
>>615 >>617 ajax で javascript が開発の中心になっても CGI は細々と生き残るだろう
ただし HTML は javascript の単なる loader になり
CGI はバックエンドとしての RDB - XML translator になり下がる
ぽかーん。
pythonのようにコンソール上でコマンド1つ1つ実行させて 動作を確認させることはできないのですか?
つirb
RubyでCGI(笑)
>>619 眠いから論理的に読んでないが、
gem は sudo したとき(/usr に書き込み権限があるとき)と
一般ユーザーで使用したとき(/usr に書き込み権限がないとき)とで使用するディレクトリが違う
完全自動で /usr/bin にインストールして欲しいなら最初から sudo gem install しろ
gem install すると gem は $HOME/.gem/ruby/1.8 とかに入る
昔は全員が sudo しまくってたんだが、最近は sudo しないインストール方法が市民権を得ている
いまだに Rakefile で sudo ベタ書きしてるライブラリがあるがとっとと死んでくれてよい
へ?なんで?意味がわからない。
630 :
610 :2009/09/05(土) 06:37:13
>>613 そのサイトの該当部分は、正確には『Ruby入門 >日本語と文字コード >オプション指定をプログラム内に記述』だった。
すまん、言葉が足りんかった。
プログラムだが、これ↓を実行すると、
#! ruby -Ku
print("KCODE=", $KCODE);
こう↓なる。
test.rb:2: warning: variable $KCODE is no longer effective
KCODE=
いやそれはメッセージがそのまんまだが っていうかこれの経緯の解説が無いならその本投げ捨てろ $KCODE が動作するのは 1.8 までで、1.9 からは別な方法で指定する
こういう場合大抵その本に罪はないw
634 :
610 :2009/09/05(土) 08:48:43
>>631-632 答えてくれてありがとう。
632のリンク先は自分が勉強不足なせいで何言ってるか半分も理解できなかったがw
本にはマジックコメントを使うと書いてあったんだが、ネットで調べてみたら別の事が書いてあったんで混乱したんだ。
やっぱり別の本買えばよかった(´;ω;`)
>>632 はまだ理解できなくても問題ない
これは Ruby1.8 をある程度修めてて
なおかつエンコーディングの日常的知識があることを前提としている一次文書だ
Ruby 1.9.1 で初めてプログラミング言語に触れる人だとか
文字エンコーディングってナンデスカという人だとか
そういう人向けの文書ではない
そういう人向けの解説はこれをもとに出てくる…はずなんだが、ばあさんやまだかいのう
>>615 CGIというか、HTMLを使った基本的なWebアプリが作れるようになれば便利
あと10年ぐらいは、HTMLやHTTPが無くなることはないだろう
今さすがにCGIはなあ、とか思うんだけど、 で、まあwebアプリを初心者に勧めるとして何するのが(どんなライブラリ使うのが)いいんだろ。 Railsはでかいは、デプロイ面倒だわ、慣れるとすごくいいいんだけど、初心者がいきなりやるには…。 Sinatra辺りだろうか?
CGIが書けずにフレームワーク扱いだす新人PGって、 交通ルール知らずに車運転するようなもんじゃないだろうか
どこぞのフレームワークと違って やって無駄になるような技術ではまったくないね
比喩は嫌いだ
webアプリ初心者が序盤に作ったモノはひどいデキになって当たり前なんだから まずはライブラリなしの生CGIでいいんだよ 薄っぺらい仕様だからとっかかりにはちょうどいい セキュリティはこの際忘れろ、ローカルでやるかbasic認証でもかけて隠しとけ セキュリティやらフレームワークやらはCGIの基礎がわかってから考えろ
KENTととほほを知ったことには感謝しなければならない
>>642 で納得していただろうから
「考えない」んだよな そりゃそうだ、今の時点で「動作してる」のに、何を付け加える理由があろう むしろ、安全じゃない文字の基本的テストが標準付属していて、 それを通さないとそもそも動作しないとかそういうフレームワークがあれば
Railsの話題なのですが、rubyに共通する話なのでこちらで聞いてみます。
スクリプトのデバッグにruby-debugを使ってみているのですが、
b(break)コマンドでブレイクポイントを表示してくれず、現在行がブレイクポイントに追加されてしまいます。
ブレイクポイントを表示するにはどうしたらよいのでしょうか?
下記を見ると、breakでブレイクポイントの表示のはずなのですが・・・???
debug - Rubyリファレンスマニュアル
http://www.ruby-lang.org/ja/man/html/debug.html ruby-debug 0.10.3
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Ubuntu 9.04 (coLinux)
646 :
645 :2009/09/05(土) 17:54:55
どうも、ruby-debug 0.10でコマンドが変わっていたみたいです。
下記サイトが参考になり申した
Ruby On Rails ピチカート街道 - Rails 2.0・その10(ruby-debugコマンドマニュアルv.0.10.0 デバッグの方法が簡単に) -
http://rubist.blog77.fc2.com/blog-entry-114.html 具体的には、b(break)ではなく info breakpointsでブレイクポイントを表示できるみたいです。って面倒くさいくなっとるやん!!
とにかく解決しました。ありがとうごっざいました。
647 :
610 :2009/09/05(土) 18:40:01
>>636 これは……RoRをやれ、ということか?
いずれRoRをやろうと思ってたからありがたいのだが、これでRubyも勉強できる?
嗚呼、RoRはRuby1.8.7対応か。畜生、4000円パーだ。
>>647 それは著者がarton氏+初心者にRoRを進めるというギャグ
まずは一冊目をじっくり勉強してみたらいいんじゃないか
それから1.8前提の既存サイトで勉強しても全く問題ないよ
>>610 は「初めてのRuby」(オライリー)を買っておけ。
あれ一冊読んでおけば今回のようなつまらないことで迷うことはない。
yugui本か。 公式の愛称はキリン本らしいけど…… 他の言語の経験があれば、よい本。
653 :
619 :2009/09/05(土) 23:10:49
>>627 ありがとうございます。
アドバイス頂いたとおりsudoコマンドでインストールしてみましたが、 それでも$HOME/.gem/ruby/1.8以下に入ってしまうようです。
sudoではなく、suコマンドでrootになってからgem install vim-rubyとすると、/usr/lib/ruby/gems/1.8/gems以下にvim-rubyディレクトリが作成されました。
一般ユーザーでgem installすると$HOME/.gem以下にパッケージが配置されるだけで、uninstallコマンドも効かず自力でディレクトリ削除するしか無いようですが、これが一般的な方法なのでしょうか?
データ書き込み用にカレントディレクトリに temp.txt を作成する。すでに有るなら失敗する。 という処理をアトミックに書く方法を教えてください。 openじゃ無理ですか? ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
unix系ならこれで行けるけどWindowsはわからんなあ open('temp.txt',File::EXCL|File::CREAT|File::RDWR)
…
一発1行で書きたいなら
>>655 がそのまんまだが、これはちとわかりにくい
普通に長々と条件分岐させたほうが得策かもしれない
……
アトミックが要求される場面で長々とは書けないんじゃ?
アトミックとかもう初心者スレの話題じゃないだろう
わかりにくい以前に File::EXCL|File::CREAT|File::RDWR の意味を調べる術がないという
>>654 ロック処理をきちんと書くべきだと思う
もしくは、ロック処理をやってくれるライブラリを探すか
適当でいい(とりあえず動けばいい)ならflockでOK
>>659 このスレで扱う「初心者」がRubyなのかプログラミングなのかだなw
いや、やりたいことからしたら
>>655 しかないだろ
初心者スレだからって何をとんちんかんなことばかり
↓ここでお手本になるような排他制御のサンプルを一つ
シンプルに、追記でopenして読み込んでからの分岐だけではいかんのか? 目的がわからんのでなんとも言えんが。
……
>>664 ヒント:リファレンスにFile::EXCLの意味が載ってない
RubyとPythonはどっちが強いですか?
Rubyのドキュメンテーションのダメさは異常
ハイレベルPythonユーザーのアプリケーション製作能力は異常 が、その下の層が薄い印象 Rubyはハイレベルユーザーの数が多くない代わり、中級ユーザー層が厚い感じ Python自体は凄いんだが、高次に使いこなすための敷居があまりに高すぎる
Pythonは具体的にどうすごいんだ?全く知らんのだが
endを書かないことで最大1.5倍程度ソース密度が高まる
それで敷居が高いのかw
Pythonにはギッチリよりスカスカをよしとする哲学と78文字制があってだな
676 :
デフォルトの名無しさん :2009/09/06(日) 10:59:49
CentOS release 5.3 (Final) ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-linux] gem install hpricotで、hpricotをインストールしようとしているのですが、 ビルドエラーが出てインストール出来ません。 どのようにしたらインストールできるでしょうか。 よろしくお願いします。 Building native extensions. This could take a while... ERROR: Error installing hpricot: ERROR: Failed to build gem native extension. /usr/local/bin/ruby extconf.rb checking for main() in -lc... yes creating Makefile make gcc -I. -I. -I/usr/local/lib/ruby/1.8/i686-linux -I. -D_FILE_OFFSET_BITS=64 -fPIC -g -O2 -c hpricot_css.c hpricot_css.c: In function ‘hpricot_css’: hpricot_css.c:3399: warning: comparison between pointer and integer gcc -I. -I. -I/usr/local/lib/ruby/1.8/i686-linux -I. -D_FILE_OFFSET_BITS=64 -fPIC -g -O2 -c hpricot_scan.c cc1: out of memory allocating 481668 bytes after a total of 13987840 bytes make: *** [hpricot_scan.o] Error 1 Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/hpricot-0.8.1 for inspection. Results logged to /usr/local/lib/ruby/gems/1.8/gems/hpricot-0.8.1/ext/hpricot_scan/gem_make.out
>>670 Perlのドキュメントのなさほどひどくはない
これわひどい ウェブ 検索ツールを閉じる検索ツールを表示 excl ruby に一致する日本語のページ 約 1,180,000 件中 1 - 50 件目 (0.44 秒) もしかして: excel ruby 検索結果 1. Rubyist Magazine - Win32OLE 活用法 【第 2 回】 Excel 2. Rubyist Magazine - RegionalRubyKaigi レポート (01) 東京 Ruby 会議 01 3. Take it easy!: Ruby とエクセル 4. はてなブックマーク - { B!} - excel - Ruby on Rails 5. はてなブックマーク - kedmブクマ - excel - ruby 6. RubyでExcel - Ruby/Rails・Web系プログラム情報まとめ
ごめんなさい。再起動したらいけました。
>>668 See man open(2) for more information.
ここに書く暇あったらwiki直せよw
rdocで定数の説明ってどこに書くんだっけ
>>685 この方、あんまり、物事を嫌い嫌い言うのって敵作るだけだから止めた方がいいと思うんだけどね。
webに不満をぶちまけること自体はかまわんと思うが。
しかし、schemeが日の目を見ないって嘆いているのが、現実を見れていないようなのだし、
前述の件もあるからあまり関わるのはよしたほうがよさそうw
まあでも世の中はどう転ぶかわかんないから なにそれおいしいのだったOOPも今や知ってて当たり前だし
>>670 っていうか、明らかに「日本人のドキュメンテーションのダメさは異常」なんだよな。
日本人のタッチするところ、ドキュメントの無い世界が広がるってなもんで。
それは、外国人の書いたもので日本で使われるようなものは、 ドキュメントがあるものだけだからな。視野に入ってないだけ。
>>687 いや、個人の好き嫌いを述べるのは別に構わんと思うが。
「海外のブログでは批判記事も目にする(そして、その筆者も知らないのに叩く
なと逆に叩かれる)ことが結構あるのに、日本ではこれが非常に少ない。」
と書いてる通り、叩かれることも自ら望んでるんだろうし。
そろそろ隔離スレ行こうね
>>691 批判とかツッコミはやめたほうがいいよ。スルー推奨。
過去の記事を読めばわかるけど、実は極度に打たれ弱い。
> 実は極度に打たれ弱い。 叩き甲斐があるってもんじゃないか
いや全然 オモチャが極端に少ない生活してるんだな
>>697 > 叩き甲斐があるってもんじゃないか
叩き甲斐とは、叩かれ強い人を精神病院送りにした時感じるもの。
うざい
マジで本人乙
うざい
,.、 .,r.、 ,! ヽ ,:' ゙;. ! ゙, | } ゙; i_i ,/ ,r' `ヽ、 | ,.、 ,r.、 ,i" _, ._ ゙; | ,! ヽ,:' ゙;. !. ・ ・ ,! | ! ,! } ヽ、 x _,r'' |二゙; i二二二(⌒ノ"''`''''''''''''"´`ヽ. | ,r' `ヽ、 ´ヾ、 l l ,i" _, _ ゙; ! i___| !. ・ ・,! | t,ノ |ゝ_ x _::' !、、、、、、、、、、! |,/"`''''''''''''''"´';, | | | (,;! !) | | | |゙''::r--、::--;r' |____|_____| |―゙'ー-‐゙ー-゙'―┐ (,,,__(,,,____)
705 :
697 :2009/09/06(日) 20:54:13
>>699 うん、オモチャで遊ぶときは今のオモチャを壊してから次のオモチャで遊ぶもんでね
一つのオモチャで2回遊んだことないんだ。
ほんとに基地外スレ・・・
そんなにほめてくれなくても(赤面)
なにそれこわい
MoonGiftだっけ?
Ruby上でPythonを走らせる実装にRuby/Pythonがありますが 逆にPython上でRubyを走らせる実装ってありますか? BlenderでRubyを使いたいです・・・
ruby-1.8.6-p383をgcc4.4.0のmingwでビルドする場合は、 ルートのMakefileのCFLAGから-O2を外してmakeすれば良いみたい。testとtest-all通った。 ruby-1.8.7-p174はtestは通ったがtest-allするとtestが全然始まらない。重いだけかな?
確かな匂い
次のエントリもひどいな。これは、もはや才能。
本人のブログに突撃するのはかわいそうだからやめようね。 突っ込みたい人はここでどうぞ。好きなだけ突っ込んであげて。
RubyのeachへProc渡し p = Proc.new {|x| print(x) if (x == 2) return end print(', ') }
本人はココに常駐してるのかw
もう触れるなよ エントリ更新するたびに出てくるようになるぞ
MoonwolfってRubyistだったと思ってたけど、いつの間にRubyぎらいになったんだ
dailsとか出てくるのかな
Hello world
変なのが消えて、また過疎スレ化するのかな・・・ そういえば夏も終わりだねぇ
実は自分がその「変なの」だったっていうオチって怖くね?
何その林先生案件
>>723 さっぱりわからん。頑張っても14Bしか出来んかった
Hello world だけで 11 バイトだからなぁ。 PHP なら 11 バイト可能だけどw
Hello, world! お題がこれだから13byteでPHPでも無理
「単純なやり方では」無理、だ なにかしらの圧縮かけてんだろうけど・・・
短縮系golfは初心者の得るものはないので他スレでやっとくれ
>>731 gorubyはむしろhだけだった記憶がw
exec禁止じゃないから、gorubyを呼び出してるんじゃないかと思うが。
s = "aaaaaaaaa[hoge]piyopiyo" r = "[hoge]piyo" if s =~ /#{r}piyo/ puts $& end 今日こんな感じのコード書いてマッチしねえってことで しばらくはまってた
>>738 気持ちは分かるw
p /#{r}piyo/ #=> /[hoge]piyopiyo/
p /#{Regexp.escape r}piyo/ #=> /\[hoge\]piyopiyo/
putsとかpとかprint以外のメソッドに括弧をつけない男の人って
自作メソッドにしか付けねーよ
括弧は出来るだけ付けるのがナウいんですか? 今までその逆をしてました・・・ごめんなさい
カッコがない場合は「わざと」外してる それは p だったり puts だったり DSL っぽく書く意図だったり カッコの有無で動作が変わることを経験した人はカッコつけるのを基本にすると思う
引数無しメソッドでもつけるのが最近のマイブーム ああ、これ関数だなって一発でわかるし
普段はまあどっちでも好きなようにしろ、が回答 紛らわしいときに ( ) が使われているのなら普段が ( ) ありでもなしでも構わない 問題は、普段からカッコつけない奴の多くは「紛らわしいとき」を全く意識しないということ たまたま動いてるのを普通にスルーしやがる 普通逆だろ、カッコ常につけまくってる奴のほうがカッコの有無に無頓着であるべきだろ
kimoi
obj.method arg とか死ぬほどキモイな
メソッドチェーンがない言語の因習だと思う
Moonwolf説はガセ
railsのソースコード読んでruby覚えた俺はカッコ無しの方がしっくりくる メソッドの戻り値も変数に格納しない
1.9.2で、mingw32の4.4.0のpthreadってdisableしてビルドした方が良いのかな?
>>751 よくはないが、別にそんなクリティカルな用途で使うわけでもないだろうし別にいいんじゃね
Perlでいうところの関数のリファレンスを変数に格納して実行するにはどうすればいいのでしょうか? --- Perl --- sub func { print 'func' } $func_ref = \&func; $func_ref->(); --- Ruby --- def method print 'method' end method_ref = ???? method_ref.call?? こうするしかないのかな? method_ref = proc { method } method_ref.call
>>754 Kernel#__send__(文字列 or シンボル, 引数...)
Method#call(引数...)
UnboundMethodをbindして#call(引数...)
など。
>>754 Object#method #
>>755 の真ん中の奴
def func ; puts 'func' ; end
func_ref = method(:func)
func_ref.call
>>751 --disable-pthreadでconfigureするかどうかってこと?
意味ないからどっちでも同じ結果になるよ。
>>758 サンクス
そうするとstruct timespecが二重定義って怒られるのはどうしよう
>>759 redmineで報告すればいいんじゃないかな。
Rubygemパッケージを作るための色々なファイルの雛型あきこしてくれるライブラリとかありませんか
トップレベレと言うのか、どこのクラスにも属さず、 いきなり書いた一行の文って、どう考えればいいの? Cで言うmain関数みたいなのに暗黙のうちになってるとか、 Javaで言うmainメソッドみたいなのに暗黙のうちになってるとか、 ・・・どう解釈したらいいのだ?
>>761 $ jeweler --rspec hogeeee
create .gitignore
create Rakefile
create LICENSE
create README.rdoc
create .document
create lib
create lib/hogeeee.rb
create spec
create spec/spec_helper.rb
create spec/hogeeee_spec.rb
Jeweler has prepared your gem in hogeeee
$ ls hogeeee/
LICENSE README.rdoc Rakefile lib spec
>>762 トップレベルにも self として参照できるオブジェクトがある。
ほとんど単に Object.new したものだが、文字列化すると main
と返すようになっている点だけちょっと違う。
puts self
#=> main
p self
#=> main
puts self.class
#=> Object
>>763 これ知ったとき、spec_helper をどっかの rubygem からコピペして
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
を全ファイルの先頭に自力で書いてた俺超涙目
メソッド内部で print とかされて標準出力に表示されている結果を rspec でチェックすることはできませんか?
putsはObjectがincludeしているKernelのメソッド。 putsを呼ぶ時点のselfにspecからアクセスできるなら ソレ.should_receive(:puts).with(出力) などで可能だと思う。
>>767 $stdout = StringIO.new
で溜め込むとか
>>768 「メソッド内部」と断ってるし普通アクセスできないと思う
>>770 class Greeter
def hello(name)
puts "hello, #{name}"
end
end
このような位置のputsはspecで
@greeter.should_receive(:puts).with('guest')
でテストできるけど、さらに奥深くだと無理だろうってことね。
内部ってどのくらいなん、というのに依存するな
汎用的なのは$stdoutねじ曲げる
>>769 か
これ使ったことあるけど、なんかrspecで書いてる気がしないんだよな
stdout マッチャとか display マッチャとか作るべき
そりゃまあ、らしく書くのに実装の隠蔽は欠かせない
lambda{ @obj.greeting }.should display('hello!') こんな感じ? Proc オブジェクト使うのはこれはこれで微妙に不評なんだよね
>>763 ジュエラーか。ジュエリストのほうがかっこいいな。
最近ご無沙汰なんだが、hoeとかnewgemはもう古いの?
hoe がイヤ過ぎるから newgem や jeweler が出てきたのでは…
hoeとかrubyforgeとかって基本的にgemを作るときに要るもので、 配布物を使う人には無用のものだと思っていたのだけど、 なんで依存しているgemがあるんだろう、という疑問。
778 :
777 :2009/09/09(水) 18:59:06
自己レス。 作者がadd_development_dependencyを知らないだけなのかな。
ある文字列をN文字ずつに分解するのはどうやりますか。 たとえば 'abcdef' を2文字ずつに分解して ["ab", "cd", "ef"] のようにします。 よろしくお願いします。
N = 2 'abcdef'.scan(Regexp.new('.{%d}' % N))
すごく初歩的な質問なのですが、Rubyのドキュメントはどこにあるのでしょうか?皆さんは何を参照していますか? 公式HPを見ましたが、Rubyの文法を簡単に説明しているだけで、標準ライブラリの細かい仕様を調べたい時などには役に立たないと感じました。 たとえばgemにインストールしたライブラリであればgem serverコマンドでRDocリファレンスが見れますが、標準ライブラリのRDocのようなものは無いのでしょうか? バージョンは1.8でも1.9でも構いません。よろしくお願いします。
783 :
781 :2009/09/10(木) 00:50:23
www.ruby-doc.org/core でいいんじゃね?
職場の頭の悪いJava厨が
>>783 と同じようなこと言ってたな
788 :
デフォルトの名無しさん :2009/09/10(木) 02:03:14
Rubyって連結リストみたいなListのデータ構造はないのでしょうか? 配列とハッシュしかみあたらないのですが。。。
>>788 連結リストを何に使うの?
キューやスタックなら配列で十分だぞ(#shift, #unshift, #push, #pop)
Lispの処理系を作るとかいう話なら自分で作るべき
>>779 5文字を2文字ずつとかしたとき余った文字って捨てていいの
>>792 /../n の、n オプションって何?調べたけど見つからない
>>793 str.scan(/..?/)
Nが正の整数で可変なら、
r = '.' + ('.?' * (N-1))
str.scan(Regexp.new(r))
でいける?
うーん。正規表現よくわからん。
どうなんだろうね 端数出ないと仮定してもよさそうだが require 'enumerator' "12345".split(//n).each_slice(2).to_a.map{|a| a.join} ["12", "34", "5"]
>>794 > Ruby は日本語化されているので、$KCODE の値に従って正規表現中の日本語文字を正しく扱います。
> $KCODE = "n" の場合、日本語文字を一切認識せずにバイト列として扱います。これはデフォルトの動作です。
> オプションとして n, e, s, u のいずれかを指定することで
> 正規表現の文字コードを $KCODE の値に関係なく個々の正規表現リテラルに指定することもできます。
irb> $KCODE = 'u'
irb> p 'うんこ'.split(//)
["う", "ん", "こ"]
irb> p 'うんこ'.split(//n)
["\343", "\201", "\206", "\343", "\202", "\223", "\343", "\201", "\223"]
文字列が完全にASCIIの範疇しか使われないならぶっちゃけいらない
ASCII 文字の処理だからと n をつけまくってる人は時々見るが、つけないほうがいい時のほうが多いと思うんだ
thx 文字コードの指定ですか 1.9以降はどうなるんだろ
無指定の場合は対象文字列の encoding と同じだとみなす irb1.9> p "しふとじす".encode('Shift_JIS').split(//) ["??", "??", "??", "??", "??"] irb1.9> p "しふとじす".encode('Shift_JIS').split(//).map{|e| e.encode('UTF-8')} ["し", "ふ", "と", "じ", "す"] split(//n) と同じことをするのはやや手間 irb1.9> p "しふとじす".encode('Shift_JIS').dup.force_encoding('BINARY').split(//) ["\x82", "\xB5", "\x82", "\xD3", "\x82", "\xC6", "\x82", "\xB6", "\x82", "\xB7"] each_byte の結果を文字列にしたほうがたぶん妥当 あるいはなんか凄い人が凄い簡単な手法見せてくれるかもしれない
余った文字も入れたけりゃ N = 2 'abcde'.scan(Regexp.new('.{1,%d}' % N)) => ["ab", "cd", "e"]
>>772 はカスタムマッチャ作ればすぐじゃん、と思ったが
「そのメソッドからの $stdout への出力」というのを限定して取れないことに気づいた
$stdout を曲げてる期間に他の何かからも $stdout に出力があれば混じってしまう
や、「テスト中にはそんなこと起こらない」ということにすればいいんだけども
module MyCustomMatchers class MatcherDisplay def initialize(expected); @expected = expected; end def matches?(proc) old = $stdout.dup; out = StringIO.new $stdout = out; proc.call; $stdout = old out.rewind @actual = out.read return (@actual == @expected) end def failure_message "expected stdout is #{@expected.inspect} but was #{@actual.inspect}" end def negative_failure_message "stdout #{@expected.inspect} should not be same" end end def display(expected) MatcherDisplay.new(expected) end end describe "Test" do include MyCustomMatchers it "say hello" do lambda{print "hello!"}.should display('hello!') end end
あ、$stdout を dup する必要ないや そのへん適当に あとメッセージも適当 failure_message が should が失敗したときのメッセージ negative_failure_message が should_not が失敗したときのメッセージ モジュール作って include 形式にはしなくても構わないがこうしたほうがきっとあとで楽
>>785 >何を言ってるんだおまえは
おまえこそ何を言っているんだ。
Ruby初心者では、782で紹介されたページから、ライブラリのドキュメントまでたどり着けないことがあるという事実がわかったんだから、
初心者でも簡単にたどり着けるようなページデザインにするにはどうしたらいいかを話し合ったほうが建設的ではないか?
たとえば
ttp://doc.okkez.net/static/188/doc/index.html のページを見ると、言語仕様の目次がずらーっと並んでいて、ライブラリのドキュメントへのリンクは後ろのほうにあるだけ。
これだと、
>>783 のような勘違いが生まれても仕方ない。
そうじゃなくて、このページから目次をなくして、
「言語仕様」「組み込みライブラリ」「標準添付ライブラリ」「その他」
の4つの大きなアイコンが並んでいるだけにすれば、
>>783 のような勘違いもなくなると思うんだけど、どうだろうか。
・・・という感じで、初心者が必要なドキュメントにたどり着けるようにするにはどうしたらいいかを話し合ってほしい。
せっかくの初心者スレだし。
>>803 そこはサイトを作ってる奴が○○○ので仕方ないかと。
いいじゃん、ruby-doc.orgの英語ドキュメント充実してるんだから、そこを見れば。
> 初心者でも簡単にたどり着けるようなページデザインにするにはどうしたらいいかを話し合ったほうが建設的ではないか? こんなチラ裏掲示板で話し合っても全く建設的ではありません。 プロジェクトに提案があるならメーリングリストへ。
>>798 unpack("C*").map(&:chr)
>>781 の時点で見つけられないのはわからないでもない
でも回答があったにも関わらず目に付いた部分しか見ずに探そうとしない
>>783 ようなのはただのバカだろ
バカの世話までしていたらキリがない
each_byteのほうが短かった
>>802 テストで標準出力奪うのはやめといたほうが…
テスト自体の出力が混ざるぞ
>>809 おう、今まさに混じってるぞ
何が辛いってうっかりメソッド側で p とかしてオブジェクトの中身確かめようとしたら
標準出力に p の結果が混じってテストが失敗すること
warn obj.inspect で逃げてるが display マッチャのコンセプト自体が間違ってたとしか思えん(w
>>779 BioRubyを入れるとString#stepが拡張されて
require 'bio'
'abcdef'.step(2){|a| puts a}
ab
cd
ef
とできる。割り切れなければ最後に余りが返ってくる。
まあ、これだけのために使うようなライブラリじゃないし、
マルチバイト文字も使えないけど。
>>805 ここだから書き込むやつがいるんじゃないか
わざわざメーリングリストに入って発言なんかするかよ
どうせたいした議論なんかしないんだから。
現状このチラ裏でいろいろ書かれているわけだから それを無視しているメーリングリストの人たちのほうが非建設的
本買えばいいじゃんとしか思わない
本なんて邪道と思ってるやつもいるからな おれには理解できんが
ri にキャッシュ機能を付加したフロントエンドを被せるとそこそこ快適 refe というリファレンサもあることは知ってるけど使ったことないや。 使ってる人いる? インストールめんどくせ、というイメージなんだが
>>817 refe使ってるけど、アーカイブを展開してパス通すだけじゃね?
RubyでHTTP caching proxyを作ろうと思うのですが、Perlの
HTTP::Proxyに 相当するようなライブラリはないでしょうか?
webrickにhttpproxyというのがあるけど、希望に沿えてるかはわからない
rubyのMLってオナニーメールばかりで気持ち悪い
日本語のは、メール自体が少ないから
>>772 newgemでbinつき、rspecつきで出力したのが参考になるかも
binのスクリプトのスペックファイルがこんなのになってる
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
require 'tweetswget/cli'
describe Tweetswget::CLI, "execute" do
before(:each) do
@stdout_io = StringIO.new
Tweetswget::CLI.execute(@stdout_io, [])
@stdout_io.rewind
@stdout = @stdout_io.read
end
it "should print default output" do
@stdout.should =~ /To update this executable/
end
end
あらアプリ名でちゃった。はずかすぃ!
>>824 要は出力対象を差し替え可能にしておけってことじゃね
class C
def initialize(out = $stdout)
@out = out
end
def exec
@out.print "message"
end
end
どうでもいいけど○○wgetとかwget○○とかってセンスないよね Wgetクラスとか作っちゃうのもセンスないよね system("wget #{url}")するよりはマシだけどね
ほぼ全員が作ったことがある黒歴史っぽい感じでセンス無くて恥ずかしいよな OptParserの練習にもなっていいんだぞ、多分
センスっていう言葉を使う奴って語彙が乏しいよね
open-uri.rbに記述されてる説明なんだけど、誰か訳してもらえませんか。 respond toの意味するところが分かりません。 makes possible to open various resources including URIs. If the first argument respond to 'open' method, the method is called with the rest arguments.
>>831 ありがとうございます!なるほどrespond_toメソッドのことでしたか。
ruby(というかプログラミング)特有の言い回しは慣れないと難しいですね。。
下記のような、Item.find(params[:id]).hogehoge という部分だけが違うメソッドがあります。 def move_lower Item.find(params[:id]).move_lower flash[:notice] = '並びかえました。' respond_to do |format| format.html { redirect_to :action => 'index' } format.xml { head :ok } end end def move_higher Item.find(params[:id]).move_higher flash[:notice] = '並びかえました。' respond_to do |format| format.html { redirect_to :action => 'index' } format.xml { head :ok } end end def move_to_bottom : def move_to_top : (うつく)
(うつき) DRYしたくて、この場合、どのような書いたものでしょうか? 例えば、以下のような感じにしたいのですが、Item.find(params[:id]).methodのところがうまく行きません (´・ω・`) def move_lower do_move(:move_lower) end def move_higher do_move(:move_higher) end def move_to_bottom do_move(:move_to_bottom) end def move_to_top do_move(:move_to_top) end def do_move(method) Item.find(params[:id]).method # ←????? flash[:notice] = '並びかえました。' respond_to do |format| format.html { redirect_to :action => 'index' } format.xml { head :ok } end end
>>835 Item.find(params[:id]).__send__(method)
あまりDRYに見えない気が。
>>836 いけますね
Item.find(params[:id]).send(method)
ではダメなんで書馬、
微妙に書き方間違えた、Object由来の__send__とsendの話 class C def send; end # Cの都合に合わせたsendに書き換えてOK # def __send__; end # __send__の再定義はマナー的にNG end Itemの中身は(ほぼ)間違いなくObject由来のオブジェクトだからsendも__send__も使えるけど sendが再定義されたクラスの可能性もあるから Object#sendの機能が使いたいなら__send__のほうが確実ということ
ごめんちょっとテスト -スペース×2 -全角スペース -
失礼しました nbspな書き込みが多かったから2ch側で自動的に置き換えてくれるようになったのか、 と思ったけど違ったみたいだ
send は利用専用 再定義のないプレーンな状態では send が使えてしかるべき object_id と __id__ の関係に近い 個人的には __class__ もあってしかるべきだったと思うのだが あんま __ つきメソッド作ると Python ぽく動作しなければならない気分になるかも
>>842 navi2ch は文頭から始まるスペースを に書き換える
本来はやってはいけないことなんだがまあそれはそれで
845 :
デフォルトの名無しさん :2009/09/11(金) 05:35:48
目茶初心者的な質問です。 RubyのThreadでの引数の役割りって、何ですか? (どういう場面で役立つのか分からない) 関数なら y = f(x) で引数xを元にyが決定されプロット できますが、Threadも左右されるのでしょうか? すいません、ググっても分かりませんでした。
引数なんだからルーチン実行に必要な明示的外部因子だろ という話ではなさそうだな Thread.new の引数の話なら、これはそのまんまだ 説明読んで実際に動かしてみてわからんのなら、きっとまだ早い 1ヵ月後くらいに再読すると結構わかるので今は諦めれ
847 :
833 :2009/09/11(金) 06:34:05
>>836-843 ありがとうございます。
本当だ、Railsだとsend上書きしてたりしますね。
ちょっとした使い分けですね。上書きされるような挙動を許したければsend、
そうでないなら、__send__
使ってみます。ありがとうございました。
メッセンジャー機能として上書きするために残ってるんじゃないぞ 「送る」メソッドとして名称が被ってもいいように __send__ がある たとえばメール用ライブラリでは送信用のメソッドがどう考えても send になるが、 そういうクラスで send を作っても元の send の機能が失われないように __send__ がある 他の Object のメソッドはまあ上書きで消えちゃっても仕方ないかなあと思えるものが多いが、 send の機能だけは特別 この機能が使えない状態のクラスは Ruby としてヤバい
>>844 インライン要素に囲まれた空白文字は空白として保存する、みたいな仕様になっていれば
今ごろ世界中ハッピーだったと思うんだ
851 :
833 :2009/09/11(金) 09:34:56
>>850 あー、ほんとうだ。
Railsのsend(ActiveRecord)と、Socket#sendは全然意図が違いますね。
前者はフックして処理追加みたいな感じですが(superよんでるし)、
後者は、__send__関係ねえw
上の方で教えていただいた事柄は、後者のことですね、たぶん。
別の意味のsendが定義されてる場合、__send__よべと。そりゃそうだ。
Railsの場合は、むしろ、sendとしてsendが呼ばれるのを期待しているみたいなので、
__send__直接でなく、sendを呼んでやらないととおかしなことになりますね。
ソケットにrecvとsendがなかったらアルェーってなるだろう
class クラスのインスタンスを「足し算」することはできませんか? bar = Foo::Bar.new baz = (bar.class + Class.new('Baz')).new p baz.class #=> Foo::Bar::Baz eval するしかないとしたら、なにかより安全な方法はありますか?
何がしたいかわからん。 Foo::Barのスコープ下に可変な名前の新クラスを定義したいという意味?
>>853 できね
文字列としてクラス名を適当に作ってからevalしろ
定数になる書式しか受け取らないevalはあれば楽しいが多分無い
>>854 の意味なら
new_class_name = 'Baz'
Foo::Bar.const_set(new_class_name, Class.new)
ドキュメント表記でFoo::Hogeと書かれている場合のFooとHogeの関係は、 ○HogeはFooの内部クラス ○HogeはFooの内部モジュール ○HogeはFooで定義された定数 のいずれかと思っていれば間違いないでしょうか? ドキュメントを見て自分で調べた限りではこのような使われ方がされているようです。 継承したクラスや、インクルードしたモジュールなどは、Hoge::Fooのような書き方をしていないようなのですが、継承・インクルード用の表記法はあるのでしょうか?
意味的にはそれであってる、実装的には三つ目に集約される というのもクラスもモジュールも、ClassインスタンスやModuleインスタンスが定数に代入されているだけに過ぎないから 継承はC < Object モジュールにお約束はないと思うけど、リファレンスでは継承と同じように書いてるね C < Enumerable < Object
859 :
845 :2009/09/11(金) 15:50:03
>>846 レスどうも。
理解の助けになるようなサンプルがググっても見つかりません。
(手元の本のサンプルはやたら行数が多いし)
適当なサンプルコードってありますか?
860 :
857 :2009/09/11(金) 15:52:25
>>858 ありがとうございます。すっきりしました。
モジュールのインクルードもHoge::Moduleと書きたくなっちゃうけど違うんですね。
公式HP見たら、ご指摘どおり、Array < Enumerable < Object < Kernelとなってました。
Java厨の自分にはObject < Kernelはとっても違和感がw
>>859 x = 1; t = Thread.new(x){ sleep 1; p x }; x += 1; t.join #=> 2
x = 1; t = Thread.new(x){|y| sleep 1; p y }; x += 1; t.join #=> 1
こういう話?
一個目まちがえた x = 1; t = Thread.new{ sleep 1; p x }; x += 1; t.join #=> 2
>>860 公式のどこ?その書き方おかしいだろ
モジュールは何個でもincludeできるから一つの流れでObjectまで辿り着けるわけじゃないし
String < Comparable < Enumerable < Object < Kernel p String.ancestors #=> [String, Enumerable, Comparable, Object, Kernel] 矛盾してるぞ
それは知らん、書いたヤツに聞いてくれw
Comparable < Enumerableはさすがに意味不明だね。無関係のモジュール同士だし。 あまり階層を意識しないでとりあえずincludeしてるモジュールが分かればいいって程度の表記なんじゃない?
ライブラリの「ファイル名の区切り」ってハイフンとアンダースコアとキャメルケースのどれがいい? 既存のHogeというライブラリがあって、それの非公式エクステンションぽい感じなんだけど require 'hoge-ext' require 'hoge_ext' require 'hogeext' require 'hogeExt' どれになるのがそれっぽいかな
>>868 OpenURIにPOST機能をつけた場合
module OpenURIPost
require 'open-uri-post'
これがフツーだと思う
というか、require名はハイフンになるようにライブラリ作れというお達しがどっかに…
>>868 その中ならhogeextかhoge-extかな
個人的にはこっちのほうが良いと思う
require 'hoge/ext'
本家でもないのにディレクトリ切るとな いや、見栄えもいいのはわかるんだが 本家 hoge の下に foo とか bar とかあった場合ちょっと微妙に
実装上は、includeはスーパークラスと自クラスの間にダミーのクラスを 挿入してそこに指定モジュールからメソッドを追加する感じ(てきとう)。 別のモジュールのincludeではその結果出来る階層にさらに別のダミー クラスを挿入するので、内部的にはモジュール(ダミークラス)が線形に 階層を成している。 ドキュメントにそれを意識して反映してるかはシラネ。
ext という別途存在して見慣れてるディレクトリ名なのがよくない require 'hoge/plus' とかそういうのにすれば違和感が
Railsのスレが過疎ってるのでこちらで質問させてください。 ruby script/generate scaffold book title:string author:string これでbooksテーブルを作成するmigrationファイルが出来るのは分かるのですが、 NOT NULL制約やstringの長さの制限などを指定することはできないでしょうか? generate scaffoldでテーブルを作ると全てのカラムでNULL可、文字列は255文字になってしまいます。 仕方なく、作成されたmigrateファイルを修正することで対応していますが、これは正しいやり方でしょうか?
>>874 WebProg板のなら、最終投稿10日だし、別に過疎ってないと思う。
やりかたはそれでOK
全くカラム情報を与えずに作って空のmigrationに一から手で書いても
構わない。
そもそもmodelのgenerator templateの中身は
t.<%= attribute.type %> :<%= attribute.name %>
だし。
876 :
874 :2009/09/11(金) 19:37:46
任意次元の多次元配列を初期化するには、どう書くのがスマート でしょうか? たとえば size = [2, 3, 4] というサイズ指定配列を渡されたら、 a = Array.new(2).map{Array.new(3).map{Array.new(4, 0)}} と等価なことをしたいです。
Rubyには多次元配列は存在しない 単なるネストした配列だ ということで、ネストしてるだけなのでネストしてnewする a = Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}
879 :
デフォルトの名無しさん :2009/09/11(金) 19:53:46
pdfファイルを読み込み表示させようと思って以下のコードを書いたのですがうまくいきません。 open("010.pdf", "r") do |f| f.gets end pdfファイルを読み込むには何か正しい方法があるのでしょうか。 最初はpdftotextでtextファイルに変換してから読み込もうと思ったのですが、 pdftotextを使う方法が分からなかったので直接読み込む方法を探しています。 環境はwindowsです。よろしくお願いします。
PDFファイルをテキストエディタで直接開いてみるとなんかわかるかも というかそのエディタで開くということと同じことしかしてないわけだが
Windows なら open は r ではなく rb だろ そのへんの説明はあるはずなんだが とりあえず gets ではどうにもならんと思うんで 素直に read してその pdftotext なりなんなりで解析してもらえ
>>878 > a = Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}
それじゃダメなので質問してるんですが。
size が必ず [2, 3, 4] と指定されるのでしたら
def foo(size)
return Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}
end
で OK なんでしょうけど、渡される size は [5, 4, 3, 2] だったり
[2, 3, 4, 5, 6, 7] だったりとサイズも次元も可変なのです。
本当にWindowsは糞だな。 Mac OSX最新版のSnow Loepardなら テキスト、画像、動画、PDF、MS Officeをプラグインなしで統一的に扱えるのに。
>>882 Rubyの配列に次元は存在しない
お帰りください
rubyのコレクションフレームワークって配列とハッシュしかないの?
def make_nested_array(*sizes) case sizes.size when 0 [] when 1 Array.new(sizes[0], 0) else Array.new(sizes[0]){ make_nested_array(*sizes[1..-1]) } end end
>>885 Stack、ListはArrayで間に合うだろう。
Queueは、優先度が付かないならArrayを使え。
このへんは大クラス主義。
標準では、他にSetが付いてくるが、組み込みではないので要require。
Treeは標準にはない。
>>886 なるほど。
*size を size に替えてうまく動きました。
ありがとうございました!
890 :
デフォルトの名無しさん :2009/09/11(金) 21:17:37
>>880 テキストエディタで開くと文字化け?してしまいます。
>>881 pdftotext.exeは実行ファイルなのですが、Rubyのスクリプトから使用する方法が分かりません。
何度も申し訳ないのですが、教えて頂けないでしょうか。。
`pdftotext hoge.pdf`?
>>889 横からだけど
make_nested_array([2, 3, 4])
よりは
make_nested_array(2, 3, 4)
のほうが素直というかRuby的だと思う
ary = [2, 3, 4]
で渡された時のことを考えているんだろうけど
make_nested_array(*ary)
とやれば引数を展開できる
>>890 pdftotext.exeは知らないけど、コンソールでできることなら大抵system関数でできる
コマンドラインを関数に渡せばいい
893 :
デフォルトの名無しさん :2009/09/11(金) 21:53:15
system関数でできました。本当にありがとうございました!
rubyでpdfを作るにはどうすればいいですか?
>>894 ruby pdfでググると色々出てくるので好きに選べばいいじゃない
>>894 ぶっちゃけ、基本ただのテキストファイル。仕様どおりに作ればいい。
適当に一部分だけgzipかけてみたりフォント埋め込んでみたり暗号化してみたり
してる部分もあるが、それは全部付加的なものだし。
現実的には、
>>895 。RubyならHaruでいいんじゃね?
RubyでPDFをgrepできたら便利だな 簡単にできるのならやってみようかな
PDFを読んでるわけじゃないぞ PDFをプレーンテキストにする外部プログラムにファイルを渡して 標準入力から受け取って文字列にしてるだけ
中括弧 { } を付けても付けなくても同じ結果になるのですが、これらに違いはあるのでしょうか? def hoge arg p arg end hoge( :a => 1, :b => 2 ) #=> {:a=>1, :b=>2} hoge( {:a => 1, :b => 2} ) #=> {:a=>1, :b=>2}
>>900 の場合は同じ意味。
{}はHashを意味している。
メソッド引数の最後のものがHashである場合に限り、{}を省いてよい。
rubyとpythonはどっちが強いですか?
ruby
たしかにruby厨はpython厨よりしつこいな
実行速度 書きやすさ 読みやすさ インストールのしやすさ ライブラリの使い勝手 リファクタリングの効率 配布 どれをとっても(ry
議論してもどうせ荒れる方向にしか行かないんだから初心者スレでこうゆうネタ出すの止めて
どうせたいていは釣りなんだからボケの腕の見せ所かと
rubyスレはこういうときにもボケで返すセンスのある香具師が多いが pythonスレではまじめにレスするかスルーされるケースが多い よってruby埼京
2chってどこ行ってもごみレスつけるおっさんばっかりになってるな そんなに寂しいのか彼らは
913 :
デフォルトの名無しさん :2009/09/13(日) 12:39:10
すいません質問させてください (@@connections ||= []) << self 上記のコードの @@がクラス変数, << が配列への要素の追記ということはわかったのですが ||= の記号の意味がうまく調べられませんでした どなたか教えていただけないでしょうか?
@@connections = @@connections || []
>>913 ||=は左辺がnil、falseでないときは何もしない
もしnil、falseなら右辺を代入する。
>>913 foo ||= []
は
foo = [] unless foo
とおなじ。
(foo ||= []) << "aaa"
は
foo = [] unless foo
foo << "aaa"
とだいたい同じ。
foo = [] unless defined?(foo) じゃないと動作しないだろ、というツッコミは これはこれで面倒な話でありましてですな
まあ、 irb> (p "ok") if foo NameError: undefined local variable or method `foo' for main :Object from (irb):1 from :0 がエラーで irb> (foo = "ok") if foo nil が OK というのは不条理っちゃ不条理ではある ちなみに (foo = "ok") if foo のあと、 foo は nil を返す
へえ!そんな違いあるのか 初めて知った どういう基準で分かれてるんだろう?
>>920 FAQ にもあるんだが、ローカル変数は、構文解析で代入が見つかるかどうかだけが鍵
実際に(いつ)実行されるかどうかは関係がない
if false
foo = "OK"
end
foo
上記は NameError を起こさないが、以下は foo が NameError を起こす
for e in [1, 2 ,3]
if e == 2 then
foo
else
foo = "OK"
end
end
動作は同一なはずの unless で 代入記述の順番を変えると NameError は起こらない
for 構造はスコープを作らないことに注意
for e in [1, 2 ,3]
unless e == 2 then
foo = "OK"
else
foo
end
end
これ、実際改良する気ないのかな。Rubyの実装もいろいろ出てきてるんだし。 気持ち悪くないのかな。それとも、別に実装の都合ではなくてポリシーなのか?
もともとそういうポリシー。
ブロックでスコープをわけないようにするという話もあったりするので、
遠い未来の2.0あたりでは
>>921 の例も動くようになるかも。
スタックに積まれるローカル変数は明示的に初期化すべしってのはrubyに限ったことじゃない。
926 :
913 :2009/09/13(日) 16:46:38
>>914-919 ご丁寧にありがとうございます。
ソース読んでいてここだけわからなくて困っていたのですが助かりました。
>>925 if ARGV
opt1 = ...
end
opt1_runner(opt1) if defined?(opt1)
これが期待通り動作しないということなんだぜ
たかがローカル変数で
opt1 = nil
if ARGV
opt1 = ...
end
opt1_runner(opt1) if opt1
とか書かなければならないのは流石にバカっぽい
バカっぽいか?すごく素直な書き方でいいと思うけど。
Rubyのifはスコープを作らないだろ いわんとすることはわかるが
そんな小さな労力のために仕様変更してたらぐちゃぐちゃになるわ。 ローカル変数を初期化不要にしてしまうと、フィールド変数を参照してるつもりでスペルミスしてもエラーにならなくなる。 あらゆる場所で意図しないローカル変数が勝手に生成される可能性があるわけで何とも気持ち悪い。 フィールドはオブジェクトの属性という意味合いから初期値があるのは自然だけど、 ローカル変数はちょっと値を保存しておく場所って意味合いしかないから、ソースコードを簡略化するために初期値を設けるってのも設計上美しくない
931 :
デフォルトの名無しさん :2009/09/13(日) 17:37:53
質問です 下記のように@flagを判別して @flagがtrueの場合, testのputs "test"が実行され @flagがnilの場合,testを中断させputsは実行されない という処理を書きたいのですが可能でしょうか? flag_ok?でfalseを返してもいいのですが、 test2,test3と他にも最初にフラグをチェックして@flagがnilの場合、処理を中断したいメソッドが複数あるので、シンプルに書く方法を模索してます @flag = nil def test flag_ok? puts "test" end def test2 flag_ok? puts "test2" end def flag_ok? if @flag return true else return "testの実行を中断させるなにか" end end
@flag = nil def test return if @flag puts "test" end def test2 return if @flag puts "test2" end これじゃなんかダメなん
934 :
931 :2009/09/13(日) 19:08:11
>>932 ありがとうございます参考に直してみました。
ちょっとエラー時に処理をいれたかったのと
うまいこと1行で書きたかったのですが
すっかり if,unlessのこの書き方を失念してました
@flag = nil
def test
return unless flag_ok?
puts "test"
end
def flag_ok?
if @flag
return true
else
puts "処理"
return false
end
end
フィールド変数って何?
>>935 @hoge = 1234
の@hogeのこと。
Rubyだとインスタンス変数かな?
フィールド変数はJava用語だったかも?Delphiでも聞いたな。
C++だとメンバ変数だっけか。
>>935 Rubyで言うインスタンス変数
逆か、他の言語で言うフィールド変数はRubyではインスタンス変数で扱う
Smalltalk流だな、インスタンス変数という呼び名は。
フィールド=インスタンス変数 じゃないぞ フィールド=メンバ変数=インスタンス変数&クラス変数 が正しい
普通にネストしてるクラス定義があります class A class B class C end; end; end A B C を模したモジュール M があります module M module A; def hoge; end module B; def hoge; end module C; def hoge; end end; end; end; end で、M を適度に include して A.new.hoge も B.new.hoge も C.new.hoge も有効にしたいんですが、 次のような書き方しかできないような気がします class A; include M::A class B; include M::A::B class C; include M::A::B::C end; end; end なんというかこー、せっかく模したので「一発」でできるようにしたいのですが、なんかうまい方法ないですか
include M しただけで A::B::C.new.hoge が有効にならないのはなんでとかそういう質問?
>>940
標準機能にはないし、ライブラリもなさそうだから、自分でつくるしかないかなあ。
def get_module_object(name)
mod = Object
name.split(/::/).each do |s|
mod = mod.const_get(s) or raise NameError.new("#{name}: not found.")
end
return mod
end
get_module_object('M::A::B::C')
def include_recursively(klass, namespace)
mod = get_module_object("#{namespace.name}::#{klass.name}")
klass.class_eval { include(mod) } if mod
for name in klass.constants
c = klass.const_get(name)
include_recursively(c, namespace) if c.is_a?(Class)
end
nil
end
include_recursively(A, M::A)
p A.ancestors #=> M::A が含まれている
p A::B.ancestors #=> M::A::B が含まれている
p A::B::C.ancestors #=> M::A::B::C が含まれている
実行効率はあんまりよくないけど許して。
943 :
デフォルトの名無しさん :2009/09/15(火) 01:18:30
StringIOを読むときってrewind必須? 昔のテープメディアみたいでなんかヤなんだけど
>>944 IO自体がテープメディアみたいなもんなんだけどw
to_s で最初から最後までが文字列として返ってこなかったっけか 同名モジュールの include で疑問があったことを思い出した module A def hoge; B.new; end end module B; end class A; include A; end classB; include B; end これで、A.hoge すると モジュール B の new メソッド(無論ない)を呼ぼうとするんだよ 全く以って書いてある通りに動いてるだけなんでございまするが、 module A を作る時点で、include 先から見た B クラスを使うように指定することはできんもんかね
>>946 できない…と思う
include したらたまたま同名の自作クラス B があったためにモジュールが動作しませんとかモジュールの意味ねえよ
モジュール内部で呼ぶ B はモジュールが定義されたときに(モジュール内部に)存在する B だ
:: で始まる「フルパス」で書くしかないな
include されるクラス名が不定なのならお隣クラス B を呼ぶことはそもそもできないので諦めるべし
>>946 module A
def hoge ; self.class.const_get(:B).new ; end
:
949 :
デフォルトの名無しさん :2009/09/15(火) 11:17:23
コード中で、あるライブラリがrequireされているかどうか判断することはできますか? 擬似コードですが、こんな感じで書けたらと思ってます if nkfがrequireされていたら; ・・・ elsif uconvがrequireされていたら; ・・・; end 現在はbeginブロックに入れてNameErrorで判断しています
>>949 そのライブラリが何か定義するなら
defined? NKF
とか。
あと、$LOADED_FEATURES ($") というグローバル変数もあるが、
ファイル名べったり依存になるのであまり推奨したくないな。
require自体がファイル単位を扱うメソッドなんだからファイル名依存になるのは当たり前だろ
952 :
949 :2009/09/15(火) 12:17:34
>>950 ありがとうございます!どちらも気づきませんでした・・・
プログラムを書き換えてみての動作確認もうまくいきました。
>>951 requireされてるかわからないということは自分以外がrequireしたってことだから
ファイル名を知らないし知る必要もないと思う
require 'lib/example'
require './lib/example'
$LOAD_PATH << "lib/"
require 'example'
とりあえず実際問題として、$"ではこれらが区別されるから(requireも二重ロードをする)
>>950 のようなduck type的アプローチのほうがよいかと
Rubyでよく言うダックタイピングってJavaなんかで言うポリモーフィズムのことですか? 実装の違いは別として機能的には。
アドホック
>>954 だいたい合ってる
あえて区別するなら、ポリモーフィズムはクラスC1とC2に何かしらの関係性が産まれる
(スーパークラスが同じとか、インターフェイス/モジュールに同じモノを使うとか)
ダックタイプはメソッドに応答するだけでいい
「共通であるから同じに扱う」と「同じに扱えたから共通だと見なす」という感じ
・・・とは言ったものの、ポリモーフィズム自体にそういう定義はないと思う たぶん、関係性が産まれている場面でばかり使われていたから 関係性がないことを強調した言葉として派生させたのがダックタイプなんじゃないかな
>>953 あと、require だと拡張子が省けるが、$" の中には拡張子込みで
入るので、実装を気にする必要も出てくる。
拡張子込みとは言っても ".rb" か ".so" のどちらかじゃない?
Macだと nkf.bundle になってたりする。
>>961 それだと A::B と解釈されるからダメ
>>960 えーそれってMRI(YARV)? それともRubyCocoaとか?
そもそも
>>946 の設定からしてわかりにくいんだよな、定数かぶりまくってるし
module M
module A; end
module B; end
end
class C
class A; include M::A; end
class B; end
end
こういうことなんだろうか
つーかこの状況だとModule.nesting使えないのか・・・
泥臭い方法以外でC::AのインスタンスからCを得る方法ってあるの?
>>963 $ uname -a
Darwin aries.local 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:55:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_I386 i386 i386 iMac9,1 Darwin
$/usr/bin/ruby -v -rnkf -e 'p $"'
ruby 1.8.6 (2008-08-11 patchlevel 287) [universal-darwin9.0]
["nkf.bundle"]
こっちも一応。 $ /usr/local/bin/ruby -v -e 'p $"' ruby 1.9.2dev (2009-09-08 trunk 24795) [i386-darwin9.8.0] ["enumerator.so", "/usr/local/lib/ruby/1.9.1/i386-darwin9.8.0/enc/encdb.bundle", "/usr/local/lib/ruby/1.9.1/i386-darwin9.8.0/enc/trans/transdb.bundle", "/usr/local/lib/ruby/1.9.1/rubygems.rb" ] -rnkfすると enc/euc_jp.bundle とか混ざって長くなるので省いた。
>>963 基本的にシステム固有のsuffixが使われる。
例外は、ライブラリにlibなどのprefixをつける慣習がないWindows等DOSISH系。
たとえば、libiconvのiconv.dllと拡張ライブラリのiconv.dllが区別つかなく
なるという事態を避けるため、後者を.soにしている。
>>966 なんで enumerator.bundle じゃないんだろう。
requireをロックするため突っ込んである 実際に探索したわけでもないパスだから。
ume
どうしてルビーなの? なんでpythonじゃなくてルビーなの? 開発者が日本人だから?愛国心ってやつ?ねえ?
あなたがPerlでもPHPでもSchemeでもなくPythonを使っているのと同じようなレベルの理由です
>>971 煽りに使えそうな反論が出たらpythonスレに張り付けに行くんだろ?
yes i do
class C def initialize hoge hoge = Array.new hoge end def hoge puts "参照メソッド呼ばれましたん" end def hoge=(arg) puts "代入メソッド呼ばれましたん" @hoge=arg end end C.new これはやっぱり 参照メソッド呼ばれましたん 代入メソッド呼ばれましたん 参照メソッド呼ばれましたん であるべきなんじゃないかと思う今日この頃 っていうかこのへんの動作に依存したスクリプト作るのやめれ紛らわしいわぼけーうおー
Pythonスレから刺客が来たと聞いて
ローカル変数代入だけはちょっと特別なんだよね 代入の形したメソッドがある場合はどっち使うのか注意
識別名がまずローカル変数、でなければインスタンスメソッドと 決定されるのは自然な発想では ただ確かに紛らわしいから、結局 >このへんの動作に依存したスクリプト作るのやめれ じゃなかろうか
間違ってる人がいそうだから注釈するが、
>>975 は代入メソッド1回も呼ばれてないぞ
hoge= というインスタンスメソッドがあっても、hoge=Array.new はローカル変数への代入だ
= つきのインスタンスメソッドを呼びたい場合はレシーバが必須になる
この場合は self をつけて self.hoge=Array.new だな
これに def hoge; @hogeを処理して返す; end が加わってると混迷を増す
ローカル変数の方がメソッドよりスコープ狭いんだから、ローカル変数が最優先で名前解決されるのは当然のように思える。
>>978 呼び出しはそれでいいんだけど、
>>977 も言うようにキモは代入でしょ
ローカル変数とインスタンスメソッドに同じ名前さえ付けなければ
この手の問題は起きないと思ってる人はわりといるはず、つーか俺
>>980 存在するローカル変数と存在するインスタンスメソッドなら同意
まだ存在しないローカル変数と存在するインスタンスメソッドだったら、存在する方が優先に思える
「代入もメソッド呼び出しである」と考えると
変数hogeがないときにself.hogeが呼ばれる動作と対称的ではないのが違和感の原因
「疑わしきはローカル変数と見なす」も理解はできるけどね
まあ世の中にはいろんなバックボーンを持った人がいるから、Rubyのルールが気持ち悪い/気にくわない/落ち着かないという人も大勢いるだろう。 それは仕方ない。そういうもんです、慣れてくださいとお願いするしかない。 ただまあ、代入に関して言えば、 ・foo = 123 は変数への代入 ・obj.foo = 123 は setter メソッドの呼び出し というルールが分かっていれば、そう混乱することはないように思う。 問題は、それを明確に教えていない本やドキュメントのほう。
問題は hoge というインスタンスメソッドが定義されているとき、 hoge(123) とすると hoge メソッドに 123 が渡される hoge! というインスタンスメソッドが定義されているとき、 hoge!(123) とすると hoge! メソッドに 123 が渡される hoge? というインスタンスメソッドが定義されているとき、 hoge?(123) とすると hoge? メソッドに 123 が渡される [] というインスタンスメソッドが定義されているとき、 [](123) とすると [] メソッドに 123 が渡される []= というインスタンスメソッドが定義されているとき、 []=(123) とすると []= メソッドに 123 が渡される とここまで来ておきながら hoge= というインスタンスメソッドが定義されているとき、 hoge=(123) とするとローカル変数 hoge に 123 が代入される になること
着眼点はおもしろいな。 ただ、それは ・代入のほうが優先される というルールで簡単に説明できるんじゃね? これなら十分わかりやすい。
ルヴィーっておもしろいですか?ルヴィー使ってる友達が、開発者が日本人だから誇らしいと言ってました
hoge= が hoge = と書いても動作するのが原因のひとつのような気がしてきた
クラス変数が@@var インスタンス変数が@var なんだから ローカル変数にも命名規約を作ればよかっただけ #varとか 設計者の脳みそが足りなかった
つまり認識の順番が逆なんだよ ・ obj.hoge = や obj.hoge= とあったとき、それは必ず obj のメソッド hoge=() である ・ hoge = や hoge= とあったとき、それは必ず変数 hoge への代入である ・ 末尾に = がついたメソッドはいわゆる関数形式では呼べないので諦めろ こう覚える
ルールの一貫性なんかより普段書いてて使いやすいかのほうが重要
冗長な接頭辞なんかいらんつーの
>>989 ふだん書いてて使いやすいように、一貫したルールが必要なんだろ
マニュアル見ながらだと書きやすいが暗記しにくいルールなんて糞だ
> マニュアル見ながらだと書きやすいが暗記しにくいルールなんて糞だ Perl の $ と @ が脳裏をよぎったw
ruby厨無理スンナ
>>982 や988で十分わかりやすいと思うけどな。
アンチさんたちは何が不満なのかな。
これどっちなんだっけ、と迷うようなコードは書かないのが定石だろうに
今更そんな当たり前のこと言われても
雑魚乙ということで埋め
雑魚乙ということで埋め
雑魚乙ということで埋め
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。