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

Ruby について Part 3

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

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

<前スレ>
Rubyについて Part 2
http://pc3.2ch.net/test/read.cgi/tech/1028906179/

<過去スレ>
Rubyについて
http://pc3.2ch.net/test/read.cgi/tech/1012096319/
0263デフォルトの名無しさんNGNG
>>262
文字というのがStringオブジェクトだとして
Integer#chr
String#[](index)
を使う

p 64.chr # '@'
p '@'[0] # 64
0264初心者NGNG
なるほど、ありがとうございました。
0265デフォルトの名無しさんNGNG
2.8.0preview2が出たというのに、静かだなぁここは。
0266デフォルトの名無しさんNGNG
違う、1.8.0preview2だ。鬱。
0267デフォルトの名無しさんNGNG
>>266
一瞬どういうネタだ? と思ったよ(w
0268デフォルトの名無しさんNGNG
「ここだけ時間が5年進んでいるスレ。」からの誤爆とか。
0269デフォルトの名無しさんNGNG
previewはもういいよ。早く2.0出してくれ。
0270デフォルトの名無しさんNGNG
まだやること山のように残ってんので無理。
0271デフォルトの名無しさんNGNG
rubyでCGIを書いているのですが、

printf('<p class="%s">%d<p>', ck, num)
print '<input name="'+name+'"' 〜

上記のような処理を下記のように全部書き直したら、
表示に6秒ほどかかってたのが3秒ほどになって、ちょっと感動しますた。

print '<p class="',ck,'">',num.to_s,'<p>'
print '<input name="',name,'"' 〜

文字列の連結とか時間がかかるんだなぁ。
0272デフォルトの名無しさんNGNG
>>271
前者のprintfはいちいち書式指定文字列をパースしているから。
前者のprint は余計な文字列オブジェクトを生成しているから。
0273デフォルトの名無しさんNGNG
>271
前者だと演算子のたびに新しい文字列オブジェクトを生成するからね。
ま、ふつうは

print %Q(<p class="#{ck}">#{num}<p>)
print %Q(<input name="#{name}"〜)

とか書くわけだが。
0274デフォルトの名無しさんNGNG
Person オブジェクトには、Person#name や Person#addr といったメソッドがあり、
実際には DB への問い合わせを行っているものとします。
DB の host 名や user や password などの設定を /etc/personrc に記述したい場合、
Person クラスへこの設定をくべるには、どのような設計にするのが良いでしょうか?

>>273
"#{num}" は新しい String オブジェクトを生成しないんでしょうか?
それとも生成してしまう?
0275デフォルトの名無しさんNGNG
>>274
> "#{num}" は新しい String オブジェクトを生成しないんでしょうか?
> それとも生成してしまう?

そこだけは新しいStringオブジェクトを生成する。num.to_sと同じ。
今までそんな文字列はどこにも存在しないんだから当然。
0276デフォルトの名無しさんNGNG
>>274
「くべる」って薪かよ。

すべてのPersonオブジェクトは単一のDBを共有するわけ?
最初にコネクションを張るときに読めばいいんじゃないの。

""ってだけでも常に新しいStringオブジェクトを生成するわけだが、
"#{num}"は(1.8では)""<<num.to_sと等価。
0277デフォルトの名無しさんNGNG
/.J が珍しく面白いことをやってる。

インタビュー:Rubyの まつもとゆきひろ に聞け!
http://slashdot.jp/articles/03/03/07/0413248.shtml?topic=86
0278デフォルトの名無しさんNGNG
趣味は聞くまでもないだろう。と思った。
0279デフォルトの名無しさんNGNG
「ケサランパサラン」って、どんな生物?
ttp://www.asahi.com/kansai/030308a.html
0280デフォルトの名無しさんNGNG
truncate ってどこで区切って、なんて読むんですか?
0281デフォルトの名無しさんNGNG
普通の英単語なんだが
0282名無しさんNGNG
>>280
「とらんかて」という関西弁のアルファベット表記です。
0283デフォルトの名無しさんNGNG
> お気に召さない場合は「インライン・コールバック」でも「ケサラン・パサラン」
> でも,なんでもお好きな名前に自由に読み換えてください.
ってなんだかなあ…
0284デフォルトの名無しさんNGNG
インタビューおもしろかった。
0285デフォルトの名無しさんNGNG
まつもとさんのインタビュー読んで思ったのだけど、Ruby はギャグ、ユーモア
という点で、Perl や Python に完全に負けてると思う。
Larry Wall や Tim Peters みたいにシャレの効いた言い回しのできる人がいない。
これけっこう重要なことだと思う。
0286デフォルトの名無しさんNGNG
うーん。
しかし、日本人のプログラマでユーモアのセンスがある人って見たことない。
0287デフォルトの名無しさんNGNG
>>286
namazuの高林さんてどう?
ユーモアのセンスありすぎだと思うけど、
ちょっと方向性が違うか。
0288デフォルトの名無しさんNGNG
高林さんっていうか、ソニーCSL絡みの人はみんな面白いですね。
0289デフォルトの名無しさんNGNG
こういうのをまじめくさって話す時点で
もうシャレが通じないっていうか...。
0290デフォルトの名無しさんNGNG
ML によく投稿してる中田さんの
>--- 僕の前にBugはない。
>--- 僕の後ろにBugはできる。
っての俺好きだなぁ。
初めて見たときニヤリとしたよ。
0291デフォルトの名無しさんNGNG
ユーモアの感想をいうことほど面白くないものはない
0292デフォルトの名無しさんNGNG
>>290
人によっていろいろ解釈があるみたい
0293デフォルトの名無しさんNGNG
「ふえろ! わかめちゃん作戦ですえ但」は今年に入って消えたのな
0294デフォルトの名無しさんNGNG
「え但」って?
0295デフォルトの名無しさんNGNG
ハートマークが化けた状態か?
そういう化け方は見たことないが
0296デフォルトの名無しさんNGNG
>>292
ん、どんな解釈?
0297デフォルトの名無しさんNGNG
>>296
僕の書いたコードにバグはないが、後から続く者がバグを産む。
僕が書く前にはバグはないが、僕が書いた後にはバグを産む。
0298デフォルトの名無しさんNGNG
道程なんだから前者ってことはなかろう
0299デフォルトの名無しさんNGNG
>>296
http://sourceforge.net/mailarchive/message.php?msg_id=1349966
化けるので引用
> 「バグばっかりつくってごめんなさい」
> というのが、いちばん単純な解釈でしょうが、
> 謝ることができるということの裏には、
> 実際にコードを書いて働いていることや、
> 誤りを自ら認める心の広さが表現されているように
> 思えます。あるいは、「Bugはない」というのは
> 「コードそのものがない」ということを意味するとすれば、
> 開拓者魂の表現のようにも見えます。
> いずれにせよ、Bugの理由を、「コードは一般的にBugを
> 含むものだ」と「単に中田さんの技量の問題だ」の
> どちらの立場で解釈するかが、最初の分れ道ですね。
0300デフォルトの名無しさんNGNG
まさに >291 の言うとおりユーモアの解説は無粋だ。
>299 を攻めてるんじゃなくてそのリンク先の人ね。
笑えりゃOK、笑えなければポイでいいと思うんだがなぁ。
0301デフォルトの名無しさんNGNG
↓こういう感じで書けば圧縮ファイルができます。
o = open('|gzip -c > a','r+')
o.print 'aaaaaaaaaaaaaaaaaaaaaa'
o.close

それをファイルに書き出さないで、メモリに読み込む方法はありますか?
↓こういうイメージです(このコードは動かない)
o = open('|gzip -c','r+')
o.print 'aaaaaaaaaaaaaaaaaaaaaa'
data = o.read
o.close

リファレンスのIO.popenのサンプルで、catを使ってそういう
ことをやっているので、なにか方法がありそうなのですが。
0302デフォルトの名無しさんNGNG
Warlus のひとの
「stableでなければ生きていけない。unstableでなければ生きてる意味がない」
ってのが好き
0303デフォルトの名無しさんNGNG

                         _人
                      ノ⌒ 丿  うんこ〜♪
                   _/   ::(
                  /     :::::::\ うんこ〜♪
                  (     :::::::;;;;;;;)_  うんこ〜♪
                  \_―― ̄ ̄::::::::::\
              \  ノ ̄     ::::::::::::::::::::::)  /うんこ〜♪
                \(     ::::::::::::::;;;;;;;;;;;;人/
                / ̄――――― ̄ ̄::::::::\
               (    ● \__/::●:::::::::::::)
                \__::::::::::\/;;;;;;;;;;;;;;;;;;;;;;ノ
   うんこ〜♪
0304301NGNG
http://www.tcn.zaq.ne.jp/sheepman/diary/200108.htm#23
検索してたら解決方法がわかりました。
(こんなことに一日かかってしまった…)
0305デフォルトの名無しさんNGNG
Rubyで作られているらしい
http://www6.big.or.jp/~beyond/bbsnews/
0306デフォルトの名無しさんNGNG
Rubyで作られているらしい
http://qwerqwer1234.hp.infoseek.co.jp/mudah/mudah.swf?Target=%82%E9%82%D1%82%AB%82%BF%82%B3%82%F1
0307デフォルトの名無しさんNGNG
おしえてください。
次の変形はどうやるの?
str = "123"
#=> "1,2,3"
0308デフォルトの名無しさんNGNG
>307
p "123".gsub(/(.)(?=.)/, "\\1,")
p "123".split(//).join(",")
0309デフォルトの名無しさんNGNG
>307
こんなのはどう?
p "123".scan(/\d/).join(',')
0310デフォルトの名無しさんNGNG
p("1,2,3") if str == "123"
0311デフォルトの名無しさんNGNG
>>310
こんなのにウケてしまうのが、自分で悔しい。
0312デフォルトの名無しさんNGNG
>>310-311
アハハ
0313デフォルトの名無しさんNGNG
RubyがANSIとかで標準化されるのはいつですか?
0314デフォルトの名無しさんNGNG
松本がアメリカに帰化するとき
0315デフォルトの名無しさんNGNG
その前に、JISで標準化されます。
0316デフォルトの名無しさんNGNG
RubyがJISとかで標準化されるのはいつですか?
0317デフォルトの名無しさんNGNG
マツモトの偽者、Rubyのルイジ貧が出てこない限りは、
標準化する必要がないです。
0318デフォルトの名無しさんNGNG
俺はそんなものは望まない!
0319デフォルトの名無しさんNGNG
すでに大部分の機能をPythonにパクられているわけだが
0320デフォルトの名無しさんNGNG
>>319
これまでのPythonがダメダメだったんでいいんでないかい
0321デフォルトの名無しさんNGNG
>>319
え?そうなん?
どのへんがパクられたのか、どっかでまとめられてたりするかな?
0322デフォルトの名無しさんNGNG
foo = 7 if !foo
をすっきり書くには
foo ||= 7
が定石だけど,
foo = (foo ? foo.to_i : 7)
はなんかうまく書けないでしょうか?
foo を 3 回も書くのがいやすぎ.

-s オプションお手軽で好きなんだけど…
0323デフォルトの名無しさんNGNG
foo = (foo || 7).to_i
0324デフォルトの名無しさんNGNG
ちょっと話しずれるけど、foo = 0 にもできるようにしたい場合を考えると、
Perl じゃなくてよかったと思えるね。
0325デフォルトの名無しさんNGNG
メソッドチェインで、途中でnilになったらそこでエラーにせずに止める、とい
うようなオペレータがかつて議論にのぼったことがあったような気がするが、
どうなったんだろう。
最近追い掛けてないのでage.
0326デフォルトの名無しさんNGNG
>>325
立ち消え状態だと思うが、こんなのはどうよ?

module Kernel
 def ifnil?
  self
 end
end
class NilClass
 def ifnil?
  yield
 end
end

catch(:nil) {
 hoge.foo.ifnil?{throw :nil}.bar.ifnil?{throw :nil}.zot
}
0327デフォルトの名無しさんNGNG
>>326
こんなのは?

class Object
 BLACKHOLE = Object.new
 def BLACKHOLE.to_s() "()" end
 def BLACKHOLE.method_missing(*x,&y) self end
 def default(v=BLACKHOLE,&b) self or BLACKHOLE end
 def and() default end
end

class NilClass
 def default(v=BLACKHOLE,&b) block_given? ? yield : v end
end

puts ARGV.shift.and.hex
puts ARGV.shift.default("0").hex
0328デフォルトの名無しさんNGNG
>>327
>  def default(v=BLACKHOLE,&b) self or BLACKHOLE end
 def default(v=BLACKHOLE,&b) self or v end
0329デフォルトの名無しさんNGNG
もっともだ
0330デフォルトの名無しさんNGNG
Ruby界で標準のXMLライブラリってどれですか?

用途は、XML文章を操作するというのかなんというかDOMやらSAX
が使いたいんです(まだどっちがどうなのかよくわかっていませんが)。
配布する環境はUNIXなんですが、開発はWindowsなんで、
どちらでも使えるとうれしいです。
0331デフォルトの名無しさんNGNG
REXML
余裕があるなら xmlscan をいじってみると面白いと思う。
0332デフォルトの名無しさんNGNG
標準って何?
オープンソースって同一機能の複数実装が魅力なわけ。
標準なんてあるわけない。
もしも標準なんてあってそこを精密爆撃で狙われたら
標準が消滅しちゃうでしょ。
そのリスクを回避するために一見無駄な冗長性を持たせてるわけ。
0333デフォルトの名無しさんNGNG
すごい簡単なことかもしれないけど、質問させてください。

Ruby であるテキストファイル中の特定の語句を置換したいとします。
例: いぬ いぬ いぬ ねこ -> いぬ いぬ いぬ いぬ (ねこをいぬに置換)
(要するに sed みたいなことがやりたい)

単純に File.open して each_line で置換したい語句があるかどうか調べていき、
マッチしない場合にはそのままの行を、マッチした場合には置換した行を一時ファイルに書き出し、
最終的に一時ファイルを元のファイルに rename する、ということを考えました。

この例だと一時ファイルを使ってしまいますが、一時ファイルを使わずに each_line で
見ていきながら、マッチする部分を直接書き換える、ということってできますか?

もしあれば、コード例を示していただけると助かります。
0334デフォルトの名無しさんNGNG
>>333
よくわからんが、ruby の -i オプションを使えば解決されるような話?
0335デフォルトの名無しさんNGNG
なんか正規表現の変更の話が出ているみたいだけど、

[-0-9]

のような表現って多用しませんか?
いまさら

[\-0-9]

と書けって言われても、って感じ。
0336デフォルトの名無しさんNGNG
>>333
デカいファイルを突っ込むとメモリ馬鹿食いするけどこんなの。

TEXTFILE = 'inuneko.txt'

if (s = IO.readlines(TEXTFILE).map!{|line| gsub(/ねこ/, 'いぬ')})
 open(TEXTFILE, 'w').print(s)
end
0337336NGNG
あ。だめだ。これだとどんな場合でも書いてしまう。

if (s = IO.readlines(TEXTFILE).map!{|line| gsub(/ねこ/, 'いぬ')}) # ×
if (s = IO.read(TEXTFILE).gsub!(/ねこ/m, 'いぬ')) # ○

0338デフォルトの名無しさんNGNG
>>336
これならデカいファイルでも安心。
どんな場合でも書いちゃうし非 unix 環境でちゃんと動くかは知らないけど。

File.open(file) { |src|
 File.unlink(file)
 File.open(file, 'w') { |dest|
  src.each_line { |line|
   dest << line.gsub(/ねこ/, 'いぬ') }}}
0339デフォルトの名無しさんNGNG
ruby -i -pe 'gsub(/ねこ/, "いぬ")' *.txt
じゃだめ?
0340デフォルトの名無しさんNGNG
>>335
正直いやん
0341デフォルトの名無しさんNGNG
rubyさわっててつまってます。

text = <<-AHYA
fooTEXTboo
AHYA

hoge = '\1000yen'
p text.sub(/TEXT/, hoge)

このスクリプトで出力が
foo\1000yenboo\n
となるのを期待してるのですが\1が消えてしまいます。
消えないようにするにはどうしたらいいのでしょうか?
0342デフォルトの名無しさんNGNG
\を¥にする
0343デフォルトの名無しさんNGNG
>>335
perlとかでも多用されているもんな。
0344341NGNG
>>342
そんな一休さんみたいな答えじゃなくて他の案をお願いします・゚・(ノД`)
0345デフォルトの名無しさんNGNG
hoge = "('1000yen'.to_i / 10 - 10 + 10 / 10).chr.succ" + "1000yen"
0346デフォルトの名無しさんNGNG
>>341

text.sub(/TEXT/) {hoge}
0347341NGNG
>>346
ありがとうm(__)m

>>345
わからないです…_| ̄|○
0348デフォルトの名無しさんNGNG
>>341
hoge = '\\\\1000yen'
0349デフォルトの名無しさんNGNG
>>347
誰かがまとめてたの見たことあるよ
本家マニュアルサイトの「落し穴」あたりをあたってみては
0350デフォルトの名無しさんNGNG
>>348
それは直感的にわかりにくい。

>>346 のほうが新婦瑠でわかりやすいから、暗号的なプログラムを書きたい
のでないかぎり、ブロックを使ったほうが良いと思う。
0351デフォルトの名無しさんNGNG
>>335
POSIX regex で許されてる表現はそのまま通って欲しいな。
0352not333な初心者NGNG
>>338
の解説キボウ。お願いします。
なぜ、これなら、でかいファイルでもメモリを浪費しないんでしょうか?
2行目のunlinkが関係してるようなんですが。。
openしたブロックの中でunlinkって??
0353338NGNG
>>352
1. each_line なので全行をいっぺんにメモリに格納しません。

2. ファイルを open した状態で unlink してもファイルの中身は消えません。
(open したプロセスが一個も無くなってから消えます)
unlink 後に同名のファイルを open しても旧ファイルの中身に触れることはできません。
0354not333な初心者NGNG
>>353
じゃあ、メモリを浪費しないのは、each_lineを使ってるからで、
処理前と処理後を、同名のファイル名にしたい今回のような場合は、
一行ごと、each_lineするためには、unlinkして、
旧ファイルの内容と、新ファイルの内容を別々に扱ってるってことですね。

ありがとうございました。
0355デフォルトの名無しさんNGNG
>>354
だから結局一時ファイルを使っているのと変わらないのよ。
0356333NGNG
どうも、ファイル書き換えについて質問させていただいた 333 です。

338 さん、プログラムリストと解説ありがとうございました。
0357デフォルトの名無しさんNGNG
>>338
少なくともDOSISH(mswin32, mingw32, bccwin32, djgpp, たぶんhuman68kも)
ではopenしているファイルを削除することはできない。
それ以外は分からん。
0358デフォルトの名無しさんNGNG
RUBYってSmalltalkのぱくりだったんですね
0359デフォルトの名無しさんNGNG
んなこと言ったら、Rubyにオリジナルなとこなんて無い
0360デフォルトの名無しさんNGNG
色んな言語の良いとこ取りですよ?
0361デフォルトの名無しさんNGNG
mswin版のruby使ってるんですけど、
倍精度の浮動小数点数使うにはどうしたらいいの?
0362デフォルトの名無しさんNGNG
Float で間に合わないときは BigFloat
■ このスレッドは過去ログ倉庫に格納されています