トップページ⇒tech
1001コメント311KB

Ruby初學者スレッド Part 9

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001紅寶石2006/11/21(火) 08:33:42
まずはマニュアル

マニュアル
http://www.ruby-lang.org/ja/man/
Ruby FAQ
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
逆引きRuby
http://www.namaraii.com/rubytips/
Ruby リファレンスマニュアルの Windows HTML Help版
http://elbereth-hp.hp.infoseek.co.jp/ruby.html
Rubyリファレンスマニュアル刷新計画
http://doc.loveruby.net/


前スレ
Ruby初心者スレッドPart8
http://pc8.2ch.net/test/read.cgi/tech/1159424939/

>>2-10
0894デフォルトの名無しさん2007/01/17(水) 01:27:57
>>893

ClassA.class_eval{
 def foo
  ・・・
 end
}
0895デフォルトの名無しさん2007/01/17(水) 01:39:51
>>894
できました。ありがとうございます。
0896デフォルトの名無しさん2007/01/17(水) 02:01:02
>>891
>プログラミング言語はすべて愛おしい


   ∩___∩         |
   | ノ\     ヽ        |
  /  ●゛  ● |        |
  | ∪  ( _●_) ミ       j
 彡、   |∪|   |        J
/     ∩ノ ⊃  ヽ
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /
0897デフォルトの名無しさん2007/01/17(水) 02:21:12
>>886
> str.fill("g",100..350)
String#fillなんてあったっけ?
0898デフォルトの名無しさん2007/01/17(水) 02:35:38
>>897
fillはArrayだった。886は間違い。
0899デフォルトの名無しさん2007/01/17(水) 03:16:37
>>894
なんでこれが、クラスではなくインスタンスのメソッドになるのか
ちっとも理解できないのだけれど……。
分かりやすいサイトプリーズ
0900デフォルトの名無しさん2007/01/17(水) 03:20:07
>>899
リファレンスに書いてあるよ。
0901デフォルトの名無しさん2007/01/17(水) 03:23:46
>>899
わかりやすいサイトは思いつかないが、スコープの問題を除けば、

class ClassA
 # X
end

と、

ClassA.class_eval{
# Y
}

とでは、XとYは同じ環境になる。
単にそれだけ。
0902デフォルトの名無しさん2007/01/17(水) 03:34:38
すまん。インスタンスメソッドと、
特定のインスタンスだけに定義されたメソッドを混同していた。
さいきんruby使う暇なくて忘れてたorz
0903デフォルトの名無しさん2007/01/17(水) 07:00:53
>>877
>nilを代入するのではダメでシンボルテーブルから変数名自体を消したいってこと?

そうです。ERB用にこんなことをしたいんです。

# HashからBindingをつくる
def create_binding(_hash)
_defstr = _hash.inject('') { |_s, _e| _s << "#{_e[0]} = _hash[#{_e[0].inspect}];" }
eval _defstr
#undef _hash, _defstr # これができないものかと。
binding()
end

b = create_binding(:a=>10, :b=>'foo', :c=>%w[x y z])
0904デフォルトの名無しさん2007/01/17(水) 09:39:30
>>896
たしか Matz は I hate C++. と逝っていたと思うんだけど、
それでもいとおしいと思ってるんだね。
0905デフォルトの名無しさん2007/01/17(水) 09:41:29
嫌よ嫌よも好きのうち?
0906デフォルトの名無しさん2007/01/17(水) 10:01:30
>>903
むしろ一時変数なんか気にすんなって言いたいが。
そもそもevalした時点で安全でなくなっているわけだし。

ハッシュ受け取ってローカル変数なりクラス変数なりに展開するERBの子クラスを作ればいいんじゃないのか。
0907デフォルトの名無しさん2007/01/17(水) 11:25:02

流れ見ないで書き込むんだけど、evalとかで変数表を表示したときに
一時変数も一緒に出て来てしまうのが気に入らないとか?

0908デフォルトの名無しさん2007/01/17(水) 11:56:36
>>903
とりあえず現在のところローカル変数を明示的に消すことはできない
のでやりかたを変えるしかない。
0909デフォルトの名無しさん2007/01/17(水) 12:16:34
>>904
最近は本気で2chのデマを信じ込む奴が結構居るから、
これくらいのアッサリ風味でこられると本気なのか釣りなのか判断つかない。
0910デフォルトの名無しさん2007/01/17(水) 12:36:21
いるよな、デマだということにして火消しに必死な奴
関係者か?
0911デフォルトの名無しさん2007/01/17(水) 12:40:19
本人乙
0912デフォルトの名無しさん2007/01/17(水) 13:15:36
RHGの20.2.2によると、ruby-talkでmatzがそう発言したということらしいが、軽く探しても見当たらなかった。
0913デフォルトの名無しさん2007/01/17(水) 13:25:56
いつも大事にお使いいただきありがとうございます。
煽りあいは本スレでお願いいたします。
0914デフォルトの名無しさん2007/01/17(水) 23:18:09
Dir.globってなに?。自分でオープンすれば代替できるからいいんだけど。

irb(main):001:0> Dir.glob("c:/本/*")
=> []
irb(main):002:0> Dir.open("c:/本") do |dir|
irb(main):003:1* dir.each do |f|
irb(main):004:2* p f
irb(main):005:2> end
irb(main):006:1> end
"."
".."
=> #<Dir:0x3a1e55c>

Windows2000/VISTAの話で入れたのはActiveScriptRuby
"本稼動"だの"本番"だのが共有ディレクトリ内にあるんだな
0915デフォルトの名無しさん2007/01/17(水) 23:45:29
globはワイルドカードを展開するという意味の動詞。
0916デフォルトの名無しさん2007/01/18(木) 01:42:06
>>903
空のBindingを作ってから他のローカル変数を追加すればいい。

def empty_binding
  binding
end

def create_binding(h)
  b = empty_binding
  h = h.inject({}) {|hx, (var, val)| hx[var.to_s] = val; hx}
  arg = "__a"
  arg.succ! while h.key?(arg)
  eval((h.keys << "nil").join(" = "), b)
  h.each {|var, val| eval("proc {|__a|#{var}=__a}", b).call(val)}
  b
end

# テスト
b = create_binding(:a=>10, :b=>'foo', :c=>%w[x y z])
p eval("a", b)
p eval("b", b)
p eval("c", b)
p eval("h rescue $!", b)
p eval("__a rescue $!", b)

0917デフォルトの名無しさん2007/01/18(木) 19:10:20
完全マッチさせる方法を教えてください。

if /1/ =~ input
これだと、inputが11や111でもマッチしてしまいます。
input = 1の時だけマッチさせるにはどうすればよいでしょうか?
0918デフォルトの名無しさん2007/01/18(木) 19:16:31
/\A1\z/
0919デフォルトの名無しさん2007/01/18(木) 19:17:29
input == "1"
09209172007/01/18(木) 19:26:27
>>918
やってみたところ、1もマッチしなくなりました;

>>919
inputは入力されたものです。説明不足ですいません。
0921デフォルトの名無しさん2007/01/18(木) 19:34:54
/^1$/
0922デフォルトの名無しさん2007/01/18(木) 19:43:25
if input.chomp == "1"
09239172007/01/18(木) 19:43:32
>>921
>>918と同じく、1もマッチしなくなりました;
09249172007/01/18(木) 19:45:59
>>922
その方法でうまくいきました。
有り難うございました。
0925デフォルトの名無しさん2007/01/18(木) 21:19:40
いいのかそれで・・・
0926デフォルトの名無しさん2007/01/18(木) 21:48:40
単に改行を取り忘れたいただけ?
0927デフォルトの名無しさん2007/01/18(木) 22:05:48
だね。

/¥A1¥z/ =~ input.chomp
でもマッチするだろう。
0928デフォルトの名無しさん2007/01/18(木) 23:49:47
>>914
"本" のシフトJISコードの2バイト目が "{" なので
こいつをワイルドカード文字と誤認識して異常動作している
私も以前にこれに引っかかりました
Dir.open('ほげほげ').to_a
とかに変えた記憶があります
・ディレクトリエントリのみの配列になる
・ドットファイルも含まれる
・ディレクトリの再帰検索は出来ない
・パスデリミタとしてバックスラッシュも使える
という違いがありますが、大抵はこれで事足りるような気がします
シフトJISの呪いはいつまで続くのでしょうか
0929デフォルトの名無しさん2007/01/19(金) 00:04:28
>>928
-Ks で解決する問題とは違う?
0930デフォルトの名無しさん2007/01/19(金) 02:59:37
>>929
違う。純粋にglobingのルーチンの問題。

実は1.9で使われているglobingルーチンでは解決しているが、
なんのかんので1.8にバックポートされていない。
1.8.6で入れてくれ。ってリクエストしてもダメかねえ。

0931デフォルトの名無しさん2007/01/19(金) 12:02:48
最近テキスト処理なんかの事務作業のためRubyの勉強始めたんですが
リファレンスはHowToな対応できても基礎がわかってなくて不安です
で、高かったり厚くても問題ないので、1冊だけ読むならこれ、っていうお勧めの書籍ってなんでしょうか?

一応amazonとかみると「プログラミングRuby―達人プログラマーガイド」
が評判良さそうなのですが、>>281>>286でもあがってないし少し古いのでどうなんでしょか?
(ちなみに他言語はそこそこ触ってます
0932デフォルトの名無しさん2007/01/19(金) 12:21:54
他の言語使った経験あるなら
webの情報でなんとかなりますよ
0933デフォルトの名無しさん2007/01/19(金) 12:23:22
あ、あえて薦めるとしたら、
Rubyソースコード完全解説
RubyHackingGuide
09349312007/01/19(金) 12:46:59
サンクス

>webの情報でなんとか
割とそうですがそういうもんでしょうか

Rubyソースコード完全解説は趣旨と違うけど面白そう
0935デフォルトの名無しさん2007/01/19(金) 12:52:19
>>934
私はwebの情報を見ながらだけど
あなたと同じように
これで大丈夫なんかいな?
基礎分かって無いで使ってるけど?
みたいな心配がありました

ちょっと趣きを変えて
Rubyソースコード完全解説
を読んでみたら
読んだあとはすらすら使えるようになってました
0936デフォルトの名無しさん2007/01/19(金) 13:30:49
>>930
> 1.8.6で入れてくれ。ってリクエストしてもダメかねえ。

ちと、そのへんの強化策を考えないといかんかねぇ。
有用そうだけど1.9からバックポートされてないのというと、こんなところか。
* multibyte path globing
* large file support
* override by forwarding
0937デフォルトの名無しさん2007/01/19(金) 13:41:57
>>934
自分はJavaからやった。
Javaは書籍が豊富だから。

回り道のように思えるけど、自分はこっちの方が効率がいいと思っている。
0938デフォルトの名無しさん2007/01/19(金) 13:57:17
>>936
override by forwarding って何?
0939デフォルトの名無しさん2007/01/19(金) 17:51:41
学校の宿題で配列でHeapを実装しろとかでてきました(>_<)誰か教えてください。
0940デフォルトの名無しさん2007/01/19(金) 17:53:07
うむ、とりあえず、配列でヒープを実装するんだ。
0941デフォルトの名無しさん2007/01/19(金) 17:56:02
$stderr.print "\a" while 1

コレでいいだろ?
0942デフォルトの名無しさん2007/01/19(金) 18:27:11
>>939
東大生乙
09439392007/01/19(金) 19:37:21
いじわるしないで誰か教えてください(>_<)時間ないんです。ちなみに東大生じゃありません。
あとできればヒープソートの作り方も教えてください。
0944デフォルトの名無しさん2007/01/19(金) 19:43:16
二分ヒープなら、nの位置の親の子は
1始まり→2nと2n+1
0始まり→2n+1と2n+2
に入れればいい。
09459392007/01/19(金) 19:50:07
解答ありがとうございます。でもちょっとよくわかりませんね(;^_^A
自分でもうちょい考えたら改めて質問に来ます。
0946デフォルトの名無しさん2007/01/19(金) 20:28:02
そういうのは以降こっちで
http://pc10.2ch.net/test/read.cgi/tech/1106572657/
0947デフォルトの名無しさん2007/01/19(金) 20:28:36
宿題スレいけよ
09489392007/01/19(金) 23:10:16
>>946
おお!
こんなスレあったんですね!
0949デフォルトの名無しさん2007/01/20(土) 00:22:05
>>941
それはビープ。
0950デフォルトの名無しさん2007/01/20(土) 00:31:43
>>938
read()とかwrite()とかを#defineで置き換えてるのを、DLLのforwardingで置
き換えるようにするというのを勝手に「override by forwarding」と書いた。

ChangeLogにはaliasと書いてあったので、
「symbol alias by forwading」ということにしよう。

svnでいうとrevision 9502。
0951デフォルトの名無しさん2007/01/20(土) 00:39:08
つーか>>914は単にディレクトリが空だから
Dir.globが空Array返したってだけじゃないのか?
"*"はdot fileにはマッチしないんだから。
0952デフォルトの名無しさん2007/01/20(土) 04:19:11
>>936

coding pragma を追加したいところだけど、あれは1.8には持ってこれない
という話だから、それくらいかな?

ところで署名でも集めるの?w >強化策



0953デフォルトの名無しさん2007/01/20(土) 08:14:15
>>949
お前だけだ。分かってくれたのは・・・。
もう少して危ない人になるところだった。
0954デフォルトの名無しさん2007/01/20(土) 11:44:14
exerbについての質問です。
レシピファイル作成をスクリプトの実行と同時に自動で行う機能があるとのことですが、
ずっとループし続けるスクリプトの場合には、自動生成できないのでしょうか?


もしあれば教えてください。
0955デフォルトの名無しさん2007/01/20(土) 13:04:05
ループ一回したら終了するの作ってレシピ作ればいいじゃない
0956デフォルトの名無しさん2007/01/20(土) 14:05:33
なるほど!
実際、requireするのを探すだけですもんね。

ありがとうございました。
0957デフォルトの名無しさん2007/01/20(土) 15:08:27
下のようなスクリプトが終了したとき
test という文字列のあと端末の高さぶんの空行が開いた後に
プロンプトが表示されます。
この空間ができないようにするにはどうしたらいいんでしょうか?
Curses::stdscr.setpos(Curses::stdscr.cury - 1, 0)
をはさんでみるなどしてみましたがダメでした。
端末は Cygwin/ck/screen/zsh です。

require "curses"
begin
Curses::init_screen
Curses::stdscr.addstr("test\n")
Curses::stdscr.refresh()
rescue
Curses::close_screen
end
0958デフォルトの名無しさん2007/01/20(土) 21:10:40
>>951 そのとおりだが、globが駄目なのはファイルを作って試してみれば明らか
>>928 が説明してくれている通りで、例えば'も'を含んだパスとか駄目
0959デフォルトの名無しさん2007/01/21(日) 14:47:28
HTML(string)をDOM的に解釈して扱うライブラリあるかな
と思って探したんですが見つけられませんでした
そういったライブラリってありますか? 
0960デフォルトの名無しさん2007/01/21(日) 15:14:16
>>959
DOM使え。
0961デフォルトの名無しさん2007/01/21(日) 15:35:22
たぶんない。
どうしても DOM を使わなければいけない理由がなければ、
DOM を使わないほうが楽なので。
0962デフォルトの名無しさん2007/01/21(日) 15:38:50
>>957
$TERMはなんになってる?
screen抜いてみたもダメ?
0963デフォルトの名無しさん2007/01/21(日) 15:51:23
>>960-961
ありがとうございます
jsを扱ってきたのでDOM処理ができれば今後も楽だなぁと思ったんですが。

単純な文字列処理でも強力なので素直にそっち使っていきます
0964デフォルトの名無しさん2007/01/21(日) 16:23:01
処理対象のHTML/CSSがある程度きれいに記述されているなら
http://wota.jp/ac/?date=20070115#p01
とか参考になるかと。
0965デフォルトの名無しさん2007/01/21(日) 17:20:49
>>964
面白そうなモノをありがとう 
しかしなぜか(←思考停止)モジュール内部でエラー出してだめだったので
人並みにruby出来るようになるまで正規表現で対応します
0966デフォルトの名無しさん2007/01/22(月) 12:42:32
Rubyist Magazine - あなたの Ruby コードを添削します 【第 1 回】 pukipa.rb
http://jp.rubyist.net/magazine/?0010-CodeReview#l12

↑これを読んでいるのですが、
「リテラルへの式埋め込み」ってありますよね?
式の埋め込みは、コンパイル時にチェックがされないので、どうなのかなー?
実行してみないとわからない、と思うのですが、
みなさんは多用されてます?
ユニットテスト前提なんだろうか・・・。
0967デフォルトの名無しさん2007/01/22(月) 13:26:08
>>966
どっちみち手動でも自動でもテストはしなきゃ話にならんのだから使いたいときに使えばよい。
0968デフォルトの名無しさん2007/01/22(月) 14:25:49
>>966
少なくともSyntax Errorはコンパイル時にチェックしてるようなので
問題ないと思うんだが
0969デフォルトの名無しさん2007/01/22(月) 18:20:35
>>950
ああ、それのことか。
それに関しては1.8にバックポートされる可能性はないと思うよ。
0970デフォルトの名無しさん2007/01/22(月) 22:34:34
列挙型ってあります?
0971デフォルトの名無しさん2007/01/22(月) 22:55:39
>>966
1.8以降なら、たとえば "lit#{code}eral" は
"lit" << code.to_s << "eral" とおなじ形に解釈される。
普通のrubyコードでチェックされる点はチェックされるし、
チェックされない点はチェックされない。
0972デフォルトの名無しさん2007/01/22(月) 23:04:32
>>970
場合によるけどシンボルがそれに近い
09739662007/01/22(月) 23:13:37
書いた後で、実行時にコンパイル含めいろいろするんだから
変なこと言ったかな?と思ったんですが、
どうやら、自分が言いたかったのは、ruby -c での構文チェックのことでした。
(後だしっぽくて申し訳ない)

・・・と思ったら、

hoge = 1234
puts "hoge = #{hoge_} でつ"

だろうが、

hoge = 1234
puts "hoge = " + hoge_ + "でつ"

だろうが、ruby -cは通るのか・・・orz
構文チェックってもしかして、ザルですか?(:D)rz
0974デフォルトの名無しさん2007/01/22(月) 23:46:05
>>973
だって構文としては正しいし。
self.hoge_を期待するというだけ。
0975デフォルトの名無しさん2007/01/22(月) 23:48:50
>>972
シンボルか。
サンクス。
0976デフォルトの名無しさん2007/01/23(火) 00:14:00
実行時エラーと構文エラーの区別が付いてないやつがいるな
0977デフォルトの名無しさん2007/01/23(火) 00:29:25
rubyの弱点ではあるな
0978デフォルトの名無しさん2007/01/23(火) 00:50:35
遅延バインディングをサポートしてる言語はみなそうでは
0979デフォルトの名無しさん2007/01/23(火) 02:47:12
Cでlintが通ったのにバグって動かないとか言ってる馬鹿とおなじ
0980デフォルトの名無しさん2007/01/23(火) 02:58:23
Rubyはカルトなので批判は許しません!
0981デフォルトの名無しさん2007/01/23(火) 03:01:51
Rubyの批判をした訳ではないだろうに
0982デフォルトの名無しさん2007/01/23(火) 05:56:45
中学生が夜中にアンチの真似したら
ちょっと滑っちゃったという図
0983デフォルトの名無しさん2007/01/23(火) 06:12:28
批判じゃないってことにするあたりが、ますますカルトっぽくて気持ち悪い
0984デフォルトの名無しさん2007/01/23(火) 07:10:43
批判ではないものを批判だということにするとカルトっぽくないかというと、
まったくそんなことはないわけで。
0985デフォルトの名無しさん2007/01/23(火) 13:24:02
宗教話は本スレで

質問受付中
0986デフォルトの名無しさん2007/01/23(火) 14:17:33
YARV になると、拡張ライブラリの書き方は変わるのでしょうか?
今まで作った拡張ライブラリは書き直しする必要がありますか?
0987デフォルトの名無しさん2007/01/23(火) 14:20:28
すみません、自己解決しました。
README.EXT{,.ja} の内容見たら変更は無いですね。
0988デフォルトの名無しさん2007/01/23(火) 14:31:18
書き直しの必要な拡張ライブラリも当然ある。
でも、ここでこんなことを聞くレベルなら、まず問題ないだろう。
0989デフォルトの名無しさん2007/01/23(火) 15:27:03
どうもです。

今までに書いた拡張ライブラリのうちいくつかを試してみましたが、
RSTRING(s)->ptr => RSTRING_PTR(s), RSTRING(s)->len => RSTRING_LEN(s) とか、
基本的なところから引っかかってしまいました。
コンパイルまで辿り着いても、実行してみたら core 吐くし・・・

どうやら README.EXT{,.ja} の内容も更新されていないようですね。

先は長そうです・・・ orz
0990デフォルトの名無しさん2007/01/23(火) 15:47:38
内部イテレータはイケてないという話を読んだのですが、
Rubyのイテーレータは内部、外部どっち?
ttp://enbug.tdiary.net/20070123.html#p01
0991デフォルトの名無しさん2007/01/23(火) 15:56:48
内部。
0992デフォルトの名無しさん2007/01/23(火) 16:00:18
>>989
README.EXT{,.ja}にはRSTRING_PTRとRSTRING_LENは書いてあるよ。
coreを吐くのは、それだけじゃ誰が悪いかよくわからんね。
0993デフォルトの名無しさん2007/01/23(火) 16:02:39
>>990
一概に外部イテレータがよくて内部イテレータがダメ、ということもなくて、
外部イテレータには確かに内部イテレータにできない操作もできるけど、
逆にその分扱いにくい(記述量が増える)という欠点もある。
両方使えるのが理想じゃないかね。

なお、Rubyで外部イテレータを使いたい場合は require "generator"
これ、組み込みにならないかねえ。
レス数が950を超えています。1000を超えると書き込みができなくなります。