1 :
デフォルトの名無しさん :
2009/10/24(土) 06:18:12 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
(理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に完全対応していないためです。)
1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 を習得すれば将来スムーズに 1.9 系に移行できるでしょう。
関連スレやURLは
>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す
http://www.ruby-lang.org/ja/man/ ・FAQを一応読む
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
バージョンに関するよくある質問 ・Ruby 1.8.5 レンタルサーバ等にいまだに残ってる非安定な古いバージョン 1.8.6 にすらなってない理由はたぶん管理の手抜きなので怒ってよい ・Ruby 1.8.6 過去の長期政権と数の暴力で一大勢力圏を維持中の旧安定版 公開スクリプトはこれでも動作するべきではあるんだがそろそろ 1.8.7 に譲ってくれ ・Ruby 1.8.7 1.9 シリーズの機能をいくつか足したハイブリッドなバージョン、初学者にこそお勧め 1.9 系機能は 1.8.6 では動かないが「えーマジ1.8.6!? 1.8.6が許されるのは小(AA略」と煽ってよい ・Ruby 1.9.0 不安定にして先鋭機能が超満載の開発版バージョンだったもの 1.9.x は本来全てが開発版の呼称だったのだが、事情が変わって(ここ笑うところ)1.9.1 は安定板に ・Ruby 1.9.1 満を持して登場の 1.9 系列安定板(本体は 1.8.6 程度には使えるということになっている) 本体と添付ライブラリの動作は問題がないのだが外部第三者ライブラリが全く追いついていない 初心者を脱した人が外部ライブラリの開発コミュニティに参加してくれたりすることを期待中
おまけ ・Rubygem 0.x 極悪動作をすることで有名なRuby外部ライブラリ利用サポートプログラム群のバージョン このバージョンしかパッケージが存在しないUNIX系ディストリビューションがあって結構問題に しかも「rubygem本体の自己更新機能は殺してるのでパッケージから入れてね」とかほざきやがる パッケージがバージョン 1 より前のものしかない場合はソースからインストールするとよい Rubygem は 1.0 も 1.1 も 1.2 も肝心なとこにバグ持ちなので極力 1.3 などの最新を使うこと
へえ〜。理解した。おつ!
あとこれも前スレから。
105 名前: デフォルトの名無しさん Mail: sage 投稿日: 2009/09/18(金) 16:25:12
初心者にカリカリしている人が多いようなので、再掲しました。
>>1 >■回答する人へ
>相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
>それができないならこないこと(だって初心者スレだもん)。
> ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
> ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
> ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
ここは初心者がバカな質問をすることを大目に見てあげられるマゾヒストのためのスレです。
初心者にカリカリするような人はこないでね。
質問があります。 cucumberという受け入れテストツールを動かしてみているのですが、 コマンドプロンプト上だとwin32consoleをインストールすることで色づけがされるのですが、 UTF-8が化けてしまいます。 そこで、cygwinのターミナルck上で動かそうとしたのですが、今度は色づけがされません。 どういったことを疑うべきでしょうか? cucumber 0.4.2 ruby 1.8.7 Windows Vista SP2
>>12 コマンドプロンプトというか CMD.EXE 上で UTF-8 文字が表示できないのは当たり前
cygwin のターミナルで着色されないのは環境変数 $TERM あたりが実際のターミナルと合ってないのだろう
cucumberがTERM=cygwinに対応してないんだろう
cygwin だからといって TERM が cygwin だとは限らない
ckはcygwinじゃなかったっけ?
いつになったら CMD.EXE 上で UTF-8 表示出来るようになるのかしら
だよな それが解決したら文字コードまわりの問題の殆どが解決する稀瓦斯
ブロックパラメータの引数の数を調べる方法はありますか。 やりたいことは、ブロックの引数の数によって処理を変えることです。 def f() n = ブロックの引数の数 if n <= 0 ... else ... end yield end
なんか色々ツッコミ入れたいが、メソッドの不定数引数は *arg のように受け取る def mes(*arg, &block) if arg.size.zero? then puts "no arg" else arg.each_with_index do |e, i| puts "#{i}: #{e}" end end yield if block end irb> mes('a', 'b') 0: a 1: b irb> mes no arg
>>19 def f
prc = Proc.new
n = prc.arity
p n
end
f{|a,b,c| } #=> 3
詳しくはマニュアルでProcを調べろ
mapやeachが現在何回目のループなのか知る手段ないですか?
>22 with_index
>>23 ぐぐってみたんですが使い方がわからないです
こうではないですよね・・
[1,2].map.with_index do |n,i|
puts i
end
25 :
デフォルトの名無しさん :2009/10/25(日) 00:56:25
ubuntu に ruby をインストールしてみました 端末から ruby と入力すると exitで$(bash)に戻れません どうすれば$(bash)に戻れるのでしょうか? Googleで調べてみたのですが あまりに初歩すぎる疑問のようで 回答を見つけることが出来ませんでした
mapにwith_index っていうのは、標準にはなくて 自分で定義しろということでしょうか?
>>25 Control + D
恐らく、やりたいことに最も近いのは ruby でなく irb を使うこと
ruby はエディタで既に書いたコードを実行するために使うと覚えとこう
>>17 chcp 65001
できるだけって感じだけど
>>27 ほんとだ、$(bash)に戻ってこれた
けど、rubyの人達って Emacs Emacsって書いてありますけど
やっぱりEmacsなんでしょうか?
>>26 .with_index の使い方は
>>24 であってる。(0始まりに注意)
が、バージョンによってはそもそも存在しなかったり、require が必要
だったりするので、バージョンを明示せよ。
>>29 本気でプログラマ目指すとかならemacsとかviも触っておくに越したことはないけど
普通に勉強するならgedit辺りで良いと思うよ
gedit ファイル名 &
でコード書いて、セーブしたらターミナルに戻って
ruby ファイル名
で実行すれば良いんじゃないかな
ファイルに書き起こすまでもないようなコードはirbで直接書いて実行するのも良い
1.9系はeach.with_indexとmap.with_index 1.8.7はeach_with_indexもしくはto_enum.with_index.eachとto_enum.with_index.map 1.8.6だとeach_with_indexと・・・mapはわからん、enumerator.rb呼んでもダメそうだし
そういえば1.8.7のブロックなしmapは扱いが特殊だったな。
Æ &aElig;
1.8.6でインデックス付きmapやるなら、インデックスだけ取ってきて 中身にはイテレータ使わずにループ書いたほうが楽そうだな
>>32 ありがとうございます
ヴァージョンは1.8.6です
each_with_indexの動作確認できました
RubyってPHPやPerlほどwebで使われてないと思うけどなんで。
Perlほど昔から使われてたわけじゃないし、 PHPみたいにWeb専用言語でもないからじゃないか? 使えるアプリもそれほど多くないと思うし
ていうか Ruby のバージョンによらず何事もなければ each_with_index が出るのが普通 これで間に合わない場合にのみほかの手段を講じる
>>32 1.8.6だと
require 'enumerator'
p %w(a b).enum_with_index.map{| v,i | [v,i] }
# => [["a", 0], ["b", 1]]
これってバグになりますか? test = [] test[0] = "aa" test[1] = "bb" test[99] = "cc" t = Array.new(3) t[99]= 88
test = [] test[0] = "aa" test[1] = "bb" test[3] = "cc" t = Array.new(3) t[6]= 6 p test p t #=> ["aa", "bb", nil, "cc"] [nil, nil, nil, nil, nil, nil, 6]
動くのは知ってるんですが 仕様上、この構文が許されてるのかどうかを知りたいんです 特に、Array.newなんて関数が用意されてるのに t = Array.new(3) t[6]= 6 こんなことできるんじゃArray.newの立場はどこへ?
#!/usr/bin/ruby -Ku print "Content-type: text/html\n\n" begin a=0 if a==0 #end puts "OK" rescue Exception => e bt = e.backtrace puts "#{bt.shift}: #{e.message} (#{e.class})<br />" puts bt.map{|s| ">>from #{s}"}.join("<br />") end ブラウザで「Internal Server Error」が表示されます。 エラーを捕捉できないのでしょうか?
>>44 Array.new は関数ではない
揚げ足取りではなく本当に学習的な意味で、それを関数と捉えてはいけない
Array.new は Array クラスの インスタンス(オブジェクト)を生成する
Array オブジェクトの [] メソッドは内部領域にデータを追加する
そんだけ
インストールしてみましたが、シンタックスエラー?は表示されませんでした。
>>45 もシンタックスエラー?以外は捕捉できます。
(eval内は別として)文法エラーは、「実行前」に検出されるもの。 検出する処理さえ実行される前だから、当然捕捉できない。
>>44 ある程度大きな配列で、サイズが事前にわかっているなら
動的にちまちまと拡張するよりは最初にサイズを予約したほうが効率的
なんだけど普通は気にしなくていい
ある程度大きな配列ったって1000や1万では話にならんけどな なおかつインデックスで要素追加をすること前提
>>47 Array オブジェクトの []= メソッドはオブジェクトの内部領域にデータを追加する
だと思う
>>47 newは演算子でしたね
でもスクリプトの場合って
コンパイルするわけじゃないし演算子も関数も違いないような気がしますけど
構文的はOKなんですね
(ちょっと かいたスクリプトが途中で落ちてしまうのでバグの箇所を探しています・・)
>>50 なるほど、やっぱりその程度の使い方なんですね
関数だと考えるとわからなくなるというのは「クラス→インスタンス」モデルを考えれということなんだと思う 呼び名が用語的に間違っているから正しい呼び方をしろという意味ではない、たぶん Array.new は Array クラスのインスタンス(オブジェクト)を返す Array.new(引数つき) は Array オブジェクトを作成し、引数に応じた状態に変更してから返す Arrayオブジェクト[インデックス]=値 は Arrayオブジェクトの []= メソッドに引数 (インデックス, 値) を渡し、 メソッドに規定された状態変更等を行ってから Array オブジェクトを返す 地の文の [] は Array.new を簡単に書けるようにわざわざ組み込まれたもので、Array.new と同じものを返す
インスタンスの状態なり情報を内部領域って言うのはなんか怖いな
クラスもまた、オブジェクト(Classクラスのインスタンス)で表される、ということが JavaとかC++からの連想だとわからないよね。
>>56 C で書かれてる Array や Hash の場合は格納されたデータ本体を外部から触れないからなー
どこに格納されてると説明する?
>>58 まさにそういうCレベルで意識させることに「内部領域」という言葉の怖さを見てとったんだけど
それが目的なら仕方ないとしか
>>48 >インストールしてみましたが、シンタックスエラー?は表示されませんでした。
require 'cgi'
require 'cgi-exception'
eval <<'END_OF_SCRIPT'
# ...
# ここにコードを書く
# ...
END_OF_SCRIPT
というふうにすれば、シンタックスエラーも表示されたりしないかな。
>>59 URI は、インスタンス変数に URI データを格納してるじゃん
Net::HTTP も、インスタンス変数にサーバからのデータを格納してるよな
でも Array とか String とか Hash とか Regexp とかは、インスタンス変数があるわけじゃないよな
>>53 Array.new自体の存在意義を問うてる?
並のユーザーから見たこいつの心髄は、第二引数によるデフォルト値の設定だと思う
> ary = Array.new(3, "hoge")
=> ["hoge", "hoge", "hoge"]
> ary[5]
=> nil
> ary[5] = "fuga"
=> "fuga"
> ary
=> ["hoge", "hoge", "hoge", nil, nil, "fuga"]
まあこれといいHash.newといい、迂闊に触ると火傷するけどね
> ary[0][1] = "a" # ary[0]の二文字目を上書き
> ary
=> ["hage", "hage", "hage", nil, nil, "fuga"]
>>60 スクリプト本体を別ファイルにしてloadなりrequireすれば
問題のスクリプトに触れる前にbeginブロックが実行されるから捕捉できる
begin
load "example.rb"
rescue Exception => e
bt = e.backtrace
puts "#{bt.shift}: #{e.message} (#{e.class})<br />"
puts bt.map{|s| ">>from #{s}"}.join("<br />")
end
あ、CGIだっけ?content-type吐き出すの忘れてた
>>61 Rubyのインスタンス変数は原則プライベートだから
インスタンスがどういう情報の持ち方をしていようが何の興味もないよ
>>45 もしApacheを使ってるなら
Apacheの設定次第で、エラーの内容をログファイルに出すこともできる
どうしても表示されないなら試してみるのもいいかも
66 :
45 :2009/10/25(日) 21:37:48
スクリプト本体を別ファイルにしてloadすれば、 シンタックスエラーが表示されました。 今回はこの方法を使わせていただきたいと思います。 ありがとうございました。
一回 ruby -wc でシンタックスチェックしてみろよ
というか手元に Ruby 実行環境がないのだろ
69 :
デフォルトの名無しさん :2009/10/25(日) 22:56:40
twitterのbotを勉強目的で作ろうとしてるんだが、こんなエラーが発生して対応できない。 誰か解決策を教えてください。twitterのライブラリは入れてあるつもりなのですが。。 エラーメッセージは下です。 # ruby ./aaa.rb./aaa.rb:2:in `require': no such file to load -- twitter (LoadError) from ./aaa.rb:2 環境はこうなっています。 # gem list *** LOCAL GEMS *** actionmailer (2.3.4) actionpack (2.3.4) activerecord (2.3.4) activeresource (2.3.4) activesupport (2.3.4) crack (0.1.4) hoe (2.3.3) httparty (0.4.3) json_pure (1.1.9) mash (0.0.3) oauth (0.3.6) rack (1.0.1) rails (2.3.4) rake (0.8.7) ruby-hmac (0.3.2) rubyforge (2.0.3) twitter (0.6.15)
gem なら require 'rubygems'
71 :
69 :2009/10/25(日) 22:59:32
実行したいソースは↓です。 #require 'ruby gems' require 'twitter' require 'time' USERNAME = 'bot' PASSWORD = '!@#QWE' client = Twitter::Base.new( Twitter::HTTPAuth.new( USERNAME, PASSWORD )) client.update( Time.now)
72 :
69 :2009/10/25(日) 23:02:09
参考に観てたblogのソースだと空白が仕込まれてたみたいです。。
>>70 さん ありがとございました。
require 'rubygems' は書くべきではない、という指摘もあったな。 1.9なら不要だし、1.8では、ない場合はどうせエラーにするだけだし、 あるならRUBYOPTにセットしとけ、みたいな感じ。
>>73 君は使いもしないライブラリを読み込むべきだと考えるのかね
RUBYOPT は自分のために自分の環境で設定するもの 他人に強制したり期待したりするものではない
RUBYOPT構想は結局失敗だったな
そもそも環境変数自体が失敗
使いもしないライブラリとやらが組み込まれてやんのw
うるせぇエビフライぶつけんぞ
一度でも読み込んだライブラリは二度読み込まないようにすればいいのではないだろうか
Ruby-mswin32版の1.9.1をインストールしたら gemが入ってたので、ssleay32.dllとzlib.dllをbinフォルダにいれて パスとおして gem update --system ってコマンド打ったら Updating RubyGems Updating rubygems-update Successfully installed rubygems-update-1.3.5 :0:Warning: Gem::SourceIndex#search support for String patterns is deprecated Updating RubyGems to 1.3.5 Installing RubyGems 1.3.5 D:/ruby-1.9.1-p0-i386-mswin32/lib/ruby/gems/1.9.1/gems/rubygems-update-1.3.5/lib /rubygems/config_file.rb:39:in `new': wrong number of arguments (5 for 4) (Argum entError) from D:/ruby-1.9.1-p0-i386-mswin32/lib/ruby/gems/1.9.1/gems/rubygems-upd ate-1.3.5/lib/rubygems/config_file.rb:39:in `<class:ConfigFile>' from D:/ruby-1.9.1-p0-i386-mswin32/lib/ruby/gems/1.9.1/gems/rubygems-upd ate-1.3.5/lib/rubygems/config_file.rb:12:in `<top (required)>' from D:/ruby-1.9.1-p0-i386-mswin32/lib/ruby/gems/1.9.1/gems/rubygems-upd ate-1.3.5/lib/rubygems/gem_runner.rb:8:in `require' from D:/ruby-1.9.1-p0-i386-mswin32/lib/ruby/gems/1.9.1/gems/rubygems-upd ate-1.3.5/lib/rubygems/gem_runner.rb:8:in `<top (required)>' from setup.rb:25:in `require' from setup.rb:25:in `<main>' ってかんじで怒られた、どっか間違ったか?
p0で失敗しても文句は言えんな
うひょう、ruby1.9.1-p0 と ruby1.9.1-p243 で Win32API の initialize の引数の数が違う p0 def initialize(dllname, func, import, export = "0") p243 def initialize(dllname, func, import, export = "0", *rest) rubygems-update-1.3.5 の記述 if RUBY_VERSION > '1.9' then SHGetFolderPath = Win32API.new 'shell32', 'SHGetFolderPath', 'PLPLP', 'L', :stdcall SHGetFolderPath.call nil, CSIDL_COMMON_APPDATA, nil, 1, path else SHGetFolderPath = Win32API.new 'shell32', 'SHGetFolderPath', 'LLLLP', 'L' SHGetFolderPath.call 0, CSIDL_COMMON_APPDATA, 0, 1, path
Ruby1.9.1 の Windows 用でそれをするとはいろいろな意味でチャレンジャーというか煽り屋というか
そんなんただのラブレターだろ 「いますぐRuby1.9.1の最新版パッチのWindowsバイナリを公開しろ、 さもなくば基幹的デファクトスタンダードライブラリのアップデート不能を以ってRubyの価値を減じる」 というラブコール
最新版のWindowsバイナリー! 早く来てくれー! 俺もコンパイルに成功すれば、Windowsバイナリ公開したいのに make test-allがなかなか通らない…… メンテナの方々はどんな作業をやってるんだろう
89 :
12 :2009/10/26(月) 10:14:19
>>13-18 Thanks
rspecはちゃんとck(cygwin)でも色分けできるんですけどね・・・。
TERMはcygwinでした。export TERM=xtermとかにもしてみたけど駄目ですタ(この辺よく理解してないです)
>>17 ついでにPower Shellも入れてみたんですが、UTF-8対応して中田 orz
nkfでUTF-16にしても化けるし意味わからんちん
とりあえず ruby が糞だということは良く伝わりました 本当にありがとうございました
ラブレターなら直接相手に言わないと伝わらないんじゃないか
>>91 リア充は帰れ
ラブレターってのは
「○○って△△さんのこと好きなんだって」
「えーうそー△△ちゃん可哀想〜」
みたいに周りからじっくり攻めていくのが正しい姿
明らかに周りからも祝福されてねーじゃねーか
なにごとも一度でうまくいくことはそうそうないよ 突然話を振るよりも事前のネゴとコネと日頃のコミュニケーションが大事
>>92 > 「えーうそー△△ちゃん可哀想〜」
やめろ
クソワラタwww
ruby1.8.7をcheckinstallでRPMパッケージを作成してインストールしたのですが、 ri -cコマンドを打っても標準ライブラリのクラスが表示されません。(Railsのクラスのみ表示される) ri GCと打ってもNothing known about GCと出力されるのです。 これはrubyのriドキュメントがインストールされてないということでしょうか? RPMパッケージでインストールせずにconfigureでオプション付けたりしないといけないのかな。
>>97 checkinstallはよくわからないけど、自前でコンパイルするときは
./configure
make
sudo make install
sudo make install-doc # ドキュメントのインストール
が必要だった気がする
質問です。Mershall使ってインスタンスの状態を保存しているのですが 一度インスタンスをnewしてdumpした後、その後オブジェクトを変更して 追加されたor削除されたクラス変数を検知して初期化したいです どのようにしたらいいでしょうか 以下のようなソースです class DataObj attr_accessor :cnt def initizalize @cnt=0 end end class SaveData attr_accessor :data def initialize(file_name) load(file_name) end def load(file_name) if File.exist?(file_name) @data = File.open(file_name, "rb"){|f| Marshal.load(f) } else @data= DataObj.new() end end def save File.open("test.dat", "wb"){|f| Marshal.dump(@data, f) } end end
よーわからんが、Marshalはオブジェクト全体の復元しかできない 復元してからオブジェクトが同一かどうかチェックするしかないな
>>100 そうですね、Marshalだとかそういうライブラリは、この際あまり関係なかったですね
保存時のオブジェクトが復元時のインスタンスのオブジェクトと違う場合を許容したい場合は
どのような処理をすればいいでしょうか、ということみたいです
クラス変数が一つ一つ存在するかチェックして、なければ初期化、しかないでしょうか
イメージとしては クラス変数にし対して obj.each{|i| i=0 if !i.exist? }
という配列処理っぽいことがやりたいです (もちろん配列じゃないのでこの操作は不適ですが)
クラス変数は @@ で始まる @ で始まるのはインスタンス変数 初期化の意味がわからない 特定の条件の場合にオブジェクトを同一とみなして欲しいというときは 適宜 == メソッドを再定義して new == old を行う class C def initialize(params=nil); @params=params; end def ==(other) self.instance_variables.all? do |e| self.instance_variable_get(e) == other.instance_variable_get(e) end end end c1 = C.new('a') c2 = C.new('b') p c1 == c2 #=> false c3 = C.new('a') p c1 == c3 #=> true ('a' == 'a' が true なので) default = C.new c4 = C.new [c1, c2, c3, c4].each do |c| if c == default then puts 'default!' else puts 'modified' end end # => modified, modified, modified, default!
>>101 >クラス変数が一つ一つ存在するかチェックして、なければ初期化、しかないでしょうか
よーわからんけど、オブジェクトにバージョン番号をつける方法じゃだめかな。
バージョン番号が違っていれば初期化、とか。
===
質問です。 1. プラットフォームがwindowsかどうかを判定する方法は、どうするのがいちばんいいでしょうか。 RUBY_PLATFORM をチェックするのが王道だと思いますが、そのチェックの仕方で悩んでいます。 2. windowではバイナリファイルの読み書きにはFile.open(file, 'rb')のように'b'をつけないといけませんが、 これはcygwinでも同じでしょうか。 ('b'が必要なプラットフォームが何かを知ろうとしています)
fopenの仕様を読みましょう
皆さんありがとうございます
・・・恥ずかしながらインスタンス変数とクラス変数を勘違いしていました
>>103 氏のいうようなバージョン管理でやろうとすると
class DataObj
attr_accessor :ver,:a,:b,:c
def initialize(obj) #
@ver=0
@a,@b,@c=0,1,2
end
end
class DataObj_1 < DataObj
attr_accessor :d,:e,:f # 変数を追加
def initialize(obj)
super
@ver=1
@a,@b,@c=obj.a,obj.b,obj.c
@d,@e,@f=3,4,5
end
end
current_version=1
a=load("save.dat")
a=Data_Obj_1 if a.ver == current_version # あるいは a === DataObj_1 かな?
ということでやりたいことは、できそうです スマートな方法とは言い難いですが・・・
すいません、最後は a.ver が 0 のとき if a.ver < current_version の間違いですね
>>109 その記事にある「Win32API.soがrequireできるかどうか」は、
1.9だと全部ダメとか、1.8でもWINE環境でrequireできちゃう
とかあるので注意。
2の方は、いわゆるDOSISHなプラットフォームが該当する。
具体的にはcygwin以外のWindows、DOS(djgpp)、
x68000(human68k)、OS/2(emx)
自動で判断するぶんには RUBY_VERSION =~ /mswin|mingw/ でいいんじゃね クラス変数とかに結果入れておいてユーザーが変更可能にしておくとかすれば喜ばれそう
バイナリ扱う時に環境判断せずに「とりあえずbつけとけ」ではだめなんだっけ?
ミリ秒の差が数千万円になるようなエッジな環境では命取り
>>107 Marshalで保存したオブジェクトは自分のクラスを記録してるから
別のクラスのインスタンスとして復元する事は出来ない
Hashを中間データとして使う方法をすすめる
ついでにmarshal_dumpとmarshal_loadについて調べておくといい
質問します。 ディレクトリ内にあるhtmlファイルの読み込みで、Data/a/1.htmlを読み込ませたあと Data/b/1.html→Data/c/1.html・・・とずらずらとディレクトリ違いの同じ名前のhtmlファイルを 読み込ませるにはどうしたらいいですか?
それに必要なのはなんだと思う? というようなとこから考えて欲しいと思った とりあえずいちばん簡単なの dirs = ['a', 'b', 'c', 'd', 'e', 'f', ...] dirs.each do |dir| File.open("#{Data/#{dir}}/1.html"){|f| f.read} end
>>117 Dir.glob("Data/*/1.html") do |file| ... end
120 :
117 :2009/10/27(火) 11:24:16
即レスどうもです! とても参考になります! ちょっくら試してみます。 ありがとうございました!
しつもーん! どこからも参照されなくなったオブジェクトは GC によって破棄されるだよね? loop { /正規表現オブジェクト/ } この場合 /正規表現オブジェクト/ はループのたびに生成されるの?
122 :
中田 :2009/10/27(火) 22:59:18
>>89 Power ShellのUTF-8対応なんてしらん
>>121 いいえ、固定の正規表現リテラルはパース時にチェックされ、スクリプト内で1回だけ生成され保持参照されます
ただし、変数を #{ } などで含んでいる場合は毎回変数を参照して新規作成される
最初の1回だけにしたい場合は //o と o オプションをつける
この理屈で言うと、/re/ がたくさんあるとメモリ食う
>>12 cygwin1.5系や素のcmd.exeは未だにCP932だから、UTF-8はそのままだと表示できません。
考えられる方法はだいたい以下の通り。
(1)素のcmd.exeにて、nkfでCP932に変換して表示
(2)cmd.exe にて chcp 65001 によって UTF-8 モードにして UTF-8 を表示 (挙動妖しい)
(3)cygwin 1.5 にて、nkf で CP932 に変換して表示
(4)cygwin 1.7 (デフォルト UTF-8) にて UTF-8 で表示 (開発途上)
まぁ、どれもろくでもないんで、cucumberだったらHTMLにでも書き出して、
ブラウザで見た方がいいんじゃないですかね。
そーいえば、PowerShellはシェルとしてはcmd.exeとしては同レベルです。 コネがある方がいらっしゃいましたら、ちゃんとUnicode通るようになんとかしてやってください
WriteConsoleWでがんばってください
"123.6"をdecimalの123.6に変換するメソッド(例えばto_iのようなもの)はないでしょうか?
decimalではなくてfloatでした。すいません。
131 :
12 :2009/10/28(水) 09:59:20
132 :
12 :2009/10/28(水) 10:00:08
誤爆
133 :
12 :2009/10/28(水) 12:03:40
変なもん誤爆しちゃった…
>>12 の件ですが、結論から言いますと、
--color を引数に明示的に指定することで解決しました。
コマンドプロンプトでは色づけされる、んならすでに指定してたんじゃないんかい!と言われそうなのですが、
実際には指定しておらず、
.featureファイルに以下の記述をして「i18nで日本語を使う」とcucumberに知らせていた場合にだけ、
何故かコマンドプロンプトのみ色付けされるようでした。
# language: ja
--colorの指定は、ルートディレクトリにcucumber.ymlファイルを置いて、
default: features -f pretty --color -l ja
のように記述することで、デフォルトの引数を指定できました。
とりあえず、解決ということでありがとうございました。
134 :
12 :2009/10/28(水) 12:04:50
連投スマソ
>>125 ありがとうございます。
もっとロクでもない方法(?)として、以前はRUBY_PLATFORMがwin32でTERMがnilのときだけ、
$stdout.writeでSJISにnkfで変換する方法も使ってました。
Railsスレあたりに投下した覚えがあるので検索すればでてくるかも。
cygwinはUTF-8化用のDLLを入れてあり、ターミナルソフトのck.exeでUTF-8を表示できるのですが、
cygwin上でwin32のautotest使うと、テストが再実行しようとCtrl+Cを押すと何故かされず、即終了してしまうんですよね。
最近は、coLinuxのUbuntuを入れて、かなり普通にあたりまえに動くしUTF-8も問題ないので、それでもいいか、という気がしています…。
cygwinのttyはWindowsのコンソールとは見なされないからね。 それはもうcygwinとmswin32を組み合わせるのが悪いとしか言いようがない。
拡張モジュールの中で struct FRAME や struct RNode を触りたいんですけど、ruby.hには含まれていなくて困っています。 今はnode.cから extern strct RNode { ... }; を自分のソースにコピーしていますが、 もっといい方法があると思うので、ぜひ教えてください。
rbbrのツリーってタブおしたら落ちない?再現率100%なんだけど
>>136 node.cって何?
1.8ならenv.h、node.hが普通にあるはず。
1.9なら方法はないので諦めてください。
拡張ライブラリのソースを ext/foo/foo.c に置いたら、extconf.rb も同じ場所に置かないといけない? それともextやREADMEと同じ場所においておくもの?
gem なら Rakefile に gem.extensions = 'ext/extconf.rb' とか直接書く
>>139 基本的には同じところに置かないといけない。
別のところにも置くことはできるけど、それを聞いてくるということは、説明してもしかたなさそう。
>>136 何のために?
99%方針が間違ってる。
htmlファイルの読み込みについてなんですが、 マッチングでマッチした文字列以降を表示させるにはどうすればいいですか?
HTML あんま関係ないな 簡単なのは「キーとなる文字列の直後から必要な別のキーの直前まで」をマッチさせること $1 とか $2 とかの正規表現の勉強をするといい # <title></title>で囲まれた文字列 /<title.+?>(.+?)<\/title>/i =~ html puts $1
146 :
143 :2009/10/29(木) 17:26:50
フォームから入力されたユーザー名とパスワードで Kerberos認証をしたいのですが何か方法はありますでしょうか? (ApacheのBasic認証にKerberosを利用するのではなく、 Rubyで作成したCGIの任意の箇所で認証処理をしたいです。) ライブラリ等あればいいのですが…。 Kerberos認証を行うシェルを作成して、 CGIからユーザー名とパスワードを渡して実行させるしかないですかね?
質問 Time#to_i の秒数って、時差というかタイムゾーンとかどうなってますか?
そのオブジェクトが地方時か協定世界時かにかかわりなく、 to_iが返すのはUnixタイム。
あのへんは UTC とはなんぞやということを外部で習ってるということ前提だからな Ruby で初めて意識したという人にとってはやや不親切だ
to_i で整数にして計算して at で戻すと一瞬わけわからんことに
教祖がデビアン住人だしな。世界の外の事は知らない。
教祖とか宗教とかモルモンとかそういう単語の入ったレスは読み飛ばしてOK NGにしておいても一向に損をしないことを保証する
Pentium4(HT)のWindowsXP環境で CPUを100%使い切って計算しようとおもったら、マルチスレッド対応にしないとだめかな? タスクマネージャーみたら、なんかCPUに余力が有るみたいなんだが・・・
複数プロセス同時に動かすのは?
>>157 HTは、1コアを2コアに見せかける技術だから、1コアをもし使いきっているなら、
タスクマネージャでどう表示されようが、100パーセント使い切ることになるように思うけど、どうだろう。
ファイルやネットワークの入出力がある場合は100パーセントになりにくいけど、
非同期I/Oを使って頑張れば100になるんじゃないかなー。
最近のCPUは2コアが普通だから、158のように複数プロセス起動しないとだめだろうね。
そんなことまで考えてプログラミングしてるのか すごいなお前ら
"begin a,b,a,a,b end" のような、中身が繰り返しているような文字列のマッチはどんなふうにするのがいいでしょうか? /begin ((a|b),)*(a|b) end/ とすればできましたが、2回同じこと(a|b)を書いているのがちょっと気になります あと、できれば繰り返しの部分を$1,$2,$3・・・のようにあとで取得したいのですが、可能でしょうか?
>>161 >2回同じこと(a|b)を書いているのがちょっと気になります
正規表現なら我慢して書くしかないように思う。
>繰り返しの部分を$1,$2,$3・・・のようにあとで取得したい
マッチする個数がわからないと難しい。
/begin ((a|b)(,(a|b))*) end/
として、
$1.split(/,/)
とするぐらいか?
あと (a|b) は、もしほんとにaとbを使うだけなら[ab]のほうがいい。
/begin ([ab](,[ab])*) end/
ここはRubyスレなので、Rubyの正規表現なら、という話なら、 (?<名前>任意の表現) と \g<名前> の組み合わせでできる。 /begin ((?foo<(a|b)>),)*\g<foo> end/
Rubyの正規表現と称して
>>163 がOniguruma実装限定の正規表現持ち出してきたのが笑える
begin 〜 end だけ抽出しておいてそれに (a|b) の scan かけるんじゃだめなん
>>164 1.9ならOnigurumaが標準だろ
そんな寝言は1.8.7を撲滅してからほざくがよいぞ それまでは両バージョン用併記か注釈で対応バージョン明記
スレとしては 1.8.7 が推奨バージョンなんだから、 1.9 限定動作は「1.9.1 だとこれで一発」みたいなコメントはつけとくべきかもな
普段く1.9の質問したら、氏ね、1.8使えと煽るくせに、 正規表現は1.9で書き込むとか、 ここの住人はダブルスタンダードだな、おい
1.9でレスしてもいいんだがそうと明記すべきだぬ
いつの話だよ さすがに今1.9を使うなって奴はいないだろ
>>169 だって君の言う「ここの住人」って、一人しか居ないわけでもなければ、
まったく同じ考え方をする集団ってわけでもないもの。
ダブルスタンダード認定は、前者と後者が同じ人間によって書き込まれたことを
確認してからでないと。
初心者が使用すべきものと熟練者が使用して便利なものとは違うということをいまさら講釈しないといかんのか
1.9はsp2出るまで町だな。
1.9.3のこと?
2.0マダー
>>168 >1.9 限定動作は「1.9.1 だとこれで一発」みたいなコメントはつけとくべきかもな
だな。1.8.7からの新機能の場合もその旨書いておいてほしいよね。
今度から
>>1 に追加しといてもらおう。
>>171 >いつの話だよ
>さすがに今1.9を使うなって奴はいないだろ
おまえはまず
>>1 を声だして100回読め
>>158-159 繰り返しの計算処理なんだわ
具体的には、ニューラルネットの実装やってる
はんぱない回数の計算が学習には必要なんだけど
1プロセスだと、スレッド分けしても、複数CPUは使ってくれないってことかな?
だとすると、プロセス間通信とかを眼中にいれて設計しないとダメってことかな?
ってことは、向かうところはdRubyあたり?
ほう、膨大な計算量を必要とする分野にも進出してるんだなあ
>>180 実用とか研究とかじゃなくて趣味だけどね。
Rubyでやってもいいんじゃない?ってかんじで
Rubyの入門書では、サンプルプログラムの出力を大抵以下のように書いてます。 puts 'Hello World!' ですがたまに以下のように書き方も見かけます。 $stdout.puts 'Hello World!' どっちも正しいと思いますが行儀の良い書き方という意味では後者になるのですか?
意味不明。内部でやってることは同じだし後者には何のメリットも無い。
printf("Hello World\n");と fprintf(stdout,"Hello World\n");の違いみたいなもんだぞ 簡略できるようにしてあるのにあえて冗長に書く必要はないと思う
冗長に書く意味があることはありうる が、これに限ってはまず無いだろうな 前者の関数的メソッド puts の出力先を捻じ曲げるためには $stdout をいじるしかないわけだが それをすると後者の $stdout.puts も捻じ曲がるんで意味がない Ruby における 関数的メソッド puts と $stdout は不可分だ(C の puts を知ってると引っかかるかも) もしなんらかの気の迷いで関数的メソッド puts の出力先の $stdout が標準出力以外になってるなら それは putserr とか putsfile とかなんかメソッドを新たに作るべき むしろ後者を書かれるとがっかりだ むしろそのサイトなり解説書なり晒せ
バッチファイルの作成を自動化できないものかと思い、eruby がつかえそうだと思いました。 REM ******************************************* REM * 作成者:ビル・ゲイツ(マイクロソフト) * REM ******************************************* のようなファイルをつくりたいのですが、 REM ******************************************* REM * 作成者:<%=PERSON%>(<%=COMPANY>) * REM ******************************************* と定義して、行の末尾の '*' の位置を変えないことってできますか?
つか $stdout なら write すべきだと思うんだが $stdout が指してるオブジェクトに puts というインスタンスメソッドが定義されてる可能性はそれほど高くない
>>187 それはputsに応答しないオブジェクトを$stdoutに入れたヤツが悪くないか?
STDOUTがIOのインスタンスなんだし、IOやそのサブクラスのインスタンスであるか
相応のduck typingができることを期待するのは当然だと
実際に期待できない例にはどんなのがある?
$stdoutっていずれ廃止になるんだろ? なるべく使わない方がいいんじゃねーの
$stderrなら警告メッセージのテストで使うことあるな。 begin class << (stderr = "") alias write << end # テスト $stderr, stderr = stderr, $stderr ensure $stderr, stderr = stderr, $stderr assert_match(/.../, stderr) end
>>190 廃止された$defoutと混同してないか?
>>190 が代わりに何を使う気だったのかがちょっと気になる
194 :
182 :2009/11/03(火) 18:12:54
たくさんのレスありがとうございます。勉強になりました。
公式も見てみましたが、
単にputsとした場合はKernelモジュールのputsを指し、
そのputsはデフォルトで$stdoutに対して出力をするようですね。
やっぱり冗長なだけなようですね。
>>187 >むしろ後者を書かれるとがっかりだ
>むしろそのサイトなり解説書なり晒せ
具体的には、「JavaプログラマのためのRuby入門」という本の初っ端の例文が
$stdout.puts 'hello world !'.upcase
となっていました。
著者のartonさんはコミッタですよね?
195 :
182 :2009/11/03(火) 18:13:57
>>194 それはJavaのSystem.out.printlnになじんだ者が類推しやすいように
そう書いてあるんじゃあないか?
197 :
182 :2009/11/03(火) 18:36:50
おおなるほど、そういうことだったのかな…。
その本は読んでないけど、読んだ者が混乱するような記述なら困りものだな 後ろの章を読めばわかるのかなとは思うけど
モジュールの場所を知るコマンドはありますか? perlでいう perldoc -l のような。
>>199 ri
refe
他にもなんかあったような気がするけど忘れた
>>199 gem の場合は gem which
$ gem which nokogiri
(checking gem nokogiri-1.3.3 for nokogiri)
/home/me/.gem/ruby/1.8/gems/nokogiri-1.3.3/lib/nokogiri.rb
標準ライブラリの場所を探す方法はあれば知りたい
いちいち「/usr …のどこだっけ」と試行錯誤するのは面倒
>>199 gem whichはgem以外にも使えたはず
ほんとだ知らなかった いいこときいた
$ gem which uri /usr/lib/ruby/1.8/uri.rb ほほう String とか Regexp とか rb のファイルになってないものは駄目っぽいな
ライブラリもいけるみたいだな。
$ gem which Readline
/usr/local/lib/ruby/1.9.1/x86_64-darwin10.0.0/Readline.bundle
>>204 StringやRegexpでどのファイルに出てきて欲しいんだw
>>186 >と定義して、行の末尾の '*' の位置を変えないことってできますか?
<%= str = "#{person} (#{company)" %>
REM * 作成者:<%= '%-50s' % str %> *
とするしかない。
間違えた。 <% str = "#{person} (#{company)" %> REM * 作成者:<%= '%-50s' % str %> *
Rubyの文字列は "hello"と'hello'のように書けますが、皆さんはどちらをメインに使っていますか? もちろん二つの書き方には違いがあることは理解してますが、 多くのケースではどちらの書き方でも可なので、そういう場合にどちらの書き方をすべきか迷っています。 個人的にはシングルクォートをメインにして、"my name is #{name}"のような変数展開を使う場合のみダブルクォーテーションにしています。 というのもHTMLと一緒にrubyを使うことが多く、HTMLタグの値にダブルクォーテーションを使うからです。 ただ入門書やネットに転がってるサンプルなどを見ると大抵ダブルクウォーテーションのようです。 CやJavaなどの習慣でダブルを使う人が多いのでしょうか?あるいは他にメリットがあったりしますか?
そもそもとして、" " でも ' ' でも処理負荷的にはたいして変わらない 文字列を数まんことか大量に使用すれば若干違うかもしれんが、たぶん他の部分チューニングしたほうが速い よって、それ以外が効いてくることになる で、まあ、" " が人気があるのは 変数展開を入れようとしたときにクオート部分をわざわざ書き換えなくてもいいとか \n とかがそのまま利用できて面倒がないとか 大部分のフォントで '' の文字見栄え的な安定性が低くて使っててガッカリだからとか そういう理由だと思う 'hello\nworld' と書いてそのまま \n が表示されて「ん?」となるのは一度や二度ではない
俺は両方使い分けてるな 別にダブルクォートで統一してもいいとは思うんだけど 最近、なんとなくシングルクォートの方がきれいに見えるようになった あとシングルクォートだと「ここでは変数展開をしません」という宣言にもなる
212 :
209 :2009/11/04(水) 10:28:08
>>210 おおなるほど…分かりやすい説明ありがとうございます。
それだけ例を示されると確かにダブルクウォーテーションのほうが理にかなってますね。
>>211 ダブルクォートを最終的にシングルクォートに書き換えることはよくある
それはやっぱり意思表示だな
214 :
209 :2009/11/04(水) 10:32:10
>>211 ありがとうございます。
>あとシングルクォートだと「ここでは変数展開をしません」という宣言にもなる
これは自分も思っていました。
変数展開が必要になった時にダブルクウォーテーションを使った方が目的がはっきりするというか。
215 :
209 :2009/11/04(水) 10:42:19
ついでにRailがgenerateで吐くコードを調べてみました。 シングルクォート flash[:notice] = 'Profile was successfully created.' <%= link_to 'New profile', new_profile_path %> ダブルクォート format.html { render :action => "new" } どっちも使ってる…。どういう基準で分けてるのかさっぱり分からない。 ただ適当なのか、何かちゃんとした理由があるのかな。
アトリビュートとみなせる(小さな)文字列はダブルクォートであることが多い ハッシュのキーとか値とか、配列の短い文字列とか あるいは生成されて埋め込まれた文字列とか irb> 1.upto(10).to_a.map{|e| e.to_s} ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"] ←この部分をコピペ 深い意味は何もない 打ってる途中で 「あーシングルクォートでよかったなーと思ったが修正面倒なのでこのままダブルで閉じる未来の俺訂正よろしく」 とか普通なので気にしてたら禿げるぞ
String#inspect が吐く文字列がダブルクオートというのは意外と 強い動機になるよね。
>>209 >個人的にはシングルクォートをメインにして、"my name is #{name}"のような変数展開を使う場合のみダブルクォーテーションにしています。
このルールでいいと思う。あとは ¥n をいれるときとか。
そのルールに何の意味も無いだろ 面倒だし両方の表記が入り乱れることになるだけ なんでダブルクウォーテーションだけで済ませるのが嫌なんだ?
変数(というか、式)展開やバックスラッシュ記法の有効化は、すこし機能が強すぎる その機能を使用しないのなら、そもそも機能が有効になっていないほうが好ましい めんどいからダブルでいーじゃん、というのでももちろん構わないし スクリプトに直接リテラルで書くぶんには実際上の問題は何もないが、 慎重にシングルとダブルを使い分けるという姿勢は賞賛されるべき
>>219 >なんでダブルクウォーテーションだけで済ませるのが嫌なんだ?
べつに嫌いとまでだれも言ってないけど。
>>213 が書いたように、シングルクォートを使うことで、
式展開もなにもありませんという意思表示をしているだけ。
なんでこんな曲解するやつがいるんだろうね。
Railsマンセーな俺は
>>215 >>216 辺りを見てシングルを主に使っていこうと決めた
アトリビュートというかシンボルに置き換えられるのようなケースではダブルを使ってる気がする
Windows環境だとパス区切りがバックスラッシュな関係で
文字としてのバックスラッシュを扱いたい場合は多いな
>>210 とは逆に、バックスラッシュが解釈されるせいで「ん?」と思う場面のが多い
考え方は
>>220 に同感だけど、職場ではダブルクォートで統一されてる。
ネットで拾うサンプルも大抵ダブルクォートだ。
単純に、ダブルクォートで文字列を表現する言語が多いという理由だけの気がする。
コーディングスタイルにおいて慣習ってのは大きな要素なんじゃないかな。
○○にすべきだ、という100%正しい解釈があったとしてもそれが慣習に反していれば採用するのはやっぱり難しい。
100%正しい解釈などない
>あったとしても
信念を持って慣習を破るのは悪いことじゃないな。
Rubyの場合%表記使うことも多いからダブルクォートに対するこだわりなんか全くない
無意味な仮定ってことだろ
> 慣習 こないだ '%s' % str したらMatzの写真で踏み絵させられた わかる人にはわかるらしい ちなみに初めてのRuby的には 「後述のエスケープ文字や式展開を含まない場合、 一重/二重のどちらの引用符を用いるかは好みの問題です」(p.58) だって
231 :
デフォルトの名無しさん :2009/11/04(水) 22:50:02
Ruby1.8.7でsqlite3を使いたく、環境を構築しました。 sqlite3-ruby(1.2.5) dbi(0.4.3) dbd-sqlite3(1.2.5) sqlitedll-3_6_19 上記の環境でDBI経由だと ERROR DBI::InterfaceError: Unable to load driver 'SQLite3' (underlying error: uninitialized constant DBI::DBD::SQLite3) というエラーが発生します。 ドライバが見つからないと言うようなエラーだと思うんですが、全部最新です。 何が原因でしょうか?
ドライバを入れろ
>>231 ×SQLite3
○sqlite3
db = DBI.connect("DBI:sqlite3:#{filename}")
>>231 ごめん
>>233 は間違い
うちは
db = DBI.connect("DBI:SQLite3:test.db")
で接続できた
ドライバはdbd-sqlite3で Unable to load driver だから
sqlite3自体がインストールされてない?
>>209 >個人的にはシングルクォートをメインにして、"my name is #{name}"のような変数展開を使う場合のみダブルクォーテーションにしています。
>というのもHTMLと一緒にrubyを使うことが多く、HTMLタグの値にダブルクォーテーションを使うからです。
正解
%!hogehoge! 使うべさ
俺はハッシュの値とかも含めて基本全てシングル使ってるぞ 変数展開したい時だけダブル これで特に困ったことは無い 空文字が''になるので、他人にソース見せる時に突っ込まれることはあるが。
ダミアン先生によると空文字は、%{}にしたほうがわかりやすいと
まあ''と"と"'と'''と''''と'"'と""と'"'と'''''の区別は咄嗟にはつけにくいからな いちばんわかりやすいのは String.new だが 余談だが俺は配列も Array.new だしハッシュも Hash.new だ 自分から [] や {} を使うことはゼロ
240 :
231 :2009/11/05(木) 08:39:55
新しく配列作る時って Array.new と [] って一般的にどっちがいいとかある? 好みの問題くらいでどっちでもいい?
初期値の存在しないふつうの空の配列を作るならどっちでもよい 10万個くらい Array.new と [] が書いてあったら、後者のほうがパース完了は遅いとは思うが
>>240 DBI.available_driversで使えるドライバがわかる
そこに"dbi:SQLite3:"が無ければインストールに失敗してる
初期値が無い場合は var = Array.new 初期値がある場合は var = ["hoge", "hogege"] って感じだな。 特に理由は無いけどこういうパターンで書く人が多い気がする。
[] でいいじゃん
Array.new, Hash.new はメソッド呼び出しが入るので遅い。
>>244 そうかあ?初期値がなくても [] と {} を使うほうが多いと思うけど。
デフォルトの初期値が必要な場合だけHash.newとかを使うんじゃないか。
配列からある値を一つだけ削除って簡単にできる? - とかdeleteだと複数あった時に全部消えちゃう
delete_at
>>249 簡単にはできない
若いの1個だけ消したいと予測
arr = ["a", "b", "c", "b", "a"]
arr.delete_at(arr.index('b'))
p arr
["a", "c", "b", "a"]
252 :
231 :2009/11/05(木) 18:21:11
>>243 driver = DBI.available_driversしてみました
ArrayEmptyでした orz=3
一度アンインストールしてインストールし直しても同じです
どうやればインストール成功するんでしょうか(´;∀;)
253 :
249 :2009/11/05(木) 18:50:35
>>250 ,251
なるほどね見つけてから_atで消すのね
ありがとう
254 :
231 :2009/11/05(木) 19:19:05
sqlite3-ruby dbi dbd-sqlite のバージョンを下げたりしてみたけど やっぱりドライバが認識されませんでした 同じコードとドライバでも1.9.1だと動きまする・・・
インストール手順を示さないとアドバイスしようがないと思ふ
256 :
231 :2009/11/05(木) 20:05:44
解決しました。いや、解決はしてませんが、ドライバが原因では無いことはわかりました。 NetBeans6.7.1でデバッグをすると「ドライバがないぞゴルァ」って言われるんですが コンソールから実行すると何事もなかったように動きます。 どうもお騒がせしました。
えええええw
コンソールから使ってるRubyとNetBeansから使ってるRuby が違うんでないかい?
259 :
231 :2009/11/05(木) 22:41:01
>>258 自分もそう思って確認したんですが
インストールされてるバージョンは1.8.7-p72と1.9.1-p243の二つしかなく
コンソールもねとびーんも1.8.7-p72を使ってました。
ねとびーんのGemマネージャにも、きちんとドライバは登録されていました。
その後も色々試していますが、未だに原因がわかりませんです。
printf("%d %d\n", n, n+1)の出力にマッチする正規表現は書けますか?
動的に正規表現を生成するのでも構わないのなら n = 3 "%d %d\n" % [n, n + 1] =~ Regexp.new("%d %d\n" % [n, n + 1]) #=> 0 ところで以下には驚いた。勉強しなおさないとだ '%d %d\n' % [n, n + 1] =~ Regexp.new('%d %d\n' % [n, n + 1]) #=> nil "%d %d\n" % [n, n + 1] =~ Regexp.new('%d %d\n' % [n, n + 1]) #=> 0
>>261 s = '%d %d\n'
p /#{s}/ # /%d %d\n/と等価
文字列として\nが解釈されなくても、正規表現をパースする段階で解釈される
似たような話としては、String#gsubで引数に\を渡そうとすると
ダブルクォートの場合はエスケープの都合で\の個数がキモいことになる
>>262 サンクス。完全に間違って理解してた
> 文字列として\nが解釈されなくても、正規表現をパースする段階で解釈される
よく覚えとくよ
で、
>>261 でなんではまったかと思ったら普段あまり使わないRegexp.new使ってるからだった
'\n' にマッチする正規表現をリテラルで作ろうとしたら /\\n/ って直感的に書けるけど
Regexp.new で作ろうとすると相当キモイことになるね
264 :
デフォルトの名無しさん :2009/11/06(金) 06:35:26
質問です。
さくらインターネットのスタンダードプランでrubygemをインストールしたのですが,
gemコマンドを打ち込んでも
gem: command not found
と、出てしまいます。
これはインスト失敗しているのか、単に環境設定がうまくいってないのか…。
ご教授願います。
インスト時には
wget
http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz tar zxvf rubygems-1.3.1.tgz
cd rubygems-1.3.1
ruby setup.rb --prefix $HOME
で、
RubyGems installed the following executables:
/home/hogehoge/bin/gem18
と出ていました。
じゃあ/home/hogehoge/bin/gem18って打ち込めば
266 :
260 :2009/11/06(金) 08:02:12
>>261 動的でもいいんですがnの値は不明です。
一旦nを求めて式展開するしかないでしょうか?
一回で
line =~ /(\d+) #{\1.to_i + 1}/
みたいには書けない?
実効上のご利益がないのでどうでもいいのだが正規表現を先に書いてくれると嬉しい /re/ =~ str
それと、 gem じゃなくて gem18 と入れることか。
>>264 に足りないのは(PC-)UNIXの知識だな
Ruby関係ないシリーズの筆頭だ
はいそこさくらが使ってるFreeBSDがUNIX4文字で包括されうるかどうか議論しない
ruby2.0はいつ出るのじゃ
新しいバージョンを待つ香具師は、そのバージョンが出たら その次のバージョンを待つことになる。
1.9もまだ満足に移行出来てない状況でw
2.0になった場合の変更予定点とかってもう案があったりするの?
だから待ち焦がれてる椰子が多いんだよ。 Ruby2.0が出たらそのサブセットをどっかで標準化したりするのかね。
2.0はこうなる! みたいな解説どっかにある?
ないでもないけど(Ruby Riteで検索すれといくつか)大昔のものなので、 1.9で実現しちゃったもの(YARVとか)もあれば、方針転換があったりしたものが (たとえば括弧の省略があまりできなくなる方向で動いてたのを、断念しちゃったり) あったり、全く刷新の気配もないもの(GCとか)とかで、全然参考にならない。
280 :
231 :2009/11/06(金) 19:33:23
必要ないかも知れないですが経過報告です。 全く違う別のPCで1.8.7-p72、NetBeans6.7.1という同じ環境を構築して SQLite3をDBI経由で読んでみましたがコンソールからだと問題無く動くコードが 同じエラーになりました。ドライバが認識出来ないようです。 同じコードでも1.9.1だとNetBeans6.7.1でも問題無く動作するので環境の問題のようです。 もし上の環境でDBI経由でSQLite3が使えてる人がいたらアドバイスください。
txt = open('hoge.txt').read ってするとオープンされたファイルのストリームは開いたままですか?
>>281 えーーーーと、
クラスメソッド File.open は File オブジェクトを返すだけ
関数的メソッド open も File オブジェクトを返すだけ
インスタンスメソッド File#read はストリームを閉じない
クラスメソッド File.read は File オブジェクトを開いて File#read して閉じて read 結果を返すユーティリティ的メソッド
File.open(path).read は不完全
open(path).read も不完全
File.read(path) は安全
File.open(path){|f| f.read} は安全
open(path){|f| f.read} も安全
ブロックつきメソッドで書けるメソッドは、ブロック作らないと危険
ブロックつきメソッドで書く意味がなさそうなメソッド(File.read、File.readlines 等クラスメソッド)はブロック作らなくても安全
クラスメソッドは「便利メソッド」として作られてることが多い
>>281 GCされるかスクリプトが終了するまで開いたまま
ちゃんと閉じるか閉じてくれる書き方をするクセをつけたほうがいい
手っ取り早いのはこれ
txt = File.read('hoge.txt')
本当はIO.read、ただし1.9系じゃないとこの方法でbフラグ付けるのは無理
IO.binreadは1.9だっけか
String::squeezeの使い道が分からない
1.9はvistaの様に飛ばして、2.0のsp2が出るまで1.8で耐えた方が良さそうw
今までrubygemsで取得できるもので済んでいたのですが、 tar.gzで配布されているruby-clusterやruby-gnome(gtk?)を使うことになり、 Emacsでのanythingやauto-complete-rubyでも↑のライブラリを読み出して欲しいと思って調べたのですがわかりませんでしたので質問させてもらいます。 anythingではfri -lやrefe -lの結果から候補を、auto-complete-rubyではrcodetoolsからどうにかして候補を出しているみたいなのですが、 そのソースとなるのはtar.gzがもつドキュメントorコードから生成されたドキュメント(?)を元にしているみたいなのです。 そのようなドキュメントを生成するのはrdocなんでしょうか?そうだとしたらどのように生成すればいいでしょうか? rdoc --riとやって.rdocの中に色々とできているのですが、そこをLOAD_PATHに加えればいいのでしょうか? 長くなってすいません。
288 :
デフォルトの名無しさん :2009/11/07(土) 16:37:36
Rubyで外部コマンドを単純に実行したいときで質問。 変数hogeにデータが入っていてこれを引数としてコマンドを実行したい。 system("command", hoge) なら安全? 例えば、パイプでつなげられてrm -rfされる心配はないか、とか。
はい sysytem 等の第2引数はシェルを介しません irb> system('ls', '-la|date') ls: invalid option -- '|' 詳しくは `ls --help' を実行して下さい. irb> system('ls -la|date') 2009年 11月 7日 土曜日 16:42:32 JST ls が | についてのエラーを返していることに注目です | を含んだ引数を ls コマンドに直接渡している証拠です ただ、この場合、第1引数は完全に正しい実行可能文字列でなければなりません オプションとかなんか余計なものを含んでいた場合はエラーです irb> system('echo ', 'hello!') false irb> system('echo', 'hello!') hello! 「echo 」という末尾に空白を含んだ実行ファイルは存在しないためコマンドが実行されず、system が false を返しています
291 :
デフォルトの名無しさん :2009/11/08(日) 10:16:43
テンプレに ・Ruby 1.9.0 不安定にして先鋭機能が超満載の開発版バージョンだったもの 1.9.x は本来全てが開発版の呼称だったのだが、事情が変わって(ここ笑うところ) とありますが、どう事情が変わったのでしょうか? "1" + 1 とするとエラーが出てしまいます。 エラー内容的には 整数を文字列に出来ないよ。 ということだと思っています。 しかし、 1.to_s を実行すると "1"が返ってきて、1.to_s.classはStringだと言っています。 数値の 1 を文字列に変換することは出来ているのに上記のようなエラーが出る理由が分かりません。 教えてください。
Rubyは、その種の暗黙の変換はしないので、 "1".to_i + 1 #=> 2がほしいとき "1" + 1.to_s #=> "11"がほしいとき
オブジェクトが違ってるということはプログラミングの手順が間違ってるということがほとんどなわけで
こういう場面では暗黙の変換をしてもらわないほうが多くの場合は便利
動作と投入値のとり得る全てを事前に完全把握してる場合は暗黙の変換をしてもらったほうが面倒ないけどな
まあそういう時はRubyにこだわらず適当にそういう動作の言語使ってだらっとプログラム書けばええ
とりあえずRubyはその手の変換は行わないようにメソッドが作られてることが多い
困ったことに + 系のメソッド内でクラス比較して変換かけてるパターンもあるけどな
>>291 > どう事情が変わったのでしょうか?
このままだとバージョンナンバーを普通に使い切ってしまい
栄光のバージョン2.0が普通の1.9の上位バージョンになってしまうという危惧
1.9.0を元にした安定版を出す際に、通常のバージョンのつけ方なら
・ 1.9.x … 開発版
・ 2.0.x … 安定版
となるはずだし従来はこの予定だったのだが、2.0の名には値しないと判断されて、無理矢理
・ 1.9.0 … 開発版
・ 1.9.1 … 安定版
とされたということ
294 :
デフォルトの名無しさん :2009/11/08(日) 15:19:36
じゃあ、1.9.1は2.0ってことですか
295 :
デフォルトの名無しさん :2009/11/08(日) 15:23:13
matzを罵ってやる!
Rubyでは、2.0は人参と呼ばれている。 「開発者のモチベーションを引っ張り続けるが到達できないもの」 来世紀くらいには追いつけるかもしれないがユーザーが待つのは馬鹿。
まあ10年くらいしたらなんとかなんじゃねえの、とは思う 少なくとも5年では無理
なにが人参だか。どうでもいいわ
RubyにはRubyしか知らない人が多いというのはやっぱり真実なのだと思う ようはPerl6と同じことだろ
>>285 String#squeezeはたぶん正規化じゃないかなぁ
require 'jcode'; $KCODE = "s" # 1.9なら不要
Words = %w(google キター).map {|s| s.squeeze }
def exist?(s); Words.index(s.squeeze); end
p exist?("goooooogle")
p exist?("キターーーー")
PHP6、Perl6、Ruby2のうち一番早くリリースするのはどれですか?
やっぱり1.9sp2まで待ちだな。
Rubyの多次元配列? それなんていうライブラリ?
ruby 1.9.3あたりが安定版になっても俺は驚かない 驚かないが、「またユーザーを混乱させるのか・・・」と思う
>>305 1.9.1 以降は全部、1.9 系列の安定版だよ
1.9.2 が出たとしたら、それは1.9系列の最新安定版
1.9.3 が出たとしたら、それは1.9.2より新しい、1.9系列の安定版
開発版は常に 1.9.0
パッチレベルが上がるんだったかなんだったかで区別するとかしないとか
1.8.5やそれ以前のような「とりあえずリリース」はない
tenny(バージョン x.y.z の z)が 0 でないときは必ず安定版リリース
この理屈だと Ruby 2.0.0 は 2.0 系列の開発版ということになるが、まあそういうことなのだろう
情報の古いうっかりさんが「これが Ruby2.0 か」とか勘違いして 2.0.0 をインストールしてシステム壊すとかそういうの希望
まー 1.9.1 の中でもパッチレベルが違うと動作違うけどな(正しくなっただけなのだが)
1.8.6 でもあったが、なかなか酷い
驚き最小の法則w
http://ja.wikipedia.org/wiki/驚き最小の原則 結城浩は1996年、この原則を人間関係を円滑にすすめるための心得に拡張し、「驚き、最小の法則」として紹介した。
たとえば、プログラムを顧客に納品する際に、判明しているバグがあるのなら、それを伝えておいたほうが顧客に
とっても利用時の戦略を立てやすくなる、といったものである。「『どうしようかな?』と思ったときには、 相手の
『驚き』を最小にするような選択をすべき」であるという[1]。
プログラミング言語 Ruby は、一時期「驚き最小の原則」とともに語られることが多かった。ただし、作者のまつもと
ゆきひろはこの原則を Ruby の設計哲学として採用したことはないと述べている[2]。Ruby については、「さまざまな
バックグラウンドの人々すべてを驚かせないことではなく、Ruby のやり方に十分に慣れた人が持つ常識が一貫して通用
するという意味」[3][4]であるとして、「Matzの驚き最小の原則」という言い方も提案された[3]。現在では Ruby が
「驚き最小の原則」とともに語られることは少なくなっている[5]。
驚きの連続w
>>309 コミュニティ内では「Rubyらしい動作」という言葉で語られる概念だな
Rubyらしい動作をするクラスやメソッドは推測が利いて使いやすい、という程度の意味
一時期のruby-talkとかひどかったもんな。 いろんな言語バックグラウンドを持つ香具師が、想定外の挙動に対して 「これは驚き最小に反している!」 そして「おめーにとってはそうだろうがよ」と総ツッコミ。
313 :
305 :2009/11/08(日) 18:19:50
>>306 説明ありがとう! 1.9.1からルールが完全に変わったんだな
> ruby 2.0.0 は 2.0 系列の開発版
そうなるのか? ruby 2.0.0 からまた元のルールに戻るとかじゃなくて?
そうなるんだとすると、本当に訳が分からなくなりそうだ
>>313 2.0 系列の開発版は常に 2.0.0
2.0.0 で安定版が作れたと思ったら 2.0.1 としてリリース
2.0.1 がパワーアップしたら 2.0.2 としてリリース
2.0 系列の次のバージョンの開発版を作る場合は 2.1.0 でやる
こんだけ
x.y.z の y だか z だかが奇数のときは開発版で偶数は安定版、みたいな
冷静に考えるとへんてこなルールと実質上は何も変わらない
>>314 ソース求む。
どこにもそんな話、なかったと思うんだが。
ruby 1.9.3あたりが安定版になっても俺は驚かない 驚かないが、「またユーザーを混乱させるのか・・・」と思う
順調に迷走してるね、この言語。
迷走してるのはおまえの脳みそだろw
319 :
デフォルトの名無しさん :2009/11/09(月) 02:02:57
すくなくとも驚き最小の原則を標榜している言語が 脳みそを掻き回したらいかんだろ
321 :
デフォルトの名無しさん :2009/11/09(月) 02:13:44
よそから飛んできたんでひょっとしたら320は空気が読めてなかったかもしれない
ruby厨WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
一時期のRuby厨が荒らしてたPythonスレみたいになってるw
2.0が出てもみんな1.8.7を使いつづけるというオチでは?
そこはJRubyでしょ
326 :
デフォルトの名無しさん :2009/11/09(月) 11:24:20
C言語みたいにクラス定義を別ファイルに書きたいのですが #include "MyClass.h" に相当するRubyの命令がわかりません。 手持ちの本にも載っていません。 誰か教えてください。
require
>>326 require "myclass" # myclass.rb を読み込む
この言語って他の言語にある程度慣れてる人が多い? プログラミングはRubyからです!って人は少なそう。
>>329 Ruby から始めましたが。
理由は、基本的な構文はどの言語も似ていると思ったので...
VBA → ちょっとだけJavaScript → VB.NET → C# → Ruby
rubyから始めましたってのはニート出身のPGとかだけだろ 学歴ある奴はあり得ん
333 :
330 :2009/11/09(月) 21:19:51
>>332 大学で始めてプログラミングやった子なのかな?(^^;
>>332 なにその根拠のない自信?ホントにプログラマ?
おまいら釣られすぎですよ
マジレスすると大学で覚えるプログラミングなんて大したことなくね? いいとこの大学でもC言語を基礎から教えてたりするわけだし、そんな状態から4年間での伸びしろなんてたかが知れてる。 その周りの専門知識は大学じゃないと勉強するのは難しいかもだけど、実務で生かせてる知識がどれほどあるか。、 自分の大学生活が薄っぺらかっただけなのかな? 中卒高卒でも小さい頃から趣味でプログラミングやってた奴らには勝てる気がしないんですよ。 なんというか、雑学というか知識の幅というか、そこら辺が埋めようの無い差を感じる。
安心しろ、ラジオを分解すらしたことがなくても 電気電子系の学科に進学する、という人が増えている。 今はそういう時代。
モチベーションの差とかもあるかな 大学出てない奴は少なからず劣等感を持ってると思う うちの会社に大学中退者が何人かいるんだが彼らのハングリー精神は恐れ入るよ
>>337 小さい頃からプログラミング続けてる人はベースが完璧にできあがってるし
そういう基礎的な部分で苦労しない分、応用とか開発にリソース使えるんだろうね
小さい頃からプログラムやってる人はうらやましいね。 田舎だとそういう情報もハードも少なくて外で走り回ってるくらいだったよ。 その年頃でマイコンとかやってる奴とかいるかと思うと・・・。 まだ、勉強し続けなきゃならないな
あとは環境かねぇ。 親の環境次第で当時、高価なPCを買えたかどうかとか。
子供の頃、親が遊びに投資してくれたかどうかで
将来がだいぶ変わるよな
ゲームばっかすんなとか言うけど
そこからプログラムに入れば職業につながる可能性だってあるんだしね
遊びの価値を理解してない人が多い気がする
自分の場合、学校で教わったことなんかより
遊んだ分の知識の方がメシの種になってる
勉強し倒したか、遊び倒したかという極端な人ほど
「使える」人になってる気がする
>>342 今は高価な PCじゃなくても、そこそこの性能で
今の子供はうらやましいよね
そう言われてみれば、消防ん時からプログラミングやってる俺は 親がオーバークロックとか日常茶飯事な自作erだなあ 物心ついた時には周りにPCパーツ転がってたし 俺がPCに興味持ったと知るや、いきなりパーツ屋連れてかれたなw ま、結局それはあんまり肌に合わなくて PCじゃなく、ソフトウェアを組む方にハマったんだが
今の子供は羨ましくもあるが、 ネットも無く毎日外で秘密基地とか作って遊んでた自分の小学生時代はこれはこれで良かったと思ってる。
一方小学生の
>>344 はアメリカの某サーバにバックドアを仕掛けた
25までニートやってた俺はお前らには無いエナジーで溢れてる 俺の人生はこれからだ
プログラミングなんて義務教育終わる前に覚えとくもんだろう ところで、最近は東大の教養課程でruby教えてるそうなので、 rubyでプログラミングを始めた高学歴というのは普通にいるんじゃね?
>>348 一行目と三行目以下の矛盾がひどいなオイ
350 :
デフォルトの名無しさん :2009/11/10(火) 12:26:37
rubyの起動時間を調べてみました。1.9遅ッ! 簡単なwxRubyアプリケーション。起動してから画面が出るまでの時間。 ストップウオッチ法。WindowsXP。3GHzのPentium4。 1.8.7p174 平均 1.7秒 1.9.1p243 平均 5.6秒 1.9はコンパイラを分離したほうがよくね?
1.9って高速化されるんじゃなかったの?
×rubyの起動時間 ○ mswin32版ruby経由のwxRubyの起動時間
>>349 べき論と現実とは普通に食い違ってるもんじゃないか
354 :
デフォルトの名無しさん :2009/11/10(火) 13:26:29
NACLの瀬崎さんという女性はかわいいって本当ですか?
初心者はそんな質問しません
356 :
デフォルトの名無しさん :2009/11/10(火) 13:42:12
>>352 wxRubyはライブラリです。起動などしませんとか文句が出そう
学校教育と義務教育がごっちゃになってるようにしか読めなかった
学歴話はスレ違い
Enumerable#inject() を自前で定義すると、どうなりますか? 初期値が省略できないと仮定すると、 def inject(init) accum = init each do |x| accum = yield(accum, x) end return accum end でいいと思うんですけど、「初期値が省略されたときは最初の要素を使う」というのがうまく書けません。 def inject(init=nil) if init.nil? flag = false # 初期値がない else flag = true # 初期値がある end accum = init each do |x| if ! flag # もし初期値がないなら accum = x # 最初の要素を初期値として使う flag = true else accum = yield(accum, x) end end return accum end
じっくり見てないけど、nilで判定するとnilを初期値に指定できなくなるから、 *argsで受けてsizeをチェックしたほうがいいんじゃない?
def inject(*args) accum = args.empty? ? e.next : args.first begin loop { accum = yield(accum, e.next) } rescue StopIteration end accum end 1.8.6とかSymbolとかシラネ
ミスった、最初にこれやっといて e = each
>>341 子どもの頃におやじが道楽でAppleII買ったんでその内蔵BASICで遊んだなあ
おやじは死んじゃったけどAppleIIはまだ置いてあるや
368 :
デフォルトの名無しさん :2009/11/10(火) 20:51:01
Ruby歴三日の初心者です。 関数呼び出しでかっこつけてますか? どちらのスタイルで書いた方が良いでしょうか?
print と puts と p 以外のメソッドはとりあえず括弧をつける 括弧を外すことはいつでもできるのだから、括弧ありで確実な動作を把握するべき
その三つだけ例外扱いすることに筋が通らなくね? 返値を期待するなら括弧を付けろとか
?がつくと、あまり括弧を付けたくない気持ちになる
>>368 かっこいい、かっこ悪いで関数は呼び出すものじゃないと思います
つまんね
Railsのソースとか見るとカッコ省略がデフォだよね
RailsはRubyではない
RailsはRubyだろ RubyはRailsではないが
アホを相手にするな
rorに成れると、rubyらしく描けなく成るからなw
Rails は Ruby 1.a.h.o
Rails慣れてくると、引数はHashじゃなきゃいけなく感じてくる('A`)
Railsは意図的にDSL的な書き方を要求してるから括弧省略例が多くなるんでしょ。
括弧ないとき人間がソース読み書きするにあたって メソッドとプロパティの区別ってどうやって判断するの?
メソッドのときは::で書けばおk
>>382 Rubyではそもそもメソッド/プロパティをあまり区別してない
>>383 オブジェクト指向言語で、メソッドを全部::にされるとすごく読みづらいと思う
ほとんどがメソッドの呼び出しだし
アクセサは?
rubyって仕様で完全にカプセル化されてるから基本的に全てメソッドじゃないの? アクセサ定義してもプロパティに直接アクセスできるようになるわけじゃないし。
というか、オブジェクトを操作するのに、 メソッドとプロパティを意識する必要はあまりないんじゃないの? という思想があるような気がしないでもない。
>>368 亀レスだが、引数を省略したりもするので、括弧はできるだけ付けている。
ただし、pなどは可変引数なのと、デバッグでよく使うので括弧を省略。
def func1(p1,p2,p3=0)
p1+p2+p3
end
p func1 2,3,4
p func1(2,3),4
自分で作ったrbへのパスを変数に入れて、そのrbのメソッドを実行するにはどうしたらいいですか? path = "lib/hoge.rb" としたあと、hoge.rbのindexメソッドを呼ぶ感じです。
require
とりあえず、hoge.rbだけでいいなら、これでいけるんじゃない? require File.dirname(__FILE__) + "/lib/hoge.rb" lib以下に複数ファイルがあって全部読み込みたい場合は、 Dir.globと組み合わせればいいかと。
>390-391 Dir.globを使って任意のパスにある複数のrbをrequireすることはできています。 が、任意のrbの任意のメソッドを呼ぶ方法が分かりません。 #{hoge}.index みたいな感じでしょうか。。
>>392 そのindexがトップレベルに定義してあるメソッドなら無理
>>392 うーん。
全部requireした時点でどのファイルか?なんて情報はなくなると思うし、
名前空間で区別すべきじゃないか?
とりあえず、hoge.rbにはこう書いておいて、Hoge.indexで呼び出せばいいんじゃないの?
module Hoge
def self.index
end
end
>>393-394 色々ありがとうございます。
自分がしたいことの実現方法が間違ってる気がしてきました。
やりたいのは、rbを複数個用意して、リクエストuriに対応したrbのメソッドを実行したいんです。
/hoge/huga にリクエストされたら、lib/hoge.rbのhugaメソッド、/hoge/にリクエストされたら lib/hoge.rbのindexメソッド、/foo/barにリクエストされたらlib/foo.rbのbarメソッド、という感じです。
ディスパッチャは自分で作ろうとしています。
リクエストはまず全て一つのrb、例えばroot.rbで受けて、root.rbの中で環境変数などからディスパッチしようとしています。
ので上記のようなことを考えたのですが、もっとスマートな方法はありますか?
それでいいよ
車輪の再発明だけどな
>>388 引数に関数呼び出しのコードを書くのが間違ってる
>>398 意味不明。正しい用法なるものがあるんなら、コードの具体例を。
>>395 require毎にインスタンスを作っておく、じゃNGか?
>>398 他の言語だとコード簡略化の為によくある手法だが
Rubyは御法度なのか、勉強になった。
引数の呼び出し順番は処理系によって不定とかいう言語から来た人かと思った。 Rubyは決まってるよな?
どなたか、:: と . の違いについてのコピペをキボンヌしてくださる方はいらっしゃいませんか? モジュール定数指定する時に、 Hoge.MAGE じゃだめなんだけど・・・ つか、テンプレに入れとけ・・・
>>403 class::method
instance.method
>>401 398の主張の理由はわからんけど、別にRubyでも御法度ではないよ
むしろ積極的に使われてるぐらいのはず
>>403 定数やモジュール、クラスを指定するなら Foo::Constant
メソッドを呼び出すなら instance.method
たまに Foo::method という記述も見かけるが、あまり一般的ではない
409 :
デフォルトの名無しさん :2009/11/12(木) 10:04:04
C言語のmax関数をRubyで書くとどうなりますか? a = max 0, a-1 が通りません。
関数のポインタ呼び出しはできますか?
>>409 Enumerable#max
>>410 関数ポインタなんて無いから下から好きなの選べ
Object#method
Object#send
Kernel#proc Kernel#lambda Proc
あんまりないけど、レシーバが確定していないなら Module#instance_methodしておいて後からUnboundMethod#bindというのもあるね
>>409 411の回答に優しさを感じなかったから回答してみると、
a = [0, a-1].max
ret = `cmd` で終了コードも知りたい場合どうやればいいですか?
$?
erbかhamlを、railsを使わずに素のrubyから使った場合に、layout機能を使うにはどうしたらいいですか?
layoutはRailsの機能なんだが。
>>417 どおりでいくらググっても情報が得られないわけですね…失礼しました。
>>416 erb(レイアウト)の中でerbを使う
<%= inner_erb.result %>
>>419 なるほど!しかし、こうなります。
hoge
<%= inner_erb.result %>
huga
これが
inner_erbのresult
huga
何か、<%= inner_erb.result %>より上の部分が消えます。
EBBオブジェクトの src メンバーを参照するとわかるが、 変数 _erbout を空文字列で初期化し、 元テキストを地の部分とスクリプト部分に分けたものを、 * 地の文ならconcat * <% %> ならそれを評価 * <%= %> なら評価結果を to_s してconcat していく。 デフォルトだと常に _erbout って名前の変数を使ってしまうから、 innerの処理結果が _erbout というローカル変数に代入されてしまい、 それまでの結果が上書きされてしまう。 <% inner_erb = ERB.new(File.read('inner.erb'), nil, nil, '_inner_out') %> hoge <%= inner_erb.result %> huga
>>421 えーと…
>>422 やりたい事ができました、ありがとうございました。
それにしても、絶対必要だと思うんですが、何でlayout機能が標準装備されてないんでしょうかね。
rubyだから
>>423 おまえのためだけにRubyがあるんじゃねぇんだょ!
>>423 rcsは何でプロジェクトのファイル全部を統括的にバージョン管理できないんでしょうかね、と言うようなものかと
svn使え、と。つまり、もっと上のものを使わないと。
この場合だと何らかのフレームワーク使えってことじゃないかな。
てか、RailsのActionViewってActiveRecordみたいに単体でつかえたっけ?
そうね誕生石ならRubyなの そんな言葉が頭に渦巻くよ
今年もレコ大(死語)の季節だな
puts 'hello'[0] => 104 この仕様が理解できませぬ。いや文字コードが出力されているという事実は理解できるんだけど hを返さずに104を返すのは何故なのでしょう。 ruby熟練者にとっては、文字コードが返された方が都合いいのですか?
1.9では文字列を返すように仕様が変わるという厄介者。 [0]ではなく[0,1]を使うようにするのがよいでしょうね
431 :
429 :2009/11/14(土) 09:39:54
>>430 ありがとうございます。[0,1]でhが取り出せました。
1.9から変わったということはあまり意味の無い仕様だったのかな…早く1.9に乗り換えないとなぁ
ゴルファーは ?d で 100 が得られなくなって嘆いているらしいな。
部分文字列が整数なのはCから来てるんだろ 誤解は多いけど、意味のない仕様というわけでもない。 批判が多くて1.9で変わった仕様としては i = 2; 10.times do |i| puts i end; puts i # => 9 なんてもあるけど、これもCから来てる。
整数で取り出せたとして使う機会が思い浮かばない
Cの仕様で部分文字列は整数ってなるようなのあったっけ?
>>433 ああ、そういうことか、
stringからcharを取り出す感覚か。
>>435 ブロックの引数は、実は引数じゃなくて、左辺値のある式ならなんでもよかった。
で、その左辺値に代入しちゃうわけ。
Cから来てる、という説明はあまり見ない気がするが...
for (int i = 0; ...
みたいなJavaなどではできる記述がCではできないことを言いたいのか?
stringってchar配列でしょ?それとはまた違うような
>Cから来てる、という説明はあまり見ない気がするが... >for (int i = 0; ... >みたいなJavaなどではできる記述がCではできないことを言いたいのか? いやC++ならできるけど スコープが外とつながってるっつー話で
Linuxでrubyを利用しています。 LinuxだけでMS-ACESSのmdb形式のデータベースを利用する方法がありますか?
>>436 Cの文字列は文字コードの配列だから、当然1文字取り出したら文字コード=整数だよ
charだから整数では無いな 利用するときに暗黙のキャストでintとみなされたときに始めて整数になる
charは8bit整数、intは16〜32bit整数じゃないの?
CHAR_BITが8でなければならないという話はどこにもないし、 intが64ビットではいけないという話もどこにもない。
rubyで一文字取ったとき符号無し整数になるの?それとも符号付き?
(古いRubyで)"\xff"[0] が -1 になるか 255 になるか、ってこと?
"あ"[0] でもいいのかな
string.c の該当行は、 return INT2FIX(RSTRING(str)->ptr[idx] & 0xff); だから、マイナスの値にはならない。
Cではcharは1バイト。他は実装依存。 1バイトが何ビットかは実装依存。 ただし、stdintを使えばちゃんと指定できる。
453 :
デフォルトの名無しさん :2009/11/14(土) 16:35:30
RSpec を gems でインストールしようとしておかしなことになって困ってます。 どなたか助けてください _o_ # gem install rspec を実行すると、依存ライブラリのインストールを確認してくるので 全部 y またはそのままリターン で進めていたのですが、 そのうち以下のように、cucumber と rspec の確認を繰り返すだけに なってしまいました。 Install required dependency cucumber? [Yn] Install required dependency rspec? [Yn] Install required dependency cucumber? [Yn] Install required dependency rspec? [Yn] Install required dependency cucumber? [Yn] (以下、何度繰り返しても変化なし) rubyforge から gemsファイルをダウンロードして内容を調べたところ、 ・rspec は cucumber に依存している ・cucumber は rspec に依存している ことが分かりました。 依存関係がループしているわけですが、 gems ではこういうときにどうすれば良いのでしょうか?
とりあえずそこで止めて、 # gem install rspec cucumber するとどうなる?
455 :
453 :2009/11/14(土) 16:43:39
>>454 ありがとうございます。
やってみましたが、以下同文でした。
たがいに依存してるなら統合しておけよwって感じだな
ルヴィーって楽しいですか? 友達が日本人が開発者だから誇らしいと言ってましたが。 僕もルヴィーやってみたいです。
楽しいには楽しい。 でも開発者が日本人っつーなら、なでしことかひまわりとか(ry
>>453 -ignore-dependencies やっちまえ
責任もてないけどねw
460 :
453 :2009/11/14(土) 21:25:21
>>453 です。
--ignore-dependencies とか、rubygems のバージョンが古かったので
バージョンアップとか、いろいろやってみたのですが、
状況がごちゃごちゃになって良く分からなくなってので、全リセットしてみました。
rubygems を完全にアンインストール、これまでインストールした gems も
全て削除してから、rubygems の最新版(1.3.5)をインストールして、
# gem install rspec
と実行したら、rspec だけがインストールされ、依存gemsがインストールされません。
何だか訳の分からない状況になってきたので、一から調べなおしてみます。
お騒がせしました。
461 :
453 :2009/11/15(日) 01:05:32
なんとかインストールできましたので、結果を報告しておきます。 まず、最初に使っていたrubygemsは、Ubuntu8.04のパッケージにあった 0.9.4 でした。 次に使ったのは 1.3.5 でしたが、この間に --development オプションが 追加されたみたいです。 これは、依存関係に runtime/development 属性があり、 通常のinstall/update では runtime 依存のみ追加し、 --development オプションを指定すると development 依存も追加する、 というものみたいです。 rspec → cucumber の依存関係は development で、 cucumber → rspec の依存関係は runtime でした。 また、rspec の依存関係は全て development だったので、 $ gem install rspec とだけすると依存パッケージはインストールされず、 $ gem install rspec --development とする必要がありました。しかも、このとき cucumber の依存関係のせいか rspec のインストールは失敗し、 $ gem install cucumber としてから、あらためて rspec をインストールしたら今度は成功しました。 example の 〜_spec.rb を試してもOKだったので、これで大丈夫だと思います。 以上、お騒がせしました。
railsが提供するlink_toやyears_agoは、railsを使わないでも使えますか? ググったらARはrails抜きで使う方法が見つかりましたが、これらは見つかりません。
>>461 developmentな依存関係は、対象gem自体の開発を行う場合に必要と
されるものだねぇ。
>>462 years_ago はActiveSupportがあれば使える。
# require 'rubygems'
require 'activesupport'
link_toはコントローラオブジェクト(ActionController::Base)のurl_for
が必要なのでかなり面倒になると思う。
rails無しでlink_toを使うって状況が思い浮かばないんだけど。 ルート規約とかも取り込むってこと?
link_toてルーティング絡んでいるurl_forとか呼び出しているような。分離すんの難しくネ?
467 :
453 :2009/11/15(日) 09:58:50
>>463 そうなんですか?
rspec は、develop依存ライブラリが無いと普通に実行することすら
できませんでしたが。
rspec のパッケージングがちょっとヘン、てことでしょうか。
Ruby 1.8.7 Rails2.34 で ビュー内に書いた <%= time.now.strftime "%y年%m月%d日" %> が処理されずにそのまま表示されます。なぜですか?
処理以前にtimeじゃエラーになると思うんだが。 再現手順よろ。
コマンドプロンプトでプロジェクト、コントローラ作成後、
layoutsの中にindex.html.erb作成、
<%= time.now.strftime "%y年%m月%d日" %>
を記述、webrickサーバを起動してIEで
http://localhost:3000/ex3/indexにアクセスすると time.now.strftime "%y?N%m??%d??
と表示されます。その後参考書に書いてあるとおり
<% for i in 1..10 %>
<%= i%>
<% end %>
と書くとエラーになります。
layouts ではなく app\views/ex3を作って、そのの中にindex.html.erb作成でした。
こっちじゃ、 time だと、undefined local variable or method `time' Time だと、09年11月15日 と出るなあ。 文字コード系の問題かと思って index.html.erb を Shift_JIS で保存し たら化けてるけど日付出てきたし。 なんでだろうね。
>>470 まず、scaffoldして何も手を加えない状態でちゃんと動くか確認シル
>>470 ERBで正しくコンパイルできているかを確認してみよう。
erb -x index.html.erb | less
これで <%= time.now.strftime .... %> のところがどうなっているか確かめてみて。
475 :
デフォルトの名無しさん :2009/11/16(月) 19:01:25
コンテキストというbindingというか、その辺の問題 ブロックの中と外でp selfしてみるとわかるんじゃないかな
477 :
デフォルトの名無しさん :2009/11/16(月) 21:51:57
Windowsでruby使うには、どれ使うのが良いんですか? 色々載っていて、どれがよいのかわからんです。one click rubyとかがいいんですかね
>>477 コンテキストというプログラミング一般の用語について勉強してくれ
理解できる頃にはbindingも自然とわかるようになる
>>478 自分で理解しながらやりたいか、手っ取り早く全部入れたいかによって違う
481 :
デフォルトの名無しさん :2009/11/17(火) 00:10:37
>>479 プログラム自体に対するかかわりは長いから、一般的なコンテキストの
概念は理解しているつもりだけど
selfが何を指しているかは別として、関数スコープの変数にはアクセスできて
インスタンス変数が見えないのは言語の仕様なんだと思うんで、その辺を
説明した資料は無いですか?
>>481 インスタンス変数は普通に見えてると思うんだが
何をもって「見えない」としているの?
483 :
デフォルトの名無しさん :2009/11/17(火) 01:14:35
class Hoge attr_accessor :quality ・・・ def save p @quality #=> 80 image.write(save_path) { p @quality #=> nil # self.quality = @quality } end end となる為です 10.times{|t| p @quality} #=> 80 となるので、この差もよく分からない
バージョンの数で奇数は開発版、偶数は安定版 でももう数がないから1.9.1から安定版 って話みたいだけど 1.10.0とかにはしないものなの?
>>481 selfというコンテキストが変わってるんだからそれに属するインスタンス変数も別物になる
class C
def initialize(str)
@str = str
end
def bind
binding
end
end
eval("p @str", C.new("foo").bind)
eval("p @str", C.new("bar").bind)
ブロックにbinding与えるのはrubyスクリプトからはできなかったと思うからevalで勘弁して
>>483 それはかなり特殊なケースだよ
saveの中では、普通は「self = Hogeクラスのオブジェクト」だけど
image.write{〜}の中に限り、「self = image」となってる
writeの中での @quality がnilになってるのはそのため
(なんでselfが変わるの?という点が疑問なら、Object#instance_eval の説明を読んでみて)
しかしこれ、どうやって初心者向けに説明したらいいんだろう……
分かりやすく説明できそうな人誰かお願いします
ああ、コンテキスト変わってるのになぜ静的スコープが有効かということか ・・・なんでだろうw
>>484 しないと太古の昔に約束されてしまった。
489 :
デフォルトの名無しさん :2009/11/17(火) 15:00:39
バイト募集中です。内容は宿題の代行(提出課題の代行)です。 Rubyのプログラミング課題で、内容は初心者用なので比較的優しいと思われます。 拘束期間は12/15迄、課題数は4回で、問題数は一回につき一題。計4題です。 謝礼金は5000円〜 の予定です。 人助けだと思って、どうかよろしくお願いします。 連絡先:white_knight2あっとまーくlivedoor.com
詐欺乙
491 :
489 :2009/11/17(火) 15:09:49
スレ汚しすいませんでした。
492 :
デフォルトの名無しさん :2009/11/17(火) 15:19:15
なぜ初心者スレに書いたのか
宿題スレだと講義にない高度テクニックをこっそり混ぜられてバレるだろ
そういういやらしい遊びがあるのか 漏れもやってみようw
まずCで拡張ライブラリを書くんですね、分かります
わざとまわりくどい書き方したり バグを埋め込んだり 答える側も色々大変なんだぞ
そうそう goruby 使ったりな
ゴルバチョフ?
def hoge01 hoge02 end def hoge02 end これがエラーになって def hoge02 end def hoge01 hoge02 end これなら実行できるのですが、 hoge02のように同じファイル内からアクセスされるメソッドは最初に書かなければならないのですか? Javaなんかだと同じクラス内でのみ使うprivateメソッドは最後に書くのが普通だと思うのですが。
> これがエラーになって なんてエラー?こっちでは普通に動いた
502 :
500 :2009/11/18(水) 06:30:30
すいません、間違えました。 エラーになるのは、 hoge02 def hoge01 hoge02 end このケースでした。
実際のメソッド呼び出しは、その時点で定義済みじゃないと呼べるはず無いでしょ。 メソッド定義内のメソッド呼び出しは、メソッドを呼ぶという情報を与えるだけだからその時点で未定義でもいいのだろう。
って自分でも何いってんのかよく分からん。
Rubyスクリプトは上から順に実行(評価)される。defといえども。
Rubyは他と違って前方参照できないめんどくさい言語
def だけ最初に取り出されて事前構築されるという考え方もある 静的言語のコンパイルだね Ruby はスクリプト実行中にdef を自分で書いて定義することもできるから、 def は書かれた順番に順に定義される 処理行1 処理行2 関数定義A… 関数定義B… 関数定義C… という書き方ができない「頭でっかち」なのが一番最初はキモかったことを覚えている
最終的に他で言うmain関数はべた書きの部分だからねえ
実行時に未定義のメソッドや変数を参照出来るインタプリタ言語があるのか
ぱーるはこれで hello と出る。 &doit; sub doit { print "hello¥n"; }
ぱーるいいな Rubyでやりたいならdef main〜endに処理入れてコード末尾でmain呼び出せば
>>509 本当の実行時に未定義があればどんな言語でもエラーだろう
RubyでだってNameErrorとか出る
で、まあ、ソース読み込み時に定義が読めなくても
実行時に解決可能ならOKという言語は多いと思うぞ
あーperlは実行時にコンパイルするんだったっけか YARVとやらが使えるようになったらrubyでもできるようになるのかな
> YARVとやらが使えるようになったら そうかここは初心者スレだった
ルヴィーって面白いですか!?? 開発者が日本人だから誇らしいって友達がいってました。
>>507 最初に関数定義群があるとキモチ悪いのはあれなんでだろうね
517 :
デフォルトの名無しさん :2009/11/18(水) 11:42:06
クラスのメンバー関数を呼ぶときにselfってつけるべきですか
上げんなカス
メンバー関数ってなんですかカス
インスタンスメソッドを意味もなくselfつきで呼んでる例なんてないだろむしろ晒せカス
RubyからRailsを取ったら何が残るの?ねぇ
>>521 Rubyが残ります
RailsがなくてもベターPerlでグルー言語でプログラマの友でOOP初心者向け言語として普通に活躍していくでしょう
仕事として年俸1千万とか欲しいなら、そりゃJavaをやればいいのさ
マジレスすんなカス
524 :
517 :2009/11/18(水) 12:22:09
なぜフルボッコ....... 普通 self つけるでしょ???
selfを付ける根拠を述べよ
Rails で拡張されすぎて便利なもんだから 素の Ruby を知らないひとが出てきてるね 本気で Rails を Ruby だと思っていそう
>>524 ここはRubyスレです
Pythonスレにお帰り下さい
ローカル変数と区別付けたいってことかな? でもself付けるとprivateメソッド呼べないから、スタイルを統一するのは無理。 class MyClass def meth1 self.meth2 end private def meth2 puts 'hello' end end myclass = MyClass.new myclass.meth1 これがエラーになる不思議。
>>528 レシーバつきで呼んだらエラー出してねと宣言しておきながらレシーバつきで呼ぶとは何事か
530 :
517 :2009/11/18(水) 12:55:46
selfつけといた方が自分のメンバー関数を呼んでる感が強くて気に入っていたのですが なんかつけるなと言う意見の方が多いのでつけないことにします。 俺は少数派だったのか
>>529 それはprivateの意義よりRubyの仕様が先にありきの考え方。
privateのそもそもの意味を考えれば上のコードでエラーを出すのはおかしいでしょ。
だってselfを付けても省いても意味は変わらないんだもの。
実際上のコードのselfを消せばエラーにならないわけだが、内部ではmeth2を呼ぶために結局selfを付けてる。
>>531 それはおまえさんの理想や狭い常識のprivateありきの考え方だな
その辺の仕様が糞なのは皆承知してます 1.9でちょいちょい変えようとしてたんだけど、1.9の方針が変わってしまい、なかったことに
変なのは確かだが、違うと言われても困るよな
そもそもユーザーレベルでクラス再オープン可能な言語にprivateとか無意味
こまけぇこたぁいいんだよ
protectedはさらに摩訶不思議
全部所謂publicという超便利かつ超危なっかしい言語でいいと思うんだ
このへんの話題はこっちではどうしようもないくせに揉めるから嫌
いまさらprivateとかそんな根本的な仕様変えられたら逆に困るんだが。
みんなそんなに有効活用してないから大丈夫
>>540 ですよね。呼んではいけない関数を呼ぶプログラマーが悪い。
privateでよかったと思ったことなんてまず無い たいていは舌打ちして強制的に呼ぶ
547 :
546 :2009/11/18(水) 13:39:00
すまん。誤爆した。
あいうえお かきくけこ さしすせそ さしすせそ たちつてと といった感じの文章を表示させるときに、 "さしすせそ"の文を1行消して表示させるにはどうすればいいですか? よろしくお願いします。
元のデータがどう格納されてるかに依存するよなあ 初心者ぽいと言えば初心者ぽいのだが 並び替えの機能が作られているまたは標準のArray#sortで望み通りだという場合には、 (行ごとに区切って配列にして)Array#uniq する str = "あいうえお かきくけこ さしすせそ さしすせそ たちつてと" arr = str.split(/\n/) # または str.split(/\r\n/) puts arr.uniq.sort あいうえおが例示であって、「1行」ごとに配列にしてsortしても思い通りの表示にならんという場合は sort のブロック自力で書かんといかんな
質問力が低すぎる
ある程度慣れてくると質問の仕方ってのも分かるんだろうけど、 完全に初心者だとどういう情報を出したら良いのか分からないんじゃないの。 だから質問力が低いってなるんだろうけど、ここは初心者スレだよー
メソッド呼び出しに、メソッド名の入った変数を使うことはできませんか?クラスが複数のメソッドを持っていて、どのメソッドを呼ぶか、動的に変えたいのです。やりたいことは以下のようなことです。 class Hoge def echo_hoge puts "hoge" end end h = Hoge.new str = "echo_hoge" h."#{str}" # エラー
通常はあまり推奨しない特に初心者 どーしても必要だという場合 h.__send__(str) でオブジェクト h の str という名前のメソッドが引数なしで呼ばれる h.__send__(str, param) でいわゆる h.str(param) になる
俺も初心者だけど、 h.send(str) でどうかな?
>>554-555 ありがとうございました。出来ました。
使う状況ですが、例えばHumanクラスがname age sexのアクセサを持っていたとして、そのうちどれかの値を欲しいとします。
そんなときはどのアクセサが欲しいかが動的に決まると思うのですが、そんなときに human.__send__(str) で取得しようとしました。
これはおかしな考えでしょうか?
知らねーよ
「そのうちどれかの値を欲しい」ってどういう状況かわかんないな どうしてもそうなったら自分ならHash使う
メソッド名を外部から入力させてそのまま使うということが普通はないと思う def get_value_from(who, key) case key when 'name' then who.name when 'age' then who.age when 'sex' then who.sex else raise ArgumentError, "Unknown parameter: #{key.inspect}" end end human = Human.new register_data(human) puts "名前は #{get_value_from(human, 'name')} です"
>>559 なるほど、受け取った文字列をメソッド名に使うんじゃなくて、そうやって分岐すればいいんですね。
勉強になりました、ありがとうございます。
でも、アクセサが増えるたびにwhenに追記するのは面倒じゃないですか?
単なるデータならStruct使えばHash風にhuman[str]でアクセスできる
メソッドがくっついてるなら
>>559 みたいにやったほうがいい
もしくは対応テーブル作るかなぁ
table = { "name" => :name }
human.__send__(table[str])
変なことすれば自分が困るだけみたいな手抜きスクリプトなら
そのまま__send__しちゃうこともあるけどねw
まあ、
>>559 のようなものなら>558のいうように内部ではHash
で持っておけば済むところだね。
Stringの継承なんですが class FOO < String def get self end def put(arg) self = arg end end foo = FOO.new foo.put("aaa") p foo >ruby test.rb test.rb:6: Can't change the value of self self = arg ^ となってしまってselfを変更しようとすると怒られてしまうのですが どうしたら変更できますか?
566 :
564 :2009/11/20(金) 00:17:46
>>565 即レスthx
String#replaceで望んだ動作です
#=の動作が変わっているのは何故なんだろう・・・(´-`)
代入の=ってこれもどっかのクラスのメソッドなの?
selfを変更するって発想がまずおかしい気がするが
569 :
デフォルトの名無しさん :2009/11/20(金) 01:33:44
初心者ですいませんが質問させてください。 HP-UXでPostgreSQLとの連携のためにライブラリを入れたいのですが どうしてもエラーしてしまいます。 OS : HP-UX 11iv2 Ruby : 1.8.7 PostgreSQL : 8.3 ライブラリ : pg-0.8.0 gemにてpg-0.8.0.gemをinstallすると下記のエラーが表示され インストールできません。 mkmf.rb:345:in `%': numbered(1) after unnumbered(1) (ArgumentError) ライブラリのパスがうまく認識していない?ようなのですが、 gemの起動時に--with-pg-lib, --with-pg-includeは指定しています。 何か原因として考えられるものがあればご教授ください。 よろしくお願いします。
>>569 >Ruby : 1.8.7
詳しいバージョン番号は?最新版は1.8.7-p174だから、もし古いのを使っているなら新しいのを使ってみるといいかもね。
>>567 代入自体はメソッドではない。
が、メソッド呼び出しになる代入(のように見える操作)はある。
「代入の表記と似せたように hoge= と末尾に = つき表記ができるメソッドを作ることができる」 が正解 hoge.foo=123 は代入ではなくただの「末尾に=記号がついたメソッド」 hoge.bar(123) であるのと同様に hoge.foo=(123) であるだけ ただし Ruby は末尾に等号を含むメソッドの解釈を便利に特殊扱いして hoge.foo = 123 とメソッド名が空白で分断されているようになってても敢えて Hoge#foo= を呼ぶ なにか = 値 というふうに書かれていた場合、「なにか」がその場所で変数であるかどうかで挙動が違う 変数であったら、本当に変数代入が行われる 変数ではなかったら、「なにか=」 という末尾等号メソッドへのアクセスが可能かどうかチェックされる どれでもなかったら単にエラー
ローカル変数、グローバル変数、インスタンス変数、モジュール変数…あと何かあったっけ とりあえず具体的にも何も、変数は変数でしか無いのだが
=の右辺が数値の場合は、左辺に数値を渡す。 それ以外はポインターを渡す。 と思ってたのだが
なんか訂正微妙に中途半端にめんどくさそうなレスだな
変数に代入ってのは右辺が何かに関わらず ある名前(変数)に右辺のオブジェクトIDを割り当てるってことでしょ でどれでもない場合エラーなんてあるの?無ければ新しくその名前の変数が用意されるんじゃないのか
構文エラーのことでは? 左辺にリテラルとか。
あ、なるほどそりゃエラーだ
リテラル(``とか%x)の動作を再定義することって可能ですか?
>>581 出来ない。
なお``はメソッドでありリテラルではない。
できない それを許される言語はほとんどないと思う 似てるのはC++0x(ユーザー定義リテラル)とLisp(リードマクロ)か?
>>578 右辺を解決して辿り着いたオブジェクトのIDに左辺を関連付ける
「動かされる」のは常に、変数名である左辺
何度も言われているが、ひとつのオブジェクトに付箋のようにぺたぺた貼り付ける変数名、というのが極めて感覚的に近い
585 :
デフォルトの名無しさん :2009/11/21(土) 09:39:53
>>570 レスあるがとうございます。
そのページは私もググって見つけました。
直ってると思われるのにエラーするのでおかしいかなと。
とりあえず該当箇所のmkmf.rbを無理やり変更したらコンパイルは通りましたが
思ったとおりうまく動きません。(TT)
>>571 レスありがとうございます。
rubyのバージョンは1.8.7-p173です。
HPが配布しているバイナリファイルにてインストールしているのが
もしかしたらいけないのでしょうか。
31bit符号付整数 シンボル オブジェクトID
587 :
デフォルトの名無しさん :2009/11/21(土) 10:20:29
>>585 よく分からないんだけど、gem install でインストールしているわけじゃない?
「gemにてpg-0.8.0.gemをinstall」って言葉もよく分からない
gemを使ってインストールするときは
gem install pg-0.8.0
等とするのが普通なんだけどね。
1. .gem っていう拡張子まで書いている理由がよく分からないな
2. どんなコマンドを実行しようとしたのかコピペだけでもしてくれた方が
解決しやすいと思う。
3. あと、該当箇所のパッチもしくは変更後の行のコピペ
4. それと、HPが配布しているバイナリファイルっていう言葉の意味が分からない?
HPからダウンロードしたの?
5. ruby -v の出力結果も書いてね。
5個の質問に答えてくれたら解決するまで付きやってやる
オーバーライド元メソッドを呼び出すのにsuperというのがありますけどこれは 継承されていない状態では動かないようです class A def foo(arg) p arg end end class A def foo(arg) arg.concat "\n" super(*arg) #ここで元のA#fooを呼び出したい end end この状態でオーバーライド元のメソッドをオーバーライドしたメソッドから呼ぶ事って可能ですか?
上書きするまえにaliasで元のfooに別名を与える
> オーバーライド元メソッドを呼び出すのにsuperというのがありますけど いやそのりくつはおかしい
591 :
デフォルトの名無しさん :2009/11/21(土) 19:10:48
では正しいりくつをおながいします
592 :
デフォルトの名無しさん :2009/11/21(土) 19:12:12
class B < A def foo(arg) arg.concat "\n" super.foo(*arg) #ここで元のA#fooを呼び出したい end end
overrideとoverwriteの違い
594 :
588 :2009/11/21(土) 20:49:20
調べてみたらオーバーライドじゃなくて再定義ですね。すみません
>>589 の方法で出来ました。ありがとう
595 :
569 :2009/11/21(土) 23:20:27
>>587 >1. .gem っていう拡張子まで書いている理由がよく分からないな
.gemファイルをローカルへDLしてからインストールしました。
>2. どんなコマンドを実行しようとしたのかコピペだけでもしてくれた方が解決しやすいと思う。
gem install /tmp/pg-0.8.0.gem
でインストールしようとしたのですが、間違ってたでしょうか?
>3. あと、該当箇所のパッチもしくは変更後の行のコピペ
単純にエラーした部分を削ってしまった
def libpathflag の中の
LIBPATHFLAG+RPATHFLAG
を
LIBPATHFLAG
だけに変更。
それが正しいのかはよく分かりませんがコンパイルは通りました。
>4. それと、HPが配布しているバイナリファイルっていう言葉の意味が分からない?
>HPからダウンロードしたの?
HPのウェブサイトにて、HP-UXの各種ツールがDLできますのでそちらから。
ttp://h50146.www5.hp.com/products/software/oe/hpux/component/network/ix/ ruby本体とrubygemはこれでインストールしています。
>5. ruby -v の出力結果も書いてね。
すいません、週明けまで環境を見ることができません。 来週確認して書き込みますね。
細かい点をいくつか確認させてね
>>595 で紹介しているサイトでは
6. コンポーネント名がHP-UX 11i v2、HP-UX 11i v3の二つあるんだけど
v2, v3どっちを使おうとしているの?
また、コンポーネントがどっちでもrubyのバージョンは
web1 A.13.00の項目で
Ruby A.13.00-1.8.7-p160.001 A.13.00-1.8.7-p160.001
とあるので、バージョンは1.8.7-p160ではないかと思っているんだけど、
>>585 で
> rubyのバージョンは1.8.7-p173です。
7. と言っている。このp173のrubyはどこから出てきた?
>>569 では
> PostgreSQL : 8.3
> ライブラリ : pg-0.8.0
と言っている。
>>595 のサイトを見ると
web1 A.13.00
PostgreSQL* A.13.00-8.3.7.001 A.13.00-8.3.7.001
とあって、PostgreSQLはいいんだけど、ライブラリpg-0.8.0ってのが分からないな
gemで配布されているのはpostgres-0.7.9で、最終更新日は2008年1月18日だったりする。
0.8.0というバージョンで探すと
一応、pgってのがあるんだけど、ChangeLogの最終更新日は2004年だ。
これはもう使われていないアダプタなので、マシンをネットにつなげれるのなら
gem install postgres
などとしてこちらのアダプタを使用するのが吉
8. pg-0.8.0を使わないといけない理由は、一緒に配布されていたから使おうとしています。
だったりしない?
それだけの理由かつ、サーバをネットにつなげれるのなら、postgres-0.7.9を使った方がよい。
ネットにつなげれなくてもpostgres-0.7.9.gemをダウンロードしてインストすればよろし。
598 :
デフォルトの名無しさん :2009/11/22(日) 01:03:06
モジュールなんですが module M def M::func(x) p x end end M::func(123) include M func(123) みたいにincludeしてもしなくても呼べるメソッドを定義することって出来ますか? M::funcとfuncを2つ定義すれば出来ますがもうちょっとスッキリする方があれが良いなと・・・
>>598 その場所にinstall_rubysdl.rbがないんじゃね?
dirって打ってあるかどうか確認して
>>599 関数的メソッド形式として利用したいユーザーが、意図的にモジュールを include する
それ以外はやっちゃだめだしトップレベルで include されてると期待してもだめ
602 :
598 :2009/11/22(日) 01:53:40
>>600 早速のレスさんきゅうです。
install_rubysdl.rbは、やはりありません。
上で書いた通り、SDLによるMP3に拘りませんので
どなたかご教授願います。
(手元の本やGoogleでもSDLの方法しか見つかりません)
>>602 本当に再生さえ出来ればいいのならこんな方法もある
コマンドラインから再生できるプログラムを用意(以下の例ではmplayerを使用)して
mp3_filename = 'hoge.mp3'
system("mplayer #{mp3_filename}")
ffplayでも出来ると思うけどうちでは再生が安定しなかった・・・
あとlibmplayer.dllを使っても再生できそうだけどDLLのリファレンスが見あたらないな・・・(汗
MCIは微妙だからwaveout使う方がいいよ
>>604 WIN32OLE、完成度高いと思って使ってた。。。
どのへんの実装が微妙なのか教えていただけませんか?
607 :
デフォルトの名無しさん :2009/11/22(日) 07:50:25
>>606 すまん。詳細は忘れたorz
以前に1.8.xのWIN32OLEが実装不十分で正常に実行できないのがあった
その時ググっていたら1.9.xのいくつかで改善されたらしいとどこかに書いてあったのだが・・・
>>606 1.8で使ってるが問題起こったことは無い
他人の意見を鵜呑みにするなという良い例
Windows用の One-Click Installer の 1.9.1 はいつ頃出るのでしょうか。
613 :
569 :2009/11/22(日) 10:45:35
>>612 出所を思い出せないから、本当かどうかは怪しいが
「もう出ないからRubyInstaller使ってね」って話がどこかにあったような
>>598 コマンド起動してもいいなら、mplayer.exe だな。autotestで音鳴らすのに、これ使ってる。
616 :
デフォルトの名無しさん :2009/11/22(日) 11:08:39
すんませんいきなり話題変わります。 Ruby/Tkでエントリーを表示すると その中身は文字列になりますよね? その文字列を数値にして、もしできなかったら(文字でできていたら) エラーを返すにはどうすればいいですか? 計算機みたいなのをつくりたいんです。 初心者ですいません。
ものすごおおおおおく単純には、その文字列が目的の文字だけ含む正規表現にマッチするかどうかを調べる if /[1234567890]+/ =~ str then puts '全部数字です' else puts '数字以外のものが入っています!' end
Integer(str)でよくね
>>618 小数点入れたいというときに少し困る
それに、Integer() も Float() も例外をキャッチしないといけない
例外をキャッチできるような人はそもそもマニュアル読んで自力でできるはず
>>616 の質問の書き方からしてまだそれは無理
だからわざわざ /[0-9]+/ ではなく /[1234567890]+/ と書いた
>>614 どうもです。そうですか、1.91は出ないですか。そう言えば1.87も出てませんね。
自力でコンパイルなんてできないのでOne-Click Installerは本当にありがたかったのですが。
正規表現の戻り読みを使いたかったのですが。
>>617 のだと、マイナスや小数点、指数表記などが扱えないので、
str.to_f
が賢いと思う 文字列で出来ているときは
0.0
が返ってくるので、この時は本当は0が入っているか
再度文字列チェックすればよい
>>621 String#to_f で変換されるものと変換されないものの区別を自分でつけることはできる?
というか既にその処理「バグって」るだろ
最後の処理がとても非本質的
今の自分に必要なものだけ正規表現で通したほうがいい
小数が入って欲しくないかもしれないし、負の数が入って欲しくないかもしれない
>>620 ActiveScriptRubyじゃダメ?
>>618 や
>>621 のような人にはこれを見せることにしてる
irb> p "1_2_3".to_f
123.0
irb> p Integer("1_2_3")
123
>>623 すみません、「ActiveScriptRuby」と「One-Click Installer」ってどう違うのでしょうか?
ちなみに今の1.86は One-Click Installerで入れました。
ActiveScriptRubyの1.9.1安定版って、まだ出てないんじゃなかったっけ
627 :
デフォルトの名無しさん :2009/11/22(日) 13:19:37
>>616 です
有難うございます。
解決しました。
1.8.7を使いたければ、ActiveScriptRubyがいい。 One-Click Installerはまだ1.8.6しかなかったような気がする。
Rubyを使うならMacかUbuntuにしておけ。 Windowsは窓から投げ捨てろ(窓だけに)
晒し
633 :
デフォルトの名無しさん :2009/11/22(日) 22:08:00
あげ
「Windowsは窓から投げ捨てろ(窓だけに)」 き、決まったお (`・ω・´)シャキーン (;´・ω・) あ、あれ・・・ (´;ω;`) ブハッ
636 :
デフォルトの名無しさん :2009/11/22(日) 22:38:45
サブイ
pearlの後だからってrubyもさ(ry
638 :
デフォルトの名無しさん :2009/11/22(日) 23:22:48
画像のサムネイルを作るのに便利なRubyのライブラリはありませんか? レンタルサーバでも使えるように極力別のライブラリをインストールしなくてもいいようなものが良いです
特にはないです サムネイル作成が可能なプログラムをレンタルサーバにインストールして sysytem メソッド等から直接呼んでください たぶん一番早いし速いです
画像処理系は基本的にlibjpegとかlibgifとかのラッパーだからなー。 このあたりは使う前提じゃないと見つからないんじゃないだろうか。
レンタルサーバだと、プログラムのインストールが不可能だったりするし 難しいだろうな PNGならRuby/PureImageで拡大縮小できるが・・・
そういえばRMagickの開発を引き継いだ香具師はまだいないのかな。
画像を外部ライブラリなしで操作できるスクリプト言語ってあんましないよね 実際的な速度で動作するとかまずないし
644 :
デフォルトの名無しさん :2009/11/23(月) 00:28:50
WinXP(Ruby1.8.6) 下記コードで指数の値(val0)を出力したところ、 同じ値(1.0)のまま動きません。原因は何でしょうか? count = 0 while count+=1 break if count > 100 # 100回で終了 sleep 1 val0 = Math.exp(count/10) puts "1sec #{count} #{val0}" end
count/10.0
うおー、空 while なんて2年ぶりくらいに見た Math.exp(count/10) の代わりに count/10 を表示してみればわかるかも
648 :
638 :2009/11/23(月) 00:50:21
やっぱり別のコマンドや画像所理ライブラリが必要なんですね ありがとうございました
>>647 >空 while
ダメって事はないけど
>>644 みたいな例だと
(0...100).each{|count|p count}
とか
Range.new(0,100,true).each{|count|p count}
とか書くのが一般的じゃないかな
でも、自分の好きな方法で良いと思うよ
whileやuntilやloopなどは 条件とか中の処理を間違えると無限ループしてしまう可能性がある 初心者は誤って無限ループを作ってしまうし、慣れた人でも結構気を使う でも、(0...100).each は 中で余程おかしな処理を書かない限りまず無限ループにならない 回数が決まっているループなら、eachを積極的に使ったほうが良いと思うよ
100回って決まってるなら、100.timesを使うなあ。 (0...100).eachってのは何の影響?
>>651 カウンタにこだわらず「なんでもいいから100回」ならそれでいいけど
今回は厳密に「1から100まで」と数字に意味があるからね
ただ書き換えるなら1..100だと思うし、Range.newが一般的というのは同意できない
101回じゃないのか
ループの書き方なんて他人から押しつけられる物じゃないんだし 自分が困ったらよりよい方法を探せば良いだけでしょ #メソッド+ブロックによるループは他言語ではあまり見ない気がするので #Ruby初心者は理解しにくいかもね
>>649 それ101回
わざわざバグらせてくれてありがとう
これで誰が自演してたか明らかになったな
なんで Integer#times のようなものがあるかというと、構成要素が1個で少なくて済むから
Range#each も結果的動作は同じだけれど、開始位置と終了位置の2要素が必要
>>644 が悪手なのは while だからなのではなく
・ 無限 while
・ break で自力で抜ける
・ カウンタを初期化する、初期値は0
・ カウンタのインクリメントはループの初めに書く
・ メインの処理回数は100回で終了する
・ ただしカウンタは100はOKで、100を超えたときにbreakする
というように構成要素がやたら多いから
100.times{|i| … } のほうが間違わなくていいだろ
(1..100) と (1..100) は違うからな ただの罠だが 特に2ch
足りなかったので置いとく .
Rubyってそんな..と...の違いとかバグ産みやすい言語なんかw
実際、.. と ... の機能を分けるのは問題が多いよな ぱっと見で意味が分かりにくいし
やっぱり neko operator のほうがいい? 0 ^..^ 100
ここはきゅうり演算子を実装すべき 0 (::) 100
.. と ... を使い分けるのって perl 由来だっけ? awk だっけ?
>>667 これいいね。rubyでも採用してほしい
>>668 先生!配列の [3, 7] と 閉区間の [3, 7] の区別がよくわかりません!
対応表をよく見て見ろ
Range.newでいいじゃん というかフツーは数字のほうをいじって2ドットで書けるように使うと思う 3ドットはあまり見ない
ここまでこれ以上妙な記法増やすなヴォケというレス無し
これ以上記号ふやすのヤメレ
=!= とか === とか 使ってるのはPHPだっけ?
>>671 ほんとは記号のほうをいじるべきなんだけどね
さすがに紛らわしい
そこでAPLですよ
>>674 =!=じゃなくて!==な
暗黙の型変換をしないで厳密に比較する演算子
678 :
デフォルトの名無しさん :2009/11/23(月) 13:36:54
CGIやその他から受け取った入力を同じ形式でファイルにダンプ(Marshal使用)し、 後で取り出すプログラムを書いています。 取得時にはダックタイピングで区別なく保存データを作成していますが、 別のタイミングで復元しようとすると、CGIからの入力に関してCGIモジュールの依存が残っていて(?) "CGIモジュールがない"とエラーになってしまいます。 保存時にto_sなどを加えてみたのですが、変わりません。 純粋に文字列だけを取り出し、CGIオブジェクトの依存を切るにはどうしたらいいのでしょうか? Ruby1.8.7です。
>>678 ・ Marshal.load する前に、復元後のオブジェクトが存在するために必要なクラスを含む全モジュールを require しておく
・ 必要なデータだけを適当なキーの Hash オブジェクトにでもまとめ、その Hash だけをまーしゃるする
後者推奨
>>678 まず第一に、今あえて古い cgi.rb を使うのはおすすめしない
webrick/cgi や Rack に切り替えた方がいいと思う
で、純粋な文字列を取り出す方法としては、次の手がある
pure_str = String.new(cgi['key1'])
>>679 それだと結局、CGIの依存は切れないんじゃ?
681 :
678 :2009/11/23(月) 15:13:19
>>679-680 ありがとうございます。
実は
>>679 で挙げていただいた後者の方法をとっていました。
>>680 に挙げていただいたStringを新たに生成する方法で解決できました。
webrick/cgi、Rackともノーチェックでしたので、これから確認してみようと思います。
ありがとうございました!
コマンドプロンプトでtest-specをインストールしようとしたら下記のようなエラーが出ます 二日間何回か試してるのですがインストールできません 403エラーではないのでしょうか・・・ C:\Documents and Settings\Owner>gem install test-spec ERROR: While executing gem ... (Gem::RemoteSourceException) HTTP Response 403
gem install --verbose でやってみて。
やってみます!
こういうの見るとやってから書き込めよといつも思う
>>685 --verboseつけたら解決するかも! とか初心者に分かるわけねーだろ
解決というより、状況がより詳しく分かる、ってだけだがな。
>>686 やってみますのレスはいらないってことでしょ
まったく返事がなかったらなかったで 回答者は不安に思うかもしれないから多少の合理性はある だいいちたった一行のレスにそんなに目くじらたてることでもないでしょ
ねえよ どんだけ秒速の世界に生きてんだよ
2ちゃんをチャットと勘違いしてるアホなんだろ
691は余裕のない世界に生きてる人なんですね
フグ毒って怖いんだね
当方Windowsで開発をしています
ruby script/serverを実行した際に
C:\rails\hello>ruby script/server
=> Booting Mongrel
=> Rails 2.3.4 application starting on
http://0.0.0.0:3000 => Call with -d to detach
=> Ctrl-C to shutdown server
でコマンドプロンプトが停止したまま動かなくなります
Ctrl-Cをしてもサーバーは停止できません
一度だけこの状態で長時間放置したときに
500 Internal Server Error
unknown error
という表示がされました
解決方法がさっぱりわかりません
どなたか知っている方がいれば教えていただけるとありがたいです
>>690 それって要するに書いても書かなくても同じくらい不快を与えかねないってことだから、
最適化する意味で、やっぱり書かないのがベターだな。
>>695 Railsはスレ違い
あとコマンドプロンプトが「何も入力できない」状態になるのはそりゃ当たり前なんじゃね
まるち
マルチ氏ねはともかくCtrl+Breakで止まるといいね
acceptに入っちゃうとCtrl+Cで止まらないんだよねぇ・・・
701 :
デフォルトの名無しさん :2009/11/24(火) 15:01:13
関数を後から呼び出せるクラスをつくりたいのですが、 引数がある場合にどう書けばいいのか分かりません。 できればリファレンスなども教えてください。 よろしくおねがいします。 ####################### def f(x) puts x end class Foo def initialize(h) @h=h end def bar(x) @h(x) end end foo = Foo.new(f) foo.bar(7)
>>701 それなんて Proc ?
def f(x)
puts x
end
foo = Proc.new {|arg| f(arg) }
# 百年後
foo.call('Hello!')
704 :
デフォルトの名無しさん :2009/11/24(火) 15:31:52
Procのことよく分かってないのでアレですが、 もうちょっと込み入ったことがやりたかったようなので、 やっぱりクラスは定義したいのですが・・・。 数学で言うと、f(x)を元手にして nにかんする関数の族 {lambda {|x| n*f(x)}_n を作りたいわけです。 ############################## def f(x) x end class Foo def initialize(g) @g = g end def bar(c) lambda {|x| c*@g(x)} end end foo = Foo.new(f).bar(2) foo.call(7) =begin # It Works! foo = lambda {|x| 2*f(x)} p foo.call(7) =end
>>704 def f
Proc.new{|x|x}
end
class Foo
def initialize(g)
@g = g
end
def bar(c)
lambda {|x| c*@g.call(x)}
end
end
foo = Foo.new(f).bar(2)
foo.call(7)
こういう事ではなくて?
706 :
デフォルトの名無しさん :2009/11/24(火) 15:48:47
>>703 すばやい回答ありがとうございます。
>>705 これでほとんどできてますが、
f(x)の中身がややこしいので、そこはそのままいきたい。
def f(x) p x end
のままで、Foo.new(f.to_proc).bar(2)
で渡そうとしたのですが、引数の数が違うと怒られます。
う〜む・・・。
class Foo def initialize(&block_arg) @g = block_arg end def bar(c) lambda {|x| c*@g.call(x)} end end def f(x) x end foo = Foo.new(&method(:f)).bar(2) foo.call(7) foo = Foo.new{|x| x }.bar(2) foo.call(7)
708 :
デフォルトの名無しさん :2009/11/24(火) 15:50:37
あぁ、そうか、fはProcを返さないといけないのか・・・。 簡単に書けないのかなぁ・・・。
ミスった、ブロック呼び出しをサポートはこういう目的 foo = Foo.new{|x| f(x) }.bar(2)
コンビネータとかカリー化とか出てきそうな予感
711 :
デフォルトの名無しさん :2009/11/24(火) 15:59:59
>>707 視認で変更したら通らないので、コピペしたら
methodにわたすfの前にコロンがついていました。
アンドとコロンの意味は不勉強につき分かっていませんが、
これで完全に解決です。
ありがとうございました。
712 :
デフォルトの名無しさん :2009/11/24(火) 16:03:45
>>709 おぉっ!
綺麗にかけますね。
ちなみに私はC++のヘビーユーザーですが、
Rubyの簡潔さに浮気しています。
713 :
デフォルトの名無しさん :2009/11/24(火) 16:26:36
ルヴィーの素晴らしさを教えてください。 僕は開発者が日本人なのが誇らしくて使っていますが、 皆さんはどうでしょうか。
Rubyの標準クラスライブラリは重武装で便利だけど バイナリとして配布しようとするとだいぶ冗長になってしまう・・・ 標準クラスライブラリがもうちょっと細分化されたビルドって無いですかね? プラットフォームはWin32です
LLVMを使って自作の実装を作るんだ!
なんでLLVMが使われないんだろうな。 YARVをマルチコア対応に書き換えるよりは手間もかからんし パフォーマンスも向上すると思うが。
rubyでstatic変数の代わりになるような手段は何か用意されて無いですか? やりたいことはLispみたいに クロージャに状態を持たせるようにしたい
状態を入れた各オブジェクト(自作クラスのインスタンスが良いと思う)に 例えばcallって感じで、それぞれ同じ名前の特異メソッドを定義 後は呼ぶ時にはcallを呼べば良い class MyState attr_accessor :state def initialize(init_state) @state = init_state end end hoge = MyState.new(0) def hoge.call @state += 1 return @state end fuga = MyState.new('hello') def fuga.call if @state == 'hello' then @state = 'world' else @state = 'hello' end return @state end ary = [hoge, fuga] 10.times do ary.each do |state_proc| p state_proc.call end end
>>718 Lisp みたいにクロージャを使えばいいじゃない。
lambda とか proc とかつい最近でも言ってるじゃない。
irb(main):007:0> def make_counter irb(main):008:1> counter = 0 irb(main):009:1> lambda {counter += 1} irb(main):010:1> end => nil irb(main):011:0> c = make_counter => #<Proc:0x7ff86090@(irb):9> irb(main):012:0> c.call => 1 irb(main):013:0> c.call => 2 irb(main):014:0> c.call => 3
Rubyは昨今のマルチコアCPUプラットフォーム上での効率的なプログラミングをサポートしますか?
>>722 ほ〜そんなことができるのか
あんま理解してないけどlambdaおもしろそうだな
>>723 MRIやYARVは対応していません
他の実装は知らん
>>722 やりたかったのはそれです・・!
rubyすげ・・
ある画面上の点Aから画面上の点Bへ線を引くメソッドを作ったのですが アンチエイリアスをかけていないので線がギザギザなんです def draw_chart_line(start_x, start_y, end_x, end_y, color) distance = (start_x - end_x).abs + (start_y - end_y).abs for i in 1..distance x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i #set_pixelはその座標に指定した色をつけます set_pixel(x, y, color) end end これで一応線は引けるのですがアンチエイリアスをrubyで記述するのは難しいでしょうか? もっといいやりかたがあればそれも参考にしたいです よろしくお願いします
>>727 それはRubyの質問ではなくて画像処理プログラミングの質問ではないのか?
〜のようなアルゴリズムをRubyで記述したいとからなともかく
#Ruby(インタプリタ全般に言えることだが)で画像処理は遅いぞー
適当に中間色置けばーとか適当な返事
Rake であるタスクを行う前に,依存関係のない別のタスクを 実行させるにはどうしたらいいでしょうか? タスクを実行するまえに,clean したい...
だいたいオブジェクトってなんですか?
>>732 たくさんプログラムを書けばそのうちわかってきます
>>731 依存関係のないタスクは呼び出されないのが当たり前。だって依存関係がないんだから。
呼び出したかったら、自分で明示的に呼び出すしかない。
>>726 >やりたかったのはそれです・・!
>rubyすげ・・
このくらい、ほかの多くの言語でも出来る。さほどRubyの強みというわけでもない。
rake のいちばん根っこの部分の記述はとても原始的
むしろクロージャーのないスクリプト言語を探すほうが難しいよね
737 :
731 :2009/11/25(水) 11:47:46
あるタスク内から,別のタスクを明示的に呼び出す方法を 教えていただけないでしょうか?
Rake::Task['タスク名'].invoke
>>739 >発表では、増村容疑者は昨年10月17日頃、デジタル録画画像のコピー制限を解除
>し、無制限にダビングできるソフトを、松山市内の大学生(19)に650円で、茨
>城県内の男性会社員(28)には850円でそれぞれインターネットを通して販売
>し、著作権を侵害した疑い。
もし、無制限にダビングできるソフトを無料配布していた場合は、どうなったのだろうか?
てゆーか、今後は、無料配布されるようになるでしょ。
742 :
731 :2009/11/25(水) 20:33:45
dl/importのexternで定義されるメソッドの動きが変な気がするのですが・・・ require 'dl/import' module Win32 extend DL::Importable dlload 'user32.dll' typealias('HWND', 'void *') typealias('LPCTSTR', 'unsigned char *') typealias('UINT', 'unsigned int') extern 'int MessageBox(HWND, LPCTSTR, LPCTSTR, UINT)' end include Win32 messageBox(nil, "text", "title", 0) => (eval):2:in `messageBox': undefined method `[]' for nil:NilClass (NoMethodError) from test.rb:11 defによる定義ならincludeすれば呼べたと思うのですが どうすればincludeして呼べるようになりますか?
slice が使えない件: C++で valarray を使うと、 完全シャッフル(注:ランダムシャッフルではない)が次のように書けますが、 Ruby の slice は stride (添字の読み飛ばし)が設定できません。 第三引数として標準化してほしいと思いませんか? ・・・あるいは可読性の高い簡潔な実装をご存知でしたら教えてください。 ############################################### #include <iostream> #include <valarray> using namespace std; int main() { int N=1<<6; valarray<int> foo(N); for (int i=0; i!=N; ++i) foo[i]=i; slice evn(0,N/2,2),odd(1,N/2,2); // 第三引数に注目! valarray<int> ef=foo[evn],of=foo[odd]; foo[slice(0,N/2,1)] = ef; foo[slice(N/2,N/2,1)] = of; /* efとofはスワップに使ってるだけなので、 Rubyならこう書きたい foo[slice(0,N/2)],foo[slice(N/2,N/2)] = foo[slice(0,N/2,2)],foo[slice(1,N/2,2)] */ copy(&foo[0],&foo[0]+N,ostream_iterator<int>(cout," ")); cout << endl; return 0; }
>>744 C++の関数がよくわからないんで読み間違ってるかもしれないけど
Enumerable#partitionかなあ
>>745 お返事ありがとうございます。
partition もそうなのですが、
ブロックの引数って item になってるんですよね。
つまり上の例では partition でやっても同じなので分かりにくいですが、
a = ["R", "U", "B", "Y"]
を
a = ["R","B","U","Y"]
にしたいときには index を知りたいわけです。
現行のRubyで素直な方法は
evn = Array.new(a.size/2) {|i| 2*i}
odd = Array.new(a.size/2) {|i| 2*i+1}
をあらかじめ作っておいて
a = a.values_at(*evn) + a.values_at(*odd)
っていう感じですけど、とにかくslice が使えないのが不満なのです。
冗談きつい
説明が致命的にわかりにくいな 俺ならこう聞く 「配列のindex番目の要素からlength個の要素を間隔strideで抽出する slice(index, length, stride) はありますか? たとえば %w(a b c d e f).slice(0,3,2) は ["a", "c", "e"] を返し、 %w(a b c d e f).slice(3,2,1) は ["d", "e"] を返します」
with_index
質問者本人ですが、 今作ってみたら基本的には(例外とか抜きで)これだけなんですけど。 newでコストかかってると思うので、参照にできないでしょうか? 初心者なので、お助け願います。 ################################## class Array def slice(start,size,stride) Array.new(size) {|i| self[start+i*stride]} end end a = ["R", "U", "B", "Y"] puts a a = a.slice(0,a.size/2,2) + a.slice(1,a.size/2,2) puts a
+するならどっちにしろオブジェクト生成は不可避だろうさ。 というか、やりたいのはもしかしてsliceじゃなくてsortなんじゃない?
>>749 まあそんなとこだろうな
処理全部自前だからめんどくさいが
class Array
def slice2(index, length, stride)
res = Array.new
self.each_with_index do |e, i|
res << e if ((index <= i) && (res.size < length) && ((i - index) % stride).zero?)
end
res
end
end
p ["a", "b", "c", "d", "e", "f"].slice2(0,3,2) #=> ["a", "c", "e"]
p ["a", "b", "c", "d", "e", "f"].slice2(3,2,1) #=> ["d", "e"]
ていうかそもそもこれでいいのか? なんか需要違わね?
>>748 たしかにRubyのスレなのにC++の生コードを投下したのは申し訳なかったです。
>>749 うわっ
1.9でEnumeratorとArrayの行き来がはげしくなっている。
こんなんか。
a.each.with_index {|x,i| p x if i%2==1}
えぇっと、ブロックの中身から配列作るのってできますか?
>>751 あっそうか。コストはいいことにしよう。
偶indexを前にもってくる、というsortもできそうですけど、
順序の指定が面倒くさそうなので試してません。
p %w(a b c d e f).sort_by.with_index {|o, i| i % 2 * 100000 + i} 汎用性とか知ったことか
>>752 ありがとうございます。
> ていうかそもそもこれでいいのか? なんか需要違わね?
そもそもの課題はというと、indexに関する条件を簡単にブロックで渡して部分配列が戻ってくればいいんです。
問題がsortっぽいから紛らわしいですけど。
データの参照先となる配列インスタンスを1つ持ち、 [], []=, each などを与えられたブロックを使って定義するような Arrayのサブクラスを定義して、Array#mysliceでそれを返せば いいのかなー。
>>755 うぉっ!
おそるおそるゼロを消してみたり・・・。
ブロックがなんで後回しにできるのか理解できていません。
マニュアル読んでみます。
>>757 仕様っぽい、
のがスラスラ出てくるのが
プロっぽい。
改めて考えてみると、sliceじゃなくて
>>756 >>757 が欲しいものだった気がします。
引数を増やすというのは発想がC的ですよね。
ブロック指定のほうが柔軟性があってRubyっぽいと思います。
761 :
744 :2009/11/26(木) 01:38:08
あ、できた気がする。 a = a.select.with_index {|_,i| i%2==0} + a.select.with_index {|_,i| i%2==1}
762 :
744 :2009/11/26(木) 01:50:56
予想通りではありますが、 # test.rb a = Array.new(1<<12) {|x| x} a = a.select.with_index {|_,i| i%2==0} + a.select.with_index {|_,i| i%2==1} # test2.rb a = Array.new(1<<12) {|x| x} a = a.sort_by.with_index {|o, i| i % 2 * a.size + i} ---------------------- $ time ruby1.9 test.rb real 0m0.022s user 0m0.015s sys 0m0.006s $ time ruby1.9 test2.rb real 0m0.027s user 0m0.020s sys 0m0.006s ###################### というわけで、若干ソートの方が遅いようです。 オーダーはどうなってるのか知りません。
763 :
744 :2009/11/26(木) 02:11:05
もひとつ投入っと。 たぶんこれがベストと思います。 ここにきて745に戻ってめでたしめでたし。 $ cat test3.rb a = Array.new(1<<12) {|x| x} a.partition.with_index {|_,i| i%2==0}.flatten $ time ruby1.9 test.rb real 0m0.022s user 0m0.015s sys 0m0.007s $ time ruby1.9 test2.rb real 0m0.027s user 0m0.020s sys 0m0.007s $ time ruby1.9 test3.rb real 0m0.021s user 0m0.015s sys 0m0.006s
764 :
744 :2009/11/26(木) 02:14:53
結論としては、 「slice 使えね〜」 っていう・・・orz self[] との差が見いだせないんですけど・・・
765 :
744 :2009/11/26(木) 02:25:45
眠いのでここまでにします。 みなさまのアドバイスをすべて消化した結果です。 本当にありがとうございました。 このイディオムは部分配列、部分行列にかんしては威力を発揮すると思います。
sort_byを使って降順にする方法ってあるのでしょうか? words = %w(apple banana orange mango) sorted_words = words.sort_by{|a| ??? } p sorted_words #=> ["orange", "mango", "banana", "apple"]
sorted_words = words.sort_by{|a| a}.reverse というかこの例ならこれでいい sorted_words = words.sort{|a, b| b <=> a}
769 :
デフォルトの名無しさん :2009/11/26(木) 11:07:43
はわわわわー
RSSのURLのリスト与えて更新のあったもののリストを返すRSSチェッカーのサンプルってどっかにないですか?
サンプ…ル…?
思いっきりアプリケーションだな(w 適当なRSSチェッカーのソース読めばいいのではなかろうか
RSSに特化してないが五月雨とか
>>646 激しく遅レスだが、空 while なんて文法は Ruby にはない。
778 :
デフォルトの名無しさん :2009/11/26(木) 20:32:59
Rubyでtxtファイル内の文字を数えるプログラムを作っています その都度ファイルを指定してプログラムを動かすことはできるのですが、 あるディレクトリ内のtxtファイルを一度に処理し、それぞれのファイルごとの 結果を表示させるようにするにはどうすればいいですか? 自分で作ってみたのがこれです #! ruby -Ks count = Hash.new(0) mojishu_count = Hash.new(0) sum = 0 while line = gets words = line.split(//) sum += words.length words.each{|moji| count[moji] += 1 case moji when /[a-z]/ || /[A-Z]/ || /\d/ mojishu_count['4.英数字'] += 1 when /[ぁ-ん]/ mojishu_count['1.ひらがな'] += 1 when /[ァ-ン]/ mojishu_count['2.カタカナ'] += 1 when /[亜-腕]/ mojishu_count['3.漢字'] += 1 else mojishu_count['5.その他'] += 1 end}end mojishu_count.sort{|a,b| a[0] <=> b[0] }.each{|key, value| print "#{key}: #{value}\/",sum,"…(",value*100/sum,"%)\n"}
>>778 あまりに汚くて読んでないけど
ぱっとみエロい
782 :
デフォルトの名無しさん :2009/11/26(木) 21:00:49
あぁん!
うむ、該当課題に心当たりがある 宿題スレ向き
>>778 p Dir::entries("c:\hoge") でファイル名の配列を取得して、ファイルopenでOK?
>>568 亀な上に便乗。自分は
>>564 じゃないけど
クラスを継承して作ったインスタンスが自身のメソッドで自身を書き換えるってヤバイの?
>>786 self を別のオブジェクトに書き換えるのは変だし、そんなメソッドはそもそも Ruby にはない
通常そういう用途で望まれる動作は
「aaa という変数名に = を使って目的の状態のオブジェクトを再代入する」
であるはず
ある変数が指し示しているオブジェクトが、再代入操作なしに別のオブジェクトに切り替わってたら大騒ぎ
確かレシーバのクラスを変えてしまうメソッドが1つ無かったっけ? まあ、どっちにしてもかなり例外的な事例だけど。
Object#become のこと? (ないけど)
File#reopenかな
791 :
デフォルトの名無しさん :2009/11/27(金) 17:01:02
rails2.3.5
792 :
786 :2009/11/27(金) 18:41:22
>>787-790 レスありがとう
でも、標準クラスに自身を変更している(ように見える)メソッドがありますよね?
後ろに!が付くメソッドとかArray#clearとかってどういうどうなっているのかなと思いました
>>792 あれはselfに別の何かを代入しているわけじゃないから。
ブロックの instance_eval じゃない?
>>778 適当でごめん
#! ruby -Ks
def count_by_char_and_kind(io)
count_by_char = Hash.new(0)
count_by_kind = Hash.new(0)
sum = 0
io.each_line do |line|
chars = line.split(//)
sum += chars.length
chars.each do |char|
count_by_char[char] += 1
case char
when /[a-z]/ || /[A-Z]/ || /¥d/ ; kind = '4.英数字'
when /[ぁ-ん]/ ; kind = '1.ひらがな'
when /[ァ-ン]/ ; kind = '2.カタカナ'
when /[亜-腕]/ ; kind = '3.漢字'
else ; kind = '5.その他'
end
count_by_kind[kind] += 1
end
end
return count_by_char, count_by_kind
end
後半へつづく
つづき def print_by_kind(count_by_kind) count_by_kind.sort_by {|k,v| k[0] }.each {|key, value| puts "#{key}: #{value}¥/",sum,"…(",value*100/sum,"%)" } end if __FILE__ == $0 if ARGV.empty? count_by_char, count_by_kind = count_by_char_and_kind($stdin) print_by_kidn(count_by_kind) else dir = ARGV[0] Dir.glob("#{dir}/*.txt").each do |filename| File.open(filename) do |f| count_by_char, count_by_kind = count_by_char_and_kind(f) print_by_kidn(count_by_kind) end end end end
>>792 a = [:a]
b = a
p a, b, a.object_id, b.object_id
a.clear
p a, b, a.object_id, b.object_id
a << :a
p a, b, a.object_id, b.object_id
a = []
p a, b, a.object_id, b.object_id
変数の(再)代入とオブジェクトの状態の変化には大きな違いがあることに
この例で気づいてもらえるかもしれない
ちなみに単純化した配列もどき(一個しか値を持てない)でclearとかを書いてみるとこんな感じ
破壊的メソッドがやってることなんて特別でも何でもなくこの程度
class ArrayModoki
def [](k)
@data
end
def <<(x)
@data = x
end
def clear
@data = nil
end
end
あーついでにいっておくと、こういうのはもうクラスを作った方がすっきりするからね。 class CountChars def initialize @count_by_char = Hash.new(0) @count_by_kind = Hash.new(0) end def count(io) # カウントして @count_by_char と @count_by_kind を設定 return self end def print # @count_by_kind の値を出力 return self end end if __FILE__ == $0 dir = ARGV[0] Dir.glob("#{dir}/*.txt").each do |filename| File.open(filename) do |f| CountChars.new.count(f).print end end end
はやくパッチレベル上がらないかなあ
>>802 > You cannot use the Twitter website without having JavaScript enabled on your web browser.
> Please re-enable JavaScript and refresh this page.
今まで気にしていなかったけど、C言語のインクリメント/デクリメントって使えないのな。 i = 0 i++ じゃなくて↓を使う: i += 1
うん、どうやって実装していいかわからんという理由でスルーされてる 見かけ同じで動作がちょっと似てるが細かい挙動はぜんぜん違う、みたいなのだったらないほうがましだし
>>806 ML見てきたけど、実装が困難というのは技術的な問題じゃなくて、
変数がオブジェクトではないRubyで、どのようにして一貫性を持たせるか
という問題で実装されていない、と。
attr_* や private の轍を踏むわけにはいかんからなw 名前同じである側面では他言語のと同じ動作だが実際の挙動は全然違って、 他言語のと同じつもりで使った人から非難轟々
大半の要望は ++i と i++ の区別もついてないような人からだしな。
ああ、あれはないわ
C言語でライブラリを作ってRubyから使いたいのですが、どうすればできますか ググレカスでもいいのでキーワードだけでも教えてください。
ruby 拡張ライブラリ
++i と i++ は結果的には一緒だろ *++i と *i++ なら違うけど
どうしてポインタになった
>>813 結果的に?その結果…もとい、戻り値が違うだろ
前置と後置の2種類ある時点で、なにか動作違うのかもとか立ち止まって欲しいよね
初心者だと難しいと思うよ。 そもそも「単項演算子」という概念が無い時点で i++ と ++i は同じものと考えてしまう人が多いように思う。 「えっ、1+3 も 3+1 も同じだよね?」
あと、入門書とかでも前置/後置の違いの説明はするものの 使用例というか、実際的な問題でどのように使われるかという例示がないものが多いのが原因かな。 初心者だと 「え、何で二つあるの。どういう時に使うの。わかんねーから適当でいいや。」 でスルーしちゃう人が多いのよ。
いやそのなんつーか、 「××言語の○○の機能が欲しいです」という意見があった場合、 その人が××言語の、最低限○○機能自体はよく理解してるというのは絶対的条件だと思うが なんで「その人」に××言語の○○の機能の説明をこっちがしないといかんのよ
前から思ってたんだが、 全治と河内があるのなら+i+があってもいいよね。
配列を操作していると1,2時間停止するのはあり?
処理の内容と環境次第
うむ 次の質問の方どうぞ
水橋演算子と命名
google web apisをrubyで使用するプログラムがちょっと古い本に載ってて web apisを書かれてあるURLへDLしに行ったんですがそのページはありませんでした。 今はもうweb apisは無くなってるんですか?
>>827 Ajax APIで置き換えられたっぽい
+ + j
>>828 わが国のITはユーザに使用法を十分説明する時間がありません。
このため、初心者がベテランに疑問についてたずねる光景を目にすることがあります。
しかし本来は事故(情報漏えいなど)が発生した場合の責任は、
接続業者、サーバ運営者、システムを開発したエンジニアにあります。
メーカあるいは購入店にたずねるべきです。
利用者の仕事は自治(掲示板の秩序を守ること)です。助言を行ってはなりません。
素人が専門技術に言及するのは「親切」ではありません。「無責任」です。
海外のプロフェッショナルは、「私の仕事ではない」と答えるはずです。
機械翻訳みたいな文章だなー
ary[0,1,2] ary[:last] = 4 こういうのないですか?(。・ω・)
ary[-1] = 4
>>832 ary[-1] = 4
じゃダメなの?
>>832 ary[0,1,2]の意図が不明なので説明しる
A: aryの0番目の要素(Array)の1番目の要素(Array)の2番目の要素 => ary[0][1][2] B: aryの0番目、1番目、2番目の3要素からなるArray => ary[0..2] (引数はRange) C: aryの、0番から数えて3つの要素からなるArray => ary[0, 3] (引数は整数2つ) D: その他
D': ary = [0, 1, 2] そういえば [0, 2, 4, 8, 6] や [3, 6, 9, 12, 15] みたいな配列を作りたい場合どうするんだっけ
Array.new(5) {|i| (i + 1) * 3 } どうするっても色々あるが、とりあえず後者はこんなとこで 前者はなかなかの難問だな
>>837 どうにもなんね
irb> p Range.new(0, 4).to_a.map{|e| e*2}
[0, 2, 4, 6, 8]
irb> p Range.new(0, 9).to_a.find_all{|e| e%2 == 0}
[0, 2, 4, 6, 8]
こんな感じ
>>838 ,839
サンクス
もしかしたら Array.new(start, stop, step) みたいに一発で書けるのがあるのかなーと思って
>>832 これのことかなー
ary.push 4
>>840 (0..8).step(2).to_a
1.8.6だとRange#stepにブロック必須だからきれいに書けなさそう
>>840 irb> 0.step(8, 2).to_a
[0, 2, 4, 6, 8]
これも 1.8.6 では動作しないはず
ary.values_at(0, 1, 2) というのもあったな。
846 :
840 :2009/11/29(日) 16:54:32
>>842 ,843
たびたびサンクス
でも正直なところ漏れのダメ脳にはフィットしませんですた
dir = Dir.foreach(".") do |file| (中略) end こういう式を、書籍で見たのですが、 Dir.foreach(".") do |file| (中略) end なのは見慣れているのですが dir = ってどういう意味なんでしょうか。 単にdir変数に現フォルダのフォルダ名を 入れて、逐一file変数に放り込んでるだけですか? 意味が無いような。。
Dir.foreach は nil を返すので、それ以降 dir を参照しているとしても あまり意味ないね。
うん、実行して確かめずに本を書いてる人は一定数いる
Rubyは糞本が多い
亀田戦のため… と思ったのに 即答、ありがとうございます。 感謝
852 :
デフォルトの名無しさん :2009/11/30(月) 03:58:59
Ruby1.8.6です。 小数の16進表示はRubyでは不可なのでしょうか? valA=3.14 valB=valA.to_s(16) とすると、ArgumentErrorになりました。
どう表示されたら正解なんだい?
>>852 Rubyでは、というからには他の言語ではできるの?>小数の16進表記
できるんなら 3.14
浮動小数点数のビット列の16進表現=小数の16進表記 という
855 :
854 :2009/11/30(月) 10:55:07
ミスったw Rubyでは、というからには他の言語ではできるの?>小数の16進表記 できるんなら 3.14 はどう表記される? 浮動小数点数のビット列を16進で表示したもの=小数の16進表記 ということではないよね?
変換ができる言語はちょっと検索しただけでは見つからなかったけど、 浮動小数点の定数の16進表記はC99ではできるね。 3.23d... になると思うけど。
たとえば10進の 0.5 は (0.5).to_s(16)すると 0.8 になればいいのかな?
こんな感じ?もっとうまく書けそうだけど。 x = 3.14 a = x.to_i.to_s(16)+'.' b = x.abs-x.abs.to_i c = 1.0/16 while c > Float::EPSILON p = (b/c).to_i a << p.to_s(16) b = b-c*p c = c/16 end puts a
bcd ならめちゃ簡単なんだけどな 多分そういうことじゃないんだろうな
基数が違うと、1未満の分解能が違ってくるからなー。 たとえば 0.75(10) => 0.5(10) + 0.25(10) => 0.8(16) + 0.4(16) => 0.C(16) のようなのは正確に変換できるけど。
もともと内部ビット列2進を10進表現したものだからあまり気にしても しょーがない。
862 :
852 :2009/11/30(月) 16:57:52
そういえば、Rubyの開発会議で誰かが16進浮動小数点数リテラルの導入について話してたことがあったなあ。
>>858 掛け算を増やしたほうが効率いいかな?
x = 3.14
a = x.to_i.to_s(16)+'.'
b = x.abs-x.abs.to_i
c = 16.0
while b > Float::EPSILON
break if b == 0
p = (b*c).to_i
a << p.to_s(16)
b = b-p/c
c *= 16
end
puts a
865 :
デフォルトの名無しさん :2009/11/30(月) 18:06:42
リスパダールという薬を飲むと、頭が冴えてきて プログラムがうまくできるようになる
>>858 >>864 Float演算だと誤差が蓄積するので、分数演算にしてみた
require "Rational"
class Float
def to_base( base, precision = 10 )
base_float = self.to_i.to_s(16) + '.'
fractional = self.abs - self.abs.to_i
shift_to_int = 10**(fractional.to_s.length - 2)
remainder = Rational( (fractional*shift_to_int).to_i, shift_to_int )
base_power = base
precision.times do
break if remainder == 0
carried_remainder = remainder * base_power
carry = carried_remainder.to_i
base_float << carry.to_s(base)
remainder -= Rational(carry, base_power)
base_power *= base
end
base_float
end
end
puts 3.14.to_base(16, 12)
やめないで
1/0とか∞とかはどう表現するの?
>>868 1.0/0
irb> p 1.0 / 0
Infinity
irb> p -1.0 / 0
-Infinity
irb> p 0.0 / 0
NaN
定数的に利用することはできない(Float::INFINITY とかがあるわけではない)
実際に適当な計算をして返り値を利用する
16進数の小数点って初めて聞いた・・・ 何に使われるんだろう?
基本情報の試験にも普通に出るぞ
…まあ、おおむね概念的なもんで、ふつーにプログラミングしてるぶんにはまずお目にかからない これが必要になる分野なんて限られてるはず が、自力で導き出せるのが好ましい
こういうことになるのか? 10進数 1.0、0.9、0.8、0.7、0.6、0.5、0.4、0.3、0.2、0.1…… 16進数 1.0、0.F、0.E、0.D、0.C、0.B、0.A、0.9、0.8、0.7……
>>874 そうだよ
10進数との対応をとろうとさえしなければそれほど難しいものではない
そういや情報処理で問題があったなと思ってぐぐった
16進小数 2A.4C と等しいものはどれか。
ア 2^5 + 2^3 + 2^1 + 2^(-2) + 2^(-5) + 2^(-6)
イ 2^5 + 2^3 + 2^1 + 2^(-1) + 2^(-4) + 2^(-5)
ウ 2^6 + 2^4 + 2^2 + 2^(-2) + 2^(-5) + 2^(-6)
エ 2^6 + 2^4 + 2^2 + 2^(-1) + 2^(-4) + 2^(-5)
なるほど。0.1は16進数では16^(-1)、2進数では2^(-1)になるわけか。 0.01はそれぞれ、16^(-2)、2^(-2)と…… 小数点以下なんて考えたこともなかったぜ
>>876 というか、ふつうの10進数の小数部自体、0.abc… = 10^(-1)*a + 10^(-2)*b + 10^(-3)*c + … だからな
2進数なら底(「xのn乗」のxの値、テイ、基数)が10ではなく2になって、16進数なら底が16になる
そんだけ
たったそんだけ
>>875 は
(16^1)*2 + (16^0)*A + (16^-1)*4 + (16^-2)*C =
((2^4)^1)*2 + ((2^4)^0)*(2*2*2+2) + ((2^4)^(-1))*(2*2) + ((2^4)^(-2))*(2*2*2+2*2)
(2^4)*2 + 1*(2^3+2^1) + (2^(-4))*(2^2) + (2^(-8))*(2^3 + 2^2)
2^5 + 2^3 + 2^1 + 2^(-2) + 2^(-5) + 2^(-6)
よって ア
なるほど分からん
>>864 w=3.14
kisu=16
keta=12
sprintf("%d.%s",w,(w % 1 * kisu ** keta).to_i.to_s(kisu))
>>879 X sprintf("%d.%s",w,(w % 1 * kisu ** keta).to_i.to_s(kisu))
○ sprintf("%s.%s",w.to_i.to_s(kisu),(w % 1 * kisu ** keta).to_i.to_s(kisu))
881 :
デフォルトの名無しさん :2009/12/01(火) 10:54:42
質問です。 s = "hoge" p s.is_a?(String) の結果がtrueになることが、納得できないのですが。 StringクラスのオブジェクトはStringクラスとis-aの関係なんでしょうか?
a string is a string だぞ。当然じゃないか
>>881 "hoge".kind_of?(String) が true だったら納得してもらえる?
884 :
デフォルトの名無しさん :2009/12/01(火) 11:15:15
たぶん class MyString < String ; end MyString.is_a?(String) がtrueになるべきとかが言いたいんだと思う
instance_of? もあるからな…
まあ、なんだ、一応字面としては uri = if param.kind_of?(URI) then param else URI.parse(param) end は動作せずに uri = if param.class.kind_of?(URI) then param else URI.parse(param) end か uri = if param.instance_of?(URI) then param else URI.parse(param) end とのみ、書けるべきではある is_a? ではなく kind_of? が主流になりつつある理由もこのへんが結構あるんではないかとか邪推
Rubyのis_a?はそういうものだと覚えるしかないんじゃないか
a dog is an animal 何かおかしなところある?
Wikipediaに乗ってるようなis-a関係は オブジェクト指向でクラスとクラスの継承関係を表すもの Rubyではそうじゃないから違和感があるのはわかる
クラスもオブジェクトであるというのが変なとこで弊害に
>>889 Rubyでもそうじゃないの?
3.14.is_a?(Float), (Numeric), (Object) ぜんぶtrueになるけど。
一般的なオブジェクト指向解説書での「is a関係」がクラス間の関係を表すからおかしいんだよな。 Nobita is a Strudent. はいいけど Student is a Person. はおかしいもん。 「is a関係」がインスタンス-クラス間の関係を表すように定義してほしかった。
is-aの関係であるなら、それはRubyでは継承で表されるべき ただし、継承がis-aでなければならないという意味ではない
>>893 一般的なオブジェクト指向の概説上は、インスタンスの存在はわりとどーでもいいんで…
1.8.xの変数と定数についてですが、たとえば foo = Array.new FOO = Array.new でインスタンスfoo及びFOOの挙動に違いはないという認識であっていますか? どちらもArrayの中身を自由に書き換えられるようですが・・・
>897 中身は自由に書き換えることができる。 参照先を変えることができないのが定数。 例えば、その後にもう一度FOO = Array.newとかしようとすると怒られる。
>>897 再代入によってオブジェクトIDを切り替えると警告される
それだけ
irb> a = Array.new irb> CONST = a irb> CONST = a (irb):3: warning: already initialized constant CONST うそつきいいいい
>>900 誰に対して言っているんだ、それは?
ちゃんと警告は出てるぞ。だから問題無いじゃないか。
定数への再代入という行為自体がダメなんだろ 代入されようとしているオブジェクトのID云々は関係ない
ようはRubyの定数はtype * const(type const *でない)
初心者スレだから放っておいてもいいんだが
2chのレスは基本、直前へのリアクションだ
それを踏まえると
>>900 は
「同一オブジェクトを再代入したけど警告出るじゃん
オブジェクトIDを切り替えるのが警告の条件のひとつだなんて
>>899 うそつきいいいい」
となる
irb> CONST = Array.new irb> CONST = Array.new でなかった理由に思い至るかどうかとかそんな話
ルビー厨キモ過ぎ
そろそろNGワードだな。
勝手にNGにしろよクズ
911 :
デフォルトの名無しさん :2009/12/02(水) 22:02:30
activerecordで新しいデータをsaveしたあとそのデータのidって検索しないでわかる?
>>911 (インスタンスメソッドの)
def create
if self.id.nil? && connection.prefetch_primary_key?(self.class.table_name)
self.id = connection.next_sequence_value(self.class.sequence_name)
end
:
だから作った時点でidは貰えていると思う。
idとれてました ありがとうございました
914 :
デフォルトの名無しさん :2009/12/03(木) 00:09:32
一度requireして使用したライブラリを削除することはできますか? トップレベルじゃなく、特定の名前空間や関数の中でrequireしたような場合でも スコープが限定されないようなので、 あるいは限定的なスコープに読み込むような手法でもよいのですが・・・ module Foo require 'bar' end b = Bar.new #=>ここで使用できないように限定したい
916 :
914 :2009/12/03(木) 00:18:53
>>914 ライブラリというかrequire等で定義されたクラスを削除する事は
remove_constで出来るけど、求めてるものとは違うんだろうな
どういうケースなのか知らないからこれが解決になっているかは知らないが、 そういうのは別のファイルでmoduleで定義して、 使用するクラスでincludeするというモデルが素直なモデルだけどね
919 :
914 :2009/12/03(木) 01:13:52
>>917 ありがとうございます。確認できました。そういう意味でした。
こちらの説明がよくなかったですm(_ _)m
rsenseというのを知ったんですけど、これってどうやれば動きますか?
remove_constなんて「使っちゃ駄目」だろう
使っちゃだめとまでは言わないけど、使っていいレベルの人なら自力で見つけられるはず。
いや remove_const を使っちゃ駄目だろ module で囲まれてる外と中で同じ表記の Bar.new をしたいが、Bar が指すクラスは別にしたいってことだろ、これ
remove_constの正しい使い方はライブラリの再読込 バグがあってもプログラムを停止させずにクラスを作り直せる
926 :
925 :2009/12/03(木) 09:02:39
JavaScriptだと無名関数をarguments.calleeで呼べますが、Rubyにはそういう機能はあります でしょうか? (function(n) { return n <=1 ? n : n*arguments.callee(n-1) })(3) //=> 6 Rubyで、これ↓を fact = proc {|n| n<=1 ? n : n*fact.call(n-1) } print fact.call(3) #=> 6 1行で書くと??? proc {|n| n<=1 ? n : n*???.call(n-1) }.call(3)
928 :
デフォルトの名無しさん :2009/12/03(木) 15:30:16
"abcbc".nantoka(/bc/) # => [1, 3] のような正規表現にマッチしたインデックスの配列を返すメソッドって? indexを複数やる感じ
"abcbc".scan(/bc/){p [$~.begin(0), $~.end(0), $~.offset(0)]} [1, 3, [1, 3]] [3, 5, [3, 5]]
930 :
929 :2009/12/03(木) 15:50:57
ごめんなさい。求めているのと違うこと書いた。 require "enumerator" "abcbc".enum_for(:scan, /bc/).map{$~.begin(0)} #=> [1,3]
質問があります。 gemでrailsのuninstallしようとしたらエラーが出たのですが、どこがおかしいものなのでしょうか? (railsといってもRubyGemsの一般的っぽいエラーなのでこちらでお聞きします) sudo gem install rails しようとして、間違えて、 gem install rails してしまい、アンインストールしようと、 gem uninstall rails するのですが、 (Gem::InstallError) Unknown gem rails >= 0 と出てしまいます。 下記のようにすると、一応はアンインストールできるのですが、君が悪いです。 gem uninstall --install-dir ~/.gem/ruby/1.8 rails 解決する方法はないでしょうか? 環境: ・Ubuntu 9.04 (coLinux) ・ruby 1.8.7 (aptitudeで入れました) ・gem --version => 1.3.1 (aptitude で入れました)
932 :
931 :2009/12/03(木) 19:35:00
また、gem install rails時に gem search railsすると、ちゃんと rails 2.3.5が入っているとでます。
>>931 > gem uninstall --install-dir ~/.gem/ruby/1.8 rails
それがユーザー権限インストールされたgemの正しいアンインストール方法です
rm -rf ~/.gem
936 :
931 :2009/12/03(木) 21:25:54
sudo で入れても railsコマンドない言われました orz
また、gemで入れたはずのrakeもない言われたのですが、(gem searchだと出る)
どうやらubuntuのRubyGems特有のトラブルのようです。
Ruby on Rails インストールメモ (ubuntu 9.04) - Railsやねん。
http://d.hatena.ne.jp/gedit/20090626/1246008868 なので、自前で入れたら万事解決しますた!
解決しました。ありがとうございまいた。
>>933 あれそうなの?(´・ω・`)
p [1,"",nil].compact これでnilは消えるんですが ""を消す関数ってありませんか?
rejectとかdelete_ifとか
Rubyに関数なんてあり(略
nil は NilClass という極めて特殊な有名度のクラスのインスタンスだから特殊扱いの対象にできるけど、
empty は String クラスのオブジェクトの内部表現がたまたま空だという程度の意味しかないので
Array というクラスのメソッドで特殊扱いするほどの価値はないと考える
ということで、
>>938 の言うように、
「要素がStringクラスのオブジェクトで空な場合その要素を消す」という処理を行う
irb> p [1, "", nil].delete_if{|e| e.instance_of?(String) && e.empty?}
[1, nil]
うん、長いんだ
適当なメソッド名で掃き出すのをおすすめ
p [1, "", nil].reject{|i|i==""} 非破壊的ならこっちで reject(val)って何でないんだろう
メソッド書くときって sayHello say_hello のどちらで書くのがスタンダードですか
前者は不可
不可は SayHello だろ
944 :
941 :2009/12/04(金) 10:11:32
>>941 後者がスタンダードです
メソッド名やインスタンス変数はlower_name
定数名はUPPER_NAME
モジュール名、クラス名はCamlCase
というのがRubyの原則
例外はクラス名=メソッド名であるような場合
つまり、Regexp()やURI()のようなメソッドぐらいしか思いつかない
>>944 会社(授業)の方針や規約で従うしかない、というのであればやむを得ない
でも、そうでないなら極力lower_nameにするべき
9割のライブラリは標準に従ってるし
947 :
941 :2009/12/04(金) 10:22:39
C++で sayHello スタイルで書かれたライブラリを Rubyに移植しろと言われたのですが、さてどうしたものか....
sayHelloで書けと言われたならそうするしかないし そうでないならRubyに合わせたほうがいい そんだけでしょ
>>947 状況によるんじゃね?
sayHelloでないと問題が起きそうだと思うなら、素直にsayHelloで
そうでなければ「Rubyではsay_helloの方が一般的なんです!」と主張
>>947 そう書けと言われたならそう書くべき
それが嫌ならルールに物申すだけ
alias say_hello sayHello
というのをクラス内で自動生成させるという手もあるけど、
実際にメソッドが増えるから本質的な解決法にはならない
「Rubyで作ってRubyからアクセスするものなのにC++の流儀をわざわざ引き継ぐ理由は何ですか?」
というような質問をして、それでも曲がらなければそりゃ従うべき
Rubyスタイルはもはや骨董品だし堅守すべきものでもないよ
snake_case という言葉を知らないんだろうな ぜんぜん一般的じゃないから知らない人のほうが多いが 俺も CamelCase なんかとの比較列挙のときしか使わん 「アンダースコア区切り」で一発で伝わるし
ライブラリの単純なラッパー作るときはsayHelloのままにして、Rubyっぽいライブラリにする時にsay_hello
>>939 ちょっと短いソースに挑戦してるとこだったので関数の形がよかったんです
ないのは残念
[゙゙,1] - [゙゙]これで我慢しときます
snake_caseってハンガリアン記法のことじゃないの?
いや全然
ハンガリアン記法はハンガリアン記法でいいじゃないか 名前あるんだし
[1,2,3,4,5].inject(0) {|result, item| p result += item } こんな事が出来るイテレータって無いですか? こんなのつくったんですが、なんか不恰好なので class Array def letmap *h self.map do |m| yield m , h end end end [0,0,0].letmap(8) do |c,ph| p ph[0] += 1 end
endが目立つなあ
無理っぽいですね replaceによる書き換えしか手段がないかも
String文字列をRegexpにする関数ってないですか?
963 :
sage :2009/12/04(金) 19:52:06
[1,2,3,4,5].inject(0) {|result, item| p result += item; result } こう?
>>962 リテラルではなくてRegexpのコンストラクタ使うといいよ
compile
str = "hoge" Regexp.new(str) Regexp.compile(str) /#{str}/
Stringで与えられた正規表現をRegexpオブジェクトにするなら Regexp.new(str)か/#{str}/ Regexp.compile(str)はnewの別名だから好みで メタ文字がエスケープされていない「正規表現ではない」文字列を RegexpオブジェクトにしたいならRegexp.escape(str)
俺はRegexp.quoteのほうをよく使うな
>>967 ありがとうございます
Regexp.new使います
escape はエスケープするだけで、返されるのは String 。 Regexp オブジェクトにするにはそれをさらに Regexp.new なりなんなりしないと。
>>963 injectは戻り値を置いておかなきゃいけないのが嫌なので作ろうとしてました
やっぱ引数には配列か構造体か関数でも渡さないとダメかなぁと
injectはtapとの共用オススメ (1..10).inject({}) { |r, x| r.tap { |e| e[x] = x ** 2 } } え、面倒くさい?ですよねー
974 :
デフォルトの名無しさん :2009/12/04(金) 22:10:00
質問です。 引数として受け取ったブロックを使って自身の特異メソッドを定義するメソッド、は どのように書いたらよいでしょうか? def define_singleton_method(sym, block) class <<self define_method(sym, block) end end だと、スコープの関係で sym や block が見えなくなるし 文字列にして eval に渡すという方法だと block が渡せなくて困っています。
>>971 合計だけなら、[1,2,3,4].inject(:+) でいいけど、ちょっと処理を作り込む時に悩むよなあ。
class Object
def define_singleton_method(name, &block)
(class << self; self; end).send(:define_method, name, &block)
end
end
x = Object.new
x.define_singleton_method(:hello) { |name| puts "hello, #{name}" }
x.hello('
>>974 ')
#=> hello,
>>974
977 :
974 :2009/12/04(金) 22:31:24
>>976 おお、ありがとうございます!
そういう self の取得方法があるとは、全然気付きませんでした。
そっか、class...end も式で、最後に評価した値を返すんでしたね。
助かりましたっす。
p Array.new(5) {|i| i } # => [0, 1, 2, 3, 4] この0とか1はどこから出てくるのでしょうか? iってnilじゃないの?
インデックス(添え字)だよ。
Array.new(size) {|index| ... } って、|i|にはindexが入る「決まり」なのか。
各要素のインデックスを引数にしてブロックを実行。 その評価結果を対応するインデックスの値とする。 p Array(5) {|i| i ** i} => [1, 1, 4, 27, 256]
>>978 def yussu n
h = []
n.times do |index| h.push yield(index) end
h
end
p Array.new(5) {|i| i } # => [0, 1, 2, 3, 4]
p yussu(5) {|i| i }
「ゆっす」って何
ンデュールじゃね
985 :
デフォルトの名無しさん :2009/12/05(土) 03:18:49
gem install hogehoge
で
ERROR: While executing gem ... (Gem::RemoteSourceException)
HTTP Response 403
になるの俺だけ?
ぐぐっても「どうにもならんから新しいgemを手動でインストールした」
って感じのBlogがあっただけだったけど
>>682 は解決したの?
>>985 そういうのを書くときは gem -v と gem env の結果を書け。
たぶんおそらくきっと gem のバージョンが古いだけ。
988 :
デフォルトの名無しさん :2009/12/05(土) 09:28:10
gemのリモートソースのurlって変わった?
h = {"a" => 1, "b" => 2, "c" => 3} p h は問題ないのですが、 p {"a" => 1, "b" => 2, "c" => 3} がsyntax errorになるのは何故でしょうか?
ブロックの始まりの { と勘違いしてるとかじゃまいか irb(main):010:0> p{|e|'a'} => nil マニュアルにはなぜこうなるかは書かれていない悪寒
>>989 [1,2,3].each{"a" => 1, "b" => 2, "c" => 3}
これがエラーになるのと同じ理屈
p の引数にカッコ省略でハッシュリテラルが来てると思われてるんではなく、
p がブロックつきメソッドで、その中に文法上不正なよくわからんコンマ並びデータがあると思われてる
p({"a" => 1, "b" => 2, "c" => 3})
と引数カッコを明示するしかないな
あ、書いてあった。Ruby用語集より > ブロック付きメソッド呼び出し > コードの集まり(ブロック)を受け取ることのできるメソッドをブロック付きメソッド呼び出しと呼ぶ。 > > ブロック付きメソッドの中ではyieldを使ってブロックを実行することができる。 > 当然のことながら、与えられたブロックをどのように処理するかはメソッド側に委ねられている。 > ので、***内部でブロックを評価しないメソッドにブロックを与えてもなにも起きない。エラーも起きない。***
なるほどね良く気がつくなあ 質問者じゃないが納得した 省略可能なことが多すぎて優先順位とか知りきれてないことが多いなあ 実は優先順位が関わるあいまいな表現になってても 記述者(自分)としてはあいまいにしてるつもりはないから余計に混乱するw
>>991 こういうのはRubyのよくないところだと思うな。
なんとかして欲しい。
gems.rubyforge.orgじゃなくてgemcutterに変えればいいのか なんでこんな重要なことなのに知ってる奴いないんだ
gemcutterくらい入れとけよw まあ、たしかにgithubのgemサポート外されたから、 今度からgemcutterがメインになるだろうことはなんらかのなんらかがあってもいいな。周知させとかないと
>>994 いや現状のこれが「なんとかした」結果だから
ハッシュリテラルの優先度は高くしないほうがいい
そもそものあれとしてメソッドに引数カッコなしで { } 記述のハッシュリテラルを渡すということ自体が稀
>>989 中カッコを外すとかは?
p "a" => 1, "b" => 2, "c" => 3
あ、1000もらいますね。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。