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

Rubyについて Part 10

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
オブジェクト指向スクリプト言語Rubyについて扱うスレッドです。

Ruby Home Page
http://www.ruby-lang.org/ja/

= 前スレ
: Rubyについて Part 9
http://pc5.2ch.net/test/read.cgi/tech/1087999575/


0153146NGNG
>>149, >>150
スマソ。以前手元にコピーしてきてた古いの見てた。
# 当時は「イテレータ」だった。
0154デフォルトの名無しさんNGNG
初学者にとってはRubyは同機能異表記な機能が多すぎて混乱する上に
冗長な表記を避けて書かれた既存のコードを読む場合可読性が非常に低く
暗号的という意味ではPerlと大差なかったりするとかしないとか。
0155141NGNG
>>152
俺の場合…
・doって制御構造で使われていたような…→for/whileとかであるけど単独の使用例は見つからず→空振り
・んじゃ検索で「do」を…→当然のように大量引っ掛かかる→あきらめ
・なら機能別検索で…→do単独の項目が見つからず→お手上げ
でした。
できればリファレンスマニュアルが項目ごとに全文検索できればいいのですが…
今の構造じゃ難しそうですね。

>>154
大なり小なり言語にはつきまとう問題だと思う。オブジェクト指向な言語ほど顕著かも
C++なんかも他人のコードはかなり読みにくい気がする。
確かにRubyは自由度が高すぎる感はあるよね。あと、"ほぼ"同機能なコードがあったりとか。
0156デフォルトの名無しさんNGNG
>>154
>初学者にとってはRubyは同機能異表記な機能が多すぎて混乱する
「他人の書いたコードを読む時」ってことかな。

両方知ってて好きな方を使う分にはいいけど、初学者は
「この例に出てくるcollectって何? mapとは違うの? …(調べる)…って一緒かよ!」
みたいになる、と。

>冗長な表記を避けて書かれた既存のコードを読む場合可読性が非常に低く
こっちはよく分からないので例キボン。

個人的には、Hashでよく使われる「var ||= value」は可読性が低いと思う。
 hash['key'] = value unless hash['key']
が冗長なんで
 hash['key'] ||= value
なんて書きたくなる気持ちは分かるけど……。
0157デフォルトの名無しさんNGNG
there is more than one way to do itだよ
matzがLarryについて尊敬する点ってのはここなんだろう
0158122NGNG
>125
たいがい亀だが
Firefoxはマイナーってことでせうか。

# Firefox0.9.2(Japanese,Windows)では見れてまつ。
0159デフォルトの名無しさんNGNG
「Content-Encoding deflate」でぐぐれ
0160デフォルトの名無しさんNGNG
冗長といえば
a+=1
0161デフォルトの名無しさんNGNG
>>140
そういえば結城さんもクリスチャンだよな。
0162デフォルトの名無しさんNGNG
>>160
そして「なんで Fixnum#++ がないの?」と話はループ・・・
0163デフォルトの名無しさんNGNG
ちょっとわかりにくいんだけど…
class A < CC
 @@foo = 'hoge'
 class B < DD
  def hoge
   ここで@@fooを読み書きしたい
  end
 end
end
の場合どうしたらいい?
0164デフォルトの名無しさんNGNG
>>163
class A で @@foo のアクセスメソッドを定義してやれば?
0165デフォルトの名無しさんNGNG
>>140
プロテスタント(結城)とモルモン(まつもと)だもんな。
ヤバイよな。
0166デフォルトの名無しさんNGNG
>>115
String#replace(other) を置き換える方が怖くない?
0167デフォルトの名無しさんNGNG
>>166
あわわわ、確かに。 (元々の String#replace の存在をすっかり忘れてた・・・)
0168163NGNG
>>164
なるほど。できました。

やってみて思ったんだけど変数のようにデータを出し入れできるオブジェクトって作れなかったっけ?
Aの下にそのようなクラスが定義してB::hogeないでオブジェクトを生成すればデータの出し入れが
便利になりそうだと思ったんだけど…
連続で質問すまん
0169デフォルトの名無しさんNGNG
Programming Ruby (2nd. Ed.) あげ

http://www.pragmaticprogrammer.com/titles/ruby/index.html

PDF版安いなぁ……
0170デフォルトの名無しさんNGNG
>>166-167
そういえば、知らないうちにメソッドを置きかえてたというのを防止することってできるの?
0171デフォルトの名無しさんNGNG
>170
moduleで囲ってmoduleごとfreezeかねぇ


module B
  def self.teste; p 'test' end
end

module B
  def self.teste; p 'test2' end
end #=>can't modify frozen object (TypeError)

0172デフォルトの名無しさんNGNG
スマン、抜けてた

module B
  def self.teste; p 'test' end
end

B.freeze

module B
  def self.teste; p 'test2' end
end #=>can't modify frozen object (TypeError)
0173デフォルトの名無しさんNGNG
あ、-W のときはちゃんと教えてくれるのね
0174デフォルトの名無しさんNGNG
% ruby -W -e 'class String; def replace; end end'
-e:1: warning: method redefined; discarding old replace
0175デフォルトの名無しさんNGNG
クラス変数があってほんとによかったと思うことってどれくらいあるのかな。
0176デフォルトの名無しさんNGNG
>175
グローバル変数的な使い方を良くするよ。
0177デフォルトの名無しさんNGNG
一度でいいから言ってみたい。
「次のようにすると core を吐きます。」
0178デフォルトの名無しさんNGNG
>>177
そんなに大したもんじゃないつーか
泡沫Rubyistの俺でも数回でたことある。
仕事で普通に使ってたら出て支障きたした。
むしろBug出すぎw
ただ頑張って直してパッチ書いて
取り込んでもらった時は嬉しかった。
0179デフォルトの名無しさんNGNG
仕事で普通に使うことを許される会社っていいな。
0180デフォルトの名無しさんNGNG
$1とかってスレッドごとに独立してるの?
0181デフォルトの名無しさんNGNG
試せよ
0182デフォルトの名無しさんNGNG
ディレクトリ移動を行うスクリプトを書きたいのですが、
Dir.chdir だとスクリプト内でしかディレクトリ変更が効きません。
% pwd
/home/ruby
% ruby -e'Dir.chdir("/home")'
% pwd
/home/ruby

動作としては、こんな感じにしたいのですが。
% pwd
/home/ruby
% cd.rb /home
% pwd
/home

なにか方法はあるのでしょうか?
0183デフォルトの名無しさんNGNG
>>182

それはRuby云々ではなくUNIX FAQ。
結論だけ言うと「普通は無理」。
まともな方法では親プロセスには影響できない。
0184デフォルトの名無しさんNGNG
>>182
カレントディレクトリというのはプロセスごとに持っている情報。
子プロセスが作られるときには親プロセスのを引き継ぐけど、
子プロセスから親プロセスのそれは変更できない。
0185182NGNG
>>183 >>184
なるほど。ありがとうございました。
じゃあ、 Rubyスクリプトの出力を受け取って 
cd を実行するようなシェルスクリプトをつくって
% . hoge.sh
としてカレントシェル内で実行する、って方法か
alias hoge='. hoge.sh'
にしておくとか。

0186デフォルトの名無しさんNGNG
moonwolf氏が空回りしてると思う人の数→(1)
0187デフォルトの名無しさんNGNG
matz七誌出乙
0188デフォルトの名無しさんNGNG
Ruby Garden の松は matz ということでFA?
0189デフォルトの名無しさんNGNG
詮索好きだなぁ・・・
0190デフォルトの名無しさんNGNG
>>186
ruby-listの読書会のはともかく、首藤プラネットは良いと思う。
リンク先見るかどうか、寸評のおかげで決められるし。
0191デフォルトの名無しさんNGNG
>>186
日本人にはめずらしく行動力だけはズバ抜けていて、そこはマジで尊敬するけど…


 あ れ は P l a n e t と は 言 わ な い よ な 。


むしろ、ruby-talk便りとかそっちの方が正確だろうな。
あるいはRuby Watchとか。
0192デフォルトの名無しさんNGNG
wxRubyに関するサンプルとか資料がまとまっている所ってどっかある?

画像の動的な書き換え方がわからなくて…
何かイベントがあったときに表示されている画像を書き換えたいんだけど
Image書き換えてサーフィスに変換してbitbltで転送しても画面が書き換わってくれない。
いったん別のウインドウで隠して再度アクティブにすれば書き換わってくれるのだが…_| ̄|○
0193デフォルトの名無しさんNGNG
>>192
ソースを読んでドキュメントとチュートリアルとサンプルと
その他雑多な資料を作成してください。
あなたがやらない限り未来永劫ないままです。
0194デフォルトの名無しさんNGNG
>>192
wxRubyそのもののドキュメントはあまりない。wxWidgetsのドキュメントも
見た方がいいと思う。わからないことあったら↓で質問すれば。

【GUIライブラリ】wxWindowsでのひょーん
http://pc5.2ch.net/test/read.cgi/tech/1052186697/

>>193
ヤレヤレ厨うざい。
0195デフォルトの名無しさんNGNG
>>191
あれを行動力というのか?まあそうかもしれんけど。
Moonwolfの行動力って、るびきちのそれと似てるんだよね。
0196デフォルトの名無しさんNGNG
planetって本来どういうのなの?
0197デフォルトの名無しさんNGNG
>>196
ttp://dontstopmusic.no-ip.org/diary/20040914.html#c05
0198デフォルトの名無しさんNGNG
さんくす。アグリゲータの一種なのね。
0199デフォルトの名無しさんNGNG
DevがCoreで埋まってるなw
http://blade.nagaokaut.ac.jp/ruby/ruby-dev/24201-24400.shtml#latest
0200デフォルトの名無しさんNGNG
そういや bdb1-0.2.2 のバグはどうなった?
0201デフォルトの名無しさんNGNG
やっぱrubyはまだベータレベルだな(w
0202デフォルトの名無しさんNGNG
akr さんと同レベルの人があと2,3人にたら、まつもとさんは過労死しそうな予感。
0203デフォルトの名無しさんNGNG
akrって誰?
0204デフォルトの名無しさんNGNG
>>195
> あれを行動力というのか?まあそうかもしれんけど。
> Moonwolfの行動力って、るびきちのそれと似てるんだよね。
うーん、本人には失礼かもしれないけど、同意してしまう。
0205デフォルトの名無しさんNGNG
age
0206デフォルトの名無しさんNGNG
ruby-talkウイルス来すぎ
0207デフォルトの名無しさんNGNG
>>203
金光さん
0208192NGNG
Window::refreshで解決しました。

wxRuby使うと激しくRubyらしからぬコードになるような気がするのは気のせいか…?(´・ω・`)
0209デフォルトの名無しさんNGNG
>>201
>やっぱrubyはまだベータレベルだな(w

だからハックのやり甲斐があるんじゃない?御輿に乗るだけが能じゃないでしょ?
0210デフォルトの名無しさんNGNG
例えばRubyで,2chの特定のスレッドを定期巡回して,1000まで到達したら,
ローカルにテキストファイルとして保存するようなプログラムを書きたいのですが,
どのような方法が良いでしょうか?
URLとかスレッドごとに変わってしまうので,その辺がややこしくて...
0211デフォルトの名無しさんNGNG
>>210
巡回スレ全てに更新チェックを行い
更新されているスレのデータを差分取得。
1000でスレが止まったら巡回スレからはずす。
0212デフォルトの名無しさんNGNG
1001まで行ったら無視する。
0213デフォルトの名無しさんNGNG
特定のスレを追うんならURLは変わらんだろう?
何を考えてるのかわからん。
0214210NGNG
>>211

返信ありがとうございます.
巡回してるスレッドが1000に到達したら,新しいスレッドを自動的に巡回
できるようにしたいのですが,その部分はやはり手動でやらなくては
ならないでしょうか?
0215デフォルトの名無しさんNGNG
>>214
ちょっと考えればわかるだろ
0216デフォルトの名無しさんNGNG
>>214
2chには次スレを明示するシステムがないから無理
次スレ
http://pc5.2ch.net/test/read.cgi/tech/1095479831/
とかってパターンを検出して飛ばせばいいけど
そこが正しいとは限らないし。

>>215
お前は失せろ
0217デフォルトの名無しさんNGNG
210とは違うんだが、時々鯖が変わったりするみたいだけどそれは問題ないの?
アホなこと言ってたらゴメソ
0218デフォルトの名無しさんNGNG
>>217や>>214に対しては完璧な方法は無理。

ただ、設定ファイルを簡潔にして管理しやすくすれば、鯖の移動くらいは設定
ファイルを置換一発で可能というくらいにはできるはず。鯖の移動なんてそん
な頻繁には起きないし、それでいいんでは?

次スレの検出は、自分もラスト30くらいのレスからパターン検出くらいしか思
いつかないな。
0219デフォルトの名無しさんNGNG
>>217
2chブラウザはスレ一覧更新すると移転追いかけるから、
板移転時はスレ一覧(subject.txt)を取りにいくと30xと移転先のLocationを返されるんだと思う
Rubyマニュアルのnet/httpのところにリダイレクトへの対応について載ってるよ
0220デフォルトの名無しさんNGNG
とりあえず Monazilla.org のドキュメントに目を通せ

ttp://www.monazilla.org/
0221デフォルトの名無しさんNGNG
Rubyってコードが置いてあるディレクトリの取得ってできたっけ?
コードが置いてあるディレクトリ以外からスクリプトを実行したときも
コードが置いてあるディレクトリと同じ所にあるファイルをrequireとかしたいんだけど…
0222デフォルトの名無しさんNGNG
>221

一応 __FILE__ つうのもあるけど、起動スクリプトからの相対パスみたいだね。
絶対パスを取るにはどうすりゃいいのかね?
0223sai10sight ◆m7YeytgDFE NGNG
「$0」で絶対パスが分かりませんか?
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%C1%C8%A4%DF%B9%FE%A4%DF%CA%D1%BF%F4
0224デフォルトの名無しさんNGNG
>>222
サンクス。__FILE__から取得したパスを加工すれば何とかなりそうです。
mswin32なせいかコードが置いてある場所とは違うところからコードを実行すると
絶対パスが返ってくるようです。

>絶対パスを取るにはどうすりゃいいのかね?
File.expand_path(__FILE__)
はどう?
0225デフォルトの名無しさんNGNG
>223
ダメでした @ mswin32 1.8.1

>224
>File.expand_path(__FILE__)
「カレントを移動していない」という前提が必要ですな。

p File.expand_path(__FILE__)  # => D:/.../test_testfield.rb"
FileUtils.cd( "lib" )
p File.expand_path(__FILE__)  # => D:/.../lib/test_testfield.rb"

#...は省略部分

といった感じ。
0226shigeNGNG
0227デフォルトの名無しさんNGNG
Windowsのパスに厳密にマッチする正規表現ってどんなの?
0228デフォルトの名無しさんNGNG
全部を正規表現では書かないか、厳密にはしないのがいいんじゃないか。

パスの途中の予約語の出現禁止とか、
ショートとロングとか、
全体の長さとか、
いろいろまんどくさそだ。
0229デフォルトの名無しさんNGNG
MoonWolf氏に関しては、やってることは凄いと思うんだが、単に躁鬱病患者が
躁期に入っているだけにも見える。
もしそうなら、鬱期に入った途端に全てのプロジェクトが中断してしまうわけで、
うかつに氏のやってることに賛同できない。
せめて複数人でプロジェクトを立ち上げてくれればいいんだが、他人の協力は
拒んでいるようだし。
0230デフォルトの名無しさんNGNG
Bash スクリプトを書いていて、文字列処理で難儀になっても、
そのまんま Bash で押し通すことがあるんや。

Ruby で書き直すのが難儀な部分。
(1) getopts と case を GetoptLong に書き直すこと。
全体的な構造の書き直しと、GetoptLong::REQUIRED_ARGUMENT 等の定数が難儀。
(2) -d, -w やらなんやらファイルテスト演算子を、
FileTest.directory?(), FileTest.writable?() に書き直すこと。
# _d, _w で代替したいちうわけや。
(3) -nt, -ot やらなんやらファイルテスト演算子相当メソッド。
FileTest.newer?(file1, file2), FileTest.older?(file1, file2)
0231デフォルトの名無しさんNGNG
つうか、planet.ruby-lang.org作って海外のRuby hackersのblogを
集約してくれるとすごく欲しい。
0232230NGNG
-- sample --
$ cat sample.sh
#!/usr/bin/bash
while getopts a:b:cde Opt; do
case "$Opt" in
a ) echo "a has $OPTARG";;
b ) echo "b has $OPTARG";;
c|d|e) echo "$Opt specified.";;
* ) exit 1;;
esac
done
[ $OPTIND -gt 1 ] && shift $((OPTIND-1))
[ -d "dir" ] && echo "dir"
[ "a.txt" -nt "b.txt" ] && echo "a.txt is newer than b.txt"
echo "end of the script.";
exit 0
-- end --
Bash から Ruby へ書き直しの指針みたいなものおまへんか。
require 'bash' とかすると、楽になるライブラリーおまへんか。
"option requires an argument -- b"
"illegal option -- x"
とかも自動で出て欲しい。
0233デフォルトの名無しさんNGNG
FileTesterクラスと単項マイナス演算子でファイルテスト演算子を実現できないかな?
0234デフォルトの名無しさんNGNG
require 'shugyo'
0235230NGNG
Perl ―> Ruby 本はあるが、Bash ―> Ruby 本は無いな。
基本的なことやけど、var=~/bin を Ruby ではどう書くのかとか。

ワテは、Bash から離れたいとは思いまへん。
Ruby で OO しようとも思いまへん。
ただ、ちーとばかし難儀になりよったとき助けてくれればええのや。
それなのに Ruby ときたら・・・

ワテが楽できなければ、サーバーの Ruby ライブラリ更新するつもりはない。
いちいち、ドキュメント読まなければならへんし。
おっちゃんは忙しいや、調べさせるな。
# Ruby 自体は気に入っとる。
0236デフォルトの名無しさんNGNG
> Perl ―> Ruby 本はあるが、Bash ―> Ruby 本は無いな。

そりゃ単にニーズが無いからでしょ。
0237デフォルトの名無しさんNGNG
>230
文字列処理がマンドクセとこだけ、インラインでRubyスクリプト書いて
``で結果取ったら如何か。
0238デフォルトの名無しさんNGNG
>>230
Bash と Ruby はターゲットが微妙に違うんだと思うけど。
シェルスクリプトで楽なところは、シェルスクリプトでやればいいし。
面倒なとこ(正規表現とか)だけワンライナーで Ruby に渡せばそれでいいんじゃ
ないかな、と思います。

というのが元の「そのまま Bash で押し通す」って意味? 無理して Ruby に
する必要はないと思う。

書いてあることは、やろうと思えばそんなに難しいことではないでしょう。た
とえば、def _d(v); FileTest.directory?(v); end のようなものを全部自作
しておくとか。一度作っておけば、あとは使い回せるしね。
0239デフォルトの名無しさんNGNG
Object指向言語に向かって、調べるのが面倒と言われても……
と、思った。
0240デフォルトの名無しさんNGNG
とりあえずSunのJava API Docsを見習ってほしい。

# もれはこないだWikiにちょっと貢献したぞ
0241デフォルトの名無しさんNGNG
また話がループしそうな悪寒
0242デフォルトの名無しさんNGNG
ライブラリとか書くとき、どの形式でドキュメント書きゃいいかわかんないんだよね。
0243デフォルトの名無しさんNGNG
「Ruby で日々のシステム管理を楽にする本」
0244デフォルトの名無しさんNGNG
カッコの入れ子に対応してマッチする正規表現って書けますか?

たとえば、Cの関数の第1引数の一覧を抜き出そうとして、/\w+\(([^)]+)[,)]/
と書くと $1 には第1引数が入りますが、
foo((x+y)+z)
と書くと、"(x+y"までしか入りません。

正規表現では無理!racc 使えって言われるような感じもするんですが、
racc だとCの文法全部 .y ファイルに書かないといけないので、
正規表現ですませられないかなぁ・・・と思ってるんです。
0245デフォルトの名無しさんNGNG
絶対無理です。
0246デフォルトの名無しさんNGNG
>>244
端的に言うと正規表現「だけ」で書くのは無理。文脈自由文法の世界だから。
ただ、 Perl では正規表現を独自拡張して、こういうのに対応しているね。

とはいえ、 racc/yacc を使えというのはさすがに大仰すぎると思う。

対処法1:
入れ子の数の限度が決まっているなら、その数まで対応するように書くことは
できる。たとえばその例題なら、/\w+\((.*?(\(.*?\))?.*?)\)/ とかね。

対処法2:
関数を自分で書く。開きカッコが来たら自分自身を呼んで、閉じカッコが来た
らそれまでスキャンした内容を返す関数を書くだけだから、簡単だと思う。
StringScanner とかあるし。

どうせ racc とかは、BNF(みたいなやつ)から関数を自動生成するためのプロ
グラムに過ぎないから、たいした手間じゃなきゃ自分で書く方が楽な場合もあ
る。
0247デフォルトの名無しさんNGNG
おもいっきりスレ違いだけど、perlreの言語クラスって何に相当するの?
0248デフォルトの名無しさんNGNG
L4+α
0249デフォルトの名無しさんNGNG
>>230
Rubyはシェルスクリプトの代替に向いていないです。
Getopt::Stdやファイルテスト演算子もある Perl で良いと思う。
CPANもあるし、perldocもあるので調べる苦労が少ない。
0250デフォルトの名無しさんNGNG
>CPANもあるし、perldocもあるので調べる苦労が少ない。
Rubyはプログラミングには向いていないです。
0251デフォルトの名無しさんNGNG
>>246
>Perl では正規表現を独自拡張して
そうなんですか?おもしろそうですね。調べてみます。

対処法1だと、ちょっと汎用性におとるので、対処法2で
検討してみたいと思います。scan とか遅いんだろうなぁと
思ってましたが、StringScanner なんてのが
あるんですね。勉強になりました。
0252デフォルトの名無しさんNGNG
正、負の数両方あり得る場合で負の数を認識する簡単な方法ってある?

i = 0xFFFFFFa8 #=>-88
i = 88       #=>88
■ このスレッドは過去ログ倉庫に格納されています