トップページ⇒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/
0492デフォルトの名無しさんNGNG
>>491
.{0,0} は空文字列に最低一回マッチする。
0493489 (not (484 or 491))NGNG
>>490
あぁ、なるほど。理解できました。

(a*) は、1回目のマッチで 'a' を食べて、
2回目のマッチで '' を食べたところで繰り返しが終了し、
その時点のマッチの状態ってことで $1 = '' がセットされたってわけですね。
0494デフォルトの名無しさんNGNG
>>493
まあこういうのはマニュアルなんかにはあまり詳しく書かれてないから
Friedl の Mastering regular expressions でも買って読むのが吉
0495491NGNG
えっと、.* が空文字にヒットするのは分かるので、
2回目のマッチが行われれば $1 に '' が入るのは分かるのですが、
1回目のマッチですべての文字列を食べ終わっているのに
2回目のマッチを行おうとするというのがどうも理解できません。

文字列の最後に仮想的な空文字を想定して、
1回目のマッチ後ではそれがまだ残っているというふうに考えるのでしょうか。
0496デフォルトの名無しさんNGNG
>>495
まあそうなんだが「仮想的な空文字を想定して」というのはよく分からん。
まず空文字ではなくて空文字列というべきだろう。
そして仮想的に想定しているのでなく実際にある。
0497デフォルトの名無しさんNGNG
Time#to_s をそのまま Time.parse しても元に戻らないってのは不便じゃないですか?

irb(main):008:0> t = File.stat('foo').mtime.to_s
=> "Fri Jul 26 23:01:14 GMT+9:00 2002"
irb(main):009:0> Time.parse t
=> Sat Jul 26 23:01:14 UTC 2003
0498デフォルトの名無しさんNGNG
Time#to_s のフォーマットは好きに変えられるんだからいいじゃん?
0499デフォルトの名無しさんNGNG
Time#to_s って %Z とかあるからOS依存なのでは
0500デフォルトの名無しさんNGNG
>>497
そういうTZってありだっけ?

begin-base64 644 tz.diff.gz
H4sIAAAAAAACA71Ry2rbQBRde77iLAKRMh7r4dgmA0IJKZQssknclWWKLI3C
gCyZGdmkxvTbM3rFSeqmi0LuQvcx95xzxbkrUvHMkcuVk8aVcLJSreNqpFYk
+P8gD7ePyGQuOJxkpx21Xf1ytEra4k/N4Y4oUSkpdrJ4gjJJy7KAN5qSVGYZ
2BbMB9uAKTPD8VbG2IlfGPhXuI8VfNcdw53y8RWfuGCuiUHNSSk9iRrjZtOh
fJ/7U+52KHJ9bQ64nAxnoG0ygySPtcY3w0EwGACI9EVXWYQ1GVjEbL+kVsgj
TVNd2WG0IrR7M9OndXXYVokdLhhdRmm9yEOT7Y7ocCT6uEA/UWjBLYkdkruj
15Vciy8zuRP7q7ued8Jez0N/ZO9u139uqyHrfX3d/2DojHuXbwyducMJaPN9
tXNuoARtlOa0AIXM+8G+LISZ1Gm03SSxFoS1LzKDE91YC8qWthWlUWrzsM3R
3kHwu8EQ+m455N/v54cf81s7/BcQeHeSdeYhCHDOzhGCeeDwbFyYsT+qyp/S
lFMXFGfjprWbvucQuW71a8la6K3OCx+CUAoVBAAA
====
0501デフォルトの名無しさんNGNG
あ、lib/time.rbのほうは不要だった。
0502デフォルトの名無しさんNGNG
初歩的なことですが、どなたか教えて下さい。
実行結果、「123aaa456789」を期待していたのですが、
「123aaa789」となってしまいました。ファイルの途
中に追加書き込みするには、どうしたらよいのですか。

f = open("text","w")
f.print("123456789")
f.close

f = open("text", "r+")
f.seek(3, IO::SEEK_SET)
f.print("aaa")
f.close
0503デフォルトの名無しさんNGNG
>>502
直接的な手段はない。
ファイルの途中に直接挿入はできないので、
挿入したい位置から先を後ろへずらす必要がある。

0504デフォルトの名無しさんNGNG
>>502
ファイルがそれほど大きくなければ
f = open("text", "r+")
img = f.read       # 全部読んで
img[3,0] = "aaa"   # ファイルイメージを文字列として編集して
f.truncate(0)      # ファイルを切り詰めて
f << img           # 書き出すのが頭を使わなくて楽
f.close
0505497NGNG
OS依存というのは知りませんでした。
>>497はWindows2000のcygwin環境です。

>>500 どうもありがとうございます。
0506デフォルトの名無しさんNGNG
>>505
そのTZフォーマットの典拠を明示できるなら、
bugs-jaにでも投げといてくれるとありがたい。
0507502NGNG
>>503,504
どうもありがとうございます。

ファイルが大きく、編集箇所も多いので、
結局、以下のようにしました。

f_read = open("text1","w+")
f_read.print("123456789")
f_read.rewind

f_write = open("text2", "w")
f_write.print f_read.read(3)
f_write.print ("aaa")
f_write.puts f_read.gets

f_read.close
0508デフォルトの名無しさんNGNG
>>http://pc2.2ch.net/test/read.cgi/tech/1045074808/721
def random_permutation(n,k) (0..n-1).sort_by{rand}[0,k] end

sort_by は便利だ
0509デフォルトの名無しさんNGNG
>>508
(0..n-1).sort_by{rand}
(0..n-1).sort{rand<=>0.5}
確率的な違いをどう表現したらいい?
0510デフォルトの名無しさんNGNG
>>509
(0..n-1).sort_by{rand} が以下と等価かどうかすら分からん

def perm(a, k=0, v = [])
n = (a = a.to_a).size-1
n == k ? v<<a : (k..n).each{|i| perm((b=a.dup;b[k],b[i]=b[i],b[k];b),k+1,v)}
v
end

perm(0..n-1)[rand((1..n).inject(1){|v,x|v*x})]
0511デフォルトの名無しさんNGNG
qsortが平均n・log(n)っていうときの平均ってどれ?
0512デフォルトの名無しさんNGNG
>>511
どれ?と聞く以上は選択肢を出していただきたい。
0513デフォルトの名無しさんNGNG
>>512
qsortの平均コスト評価で想定している分布って
(1) (0..n-1).sort_by{rand} # n個の一様乱数の順序
(2) (0..n-1).sort{rand<=>0.5} # ランダムな2分割による入れ換え?
(3) >>510 # 順列上の一様分布
(4) 上記以外
のどれ?
0514デフォルトの名無しさんNGNG
>>513
それは (3) だが (1) や (2) が (3) と等価なのかは知らん。
0515デフォルトの名無しさんNGNG
RubyUnit で自動テストを cron 等で行い、テスト結果を html で出力したいのですが、
そいういったことをしてくれるツールが検索しても見当たりませんでした。

こんなツールがあるよといった情報や、他の Ruby 用 Unit Test ツールでは実装
されているという情報がありましたら、教えてください。
0516デフォルトの名無しさんNGNG
>>515
cronの方はどうとでもなるとして、htmlのそれっぽい出力はないんじゃないかな。
ui/gtk/やui/fox/のtestrunner.rbを参考に書いてみては?
0517デフォルトの名無しさんNGNG
>>515
RubyUnitはTest::Unitに統合されてるのでそっちを使ったほうがいいかも。
HTMLでの出力というのがどういうものを求めてるのかよく分からんが、
test/unit/ui/html/testrunner.rbを他のtestrunnerを参考に書いてくれると
嬉しい人が増えると思われ。
0518デフォルトの名無しさんNGNG
ちゃんと>>516が書いてるじゃん。なんで見落とすかな。
0519デフォルトの名無しさんNGNG
rubyのスコープがわかりません


スクリプトファイルはじまり
#!/ruby

if なんとか
 i = 10 #ここではじめてiが出てくる
end

print "#{i}\n" # 10
おわり

ifの中で初めて使う変数が、ifの外でも使えます。
これってあり!?
0520デフォルトの名無しさんNGNG
制御構造はスコープを導入しないよ。

http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=trap%3A%3A%A5%B9%A5%B3%A1%BC%A5%D7%A1%A2%C0%A9%B8%E6%B9%BD%C2%A4
0521デフォルトの名無しさんNGNG
a=Hash.new([])
b=a["3"]
b[4] = b[4].to_i + 1

で、a["3"][4] が1になって欲しいんですがならないのはどーして?
0522デフォルトの名無しさんNGNG
それで、a["3"][4]は1を返すよ。
ただし、多分意図している動作とは異なる。
http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=trap%3A%3AHash
0523521NGNG
>522
ほんとだ、a["3"][4]は1を返しますね。
でも、 a.inspect => {} となってしまいます。
a.each do |key,val| とかなにも返って来ませんし、、、

Ruby 1.6.7 です。
0524デフォルトの名無しさんNGNG
>>523
調べればあちこちに書いてあると思うけど、
Hash.new(obj) の引数 obj は Hash#default の値として保持され、
このオブジェクトは存在しないキーへの参照があったときに返される。
  h = Hash.new("Go Fish")
  h["a"] = 100
  h["b"] = 200
  h["a"]    #=> 100
  h["c"]    #=> "Go Fish"
  h.default #=> "Go Fish"
  h["c"] << "pond"
  h["c"]    #=> "Go Fishpond"
  h.default #=> "Go Fishpond"
  h["c"] = 300
  h["c"]    #=> 300
  h.default #=> "Go Fishpond"
  h["d"]    #=> "Go Fishpond"
0525デフォルトの名無しさんNGNG
>>523
>>522のリンクを読めよ。
0526デフォルトの名無しさんNGNG
>>522 のリンクの説明、「デフォルト値」っていう表現が良くない気がする。
「デフォルトオブジェクト」とかにすれば勘違いしづらいかも。
0527デフォルトの名無しさんNGNG
そう思ったら直せばいい。
0528デフォルトの名無しさんNGNG
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-06515-4
↑これ読んだ人、乾燥キボンヌ。
0529デフォルトの名無しさんNGNG
>>528
乾いてたよ。
0530デフォルトの名無しさんNGNG
乾いて候
0531デフォルトの名無しさんNGNG
「クラスのインスタンス変数」って何に使うんですか?
クラスのインスタンス変数をインスタンスのインスタンス変数として使っちゃだめ?
0532デフォルトの名無しさんNGNG
クラスのインスタンスのインスタンス変数してなら使えるけど?
0533デフォルトの名無しさんNGNG
>>532
では、クラスのインスタンスのインスタンス変数として使っちゃ駄目?
つまり「クラスのインスタンス変数」と「そのクラスのインスタンスのインスタンス変数」
の使い分けを教えて欲しいのれす。
0534デフォルトの名無しさんNGNG
テンプレ
0535デフォルトの名無しさんNGNG
JaMing/Ruby って面白そうね。
0536デフォルトの名無しさんNGNG
>>533
それは全然違うと思うけど。
クラスのインスタンス変数は、継承したくなくて(クラス変数じゃ駄目)、
公開もしたくない(定数も駄目)が、クラスに所属させたい名前じゃないかな。
例えば特異メソッドで使う値とか。
0537533NGNG
この結果を見ると、どうもクラスに所属してない気がしてしまうのですが、なぜこうなるのでしょう。
--(コード)--
class Person
@name
def initialize(name)
@name = name;
end
def say
p @name
end
end

p1 = Person.new("foo");
p2 = Person.new("bar");
p1.say();
p2.say();
--(結果)--
"foo"
"bar"
--
両方とも "bar" ってなってほしかったのですが、、
0538デフォルトの名無しさんNGNG
@name じゃなくて @@name
0539デフォルトの名無しさんNGNG
>>537
> class Person
> @name
この@nameと
> def initialize(name)
> @name = name;
この@nameは別物。

前者はPersonというClassオブジェクトのインスタンス変数。
後者はPersonクラスのオブジェクトの持つインスタンス変数。
0540デフォルトの名無しさんNGNG
ありがちなクラスのインスタンス変数の使い方

class C
  @n = 0
  def self.n() @n end
  def self.new() @n += 1; super end
end

class S<C
  @n = 0
end

S.new; C.new; C.new; C.new; S.new;
p [C.n, S.n] #=> [3, 2]
0541デフォルトの名無しさんNGNG
>>427

ファイル無しでimage instance作りたいってこと? フツーに new すりゃいいし
0542デフォルトの名無しさんNGNG
クラス変数使いこなしてるってひといますか?
イマイチどんなつかいでがあるのかわかんない。
サブクラスでの変更がスーパークラスへ反映されなければいいのに、
と思うことが多い。
0543デフォルトの名無しさんNGNG
>>542
つかってるよ。例えばなんかのデフォルト値とか。
サブクラスでも同じデフォルト値を使いたいからね。
定数でもいいんだけど、デフォルト値を変更したいときもあるから。

目的に応じて、クラス変数とクラスインスタンス変数を
つかいわければいいんじゃない?
サブクラスでの変更を親クラスへ反映させたければクラス変数、
させたくなければクラスインスタンス変数。
0544デフォルトの名無しさんNGNG
>>543
おお、クラスインスタンス変数ってのがあるんですね (←節穴野郎) 。
>>540 みたいに使うのか。
なんか漏れにもうまいこと使い分けれそうです。ども。
0545sageNGNG
あのーすみません。なんか呼び名がごちゃごちゃしているのですけど、
正しい読み方ってどういう風に呼ぶのでしょうか??? > @、@@
クラスのインスタンスが持つ変数を「インスタンス変数」
クラスが持つ変数を「クラス変数」
という風に覚えていたのですけど、違ったのですか???
0546デフォルトの名無しさんNGNG
はうっ。
sage間違えた‥
0547デフォルトの名無しさんNGNG
>>545
あってる
@instance_variable オブジェクト毎
@@class_variable クラス毎
クラスはそれ自身がオブジェクトでもあるので両方持てる
0548デフォルトの名無しさんNGNG
mswin用gdbm.so バイナリを公開している所はないですかね。
http://jarp.jin.gr.jp/win32/aは知っているのだけれど、gdbm.soはないです。
Makefile が妙でnmake失敗してしまうです。
0549デフォルトの名無しさんNGNG
ttp://jarp.jin.gr.jp/win32/ でした。
0550デフォルトの名無しさんNGNG
gdbm.dllを.soにリネーム
0551548NGNG
ぐわっ、こんな簡単なことだったなんて。
ありがとうございました。
0552デフォルトの名無しさんNGNG
windowsの.dll=*nix系の.so
って事を知らない人、結構いるね。
この板だと話が通じない事多い。
0553デフォルトの名無しさんNGNG
同じだったの?ELFとCOFFとかって違わないの?
0554デフォルトの名無しさんNGNG
同じと思っててイイヨ
0555デフォルトの名無しさんNGNG
この板だと
>>553みたいに
話が通じない事多い。
0556Rubyist@553NGNG
ウゼェェェェェエエェェェーーーーーーェェーェーェ>>>>>>>>>>>>>555
しらなかったんだよシラネーよ知って根ーよシラララララララネネネネネネネシラネー
ヨヨヨヨヨヨヨヨヨヨヨヨヨヨヨヨ
ブァベブチャグチャグハアァァアアアアァァブァァアアァアアウアウアアウアウウウウウアウウアウウアあうアウアアウアウガアアアアアウゥァウガアカカカガ゙カクククセゼグギ
0557デフォルトの名無しさんNGNG
http://jarp.jin.gr.jp/win32/gdbm-1.8.3-1-mswin32.zip
をダウンロードし、
\bin\gdbm.dll 21,504 03/04/22
を、gdbm.soとリネームし、
require 'gdbm' したところ、

\hage.rb:1:in `require': 127: 指定されたプロシージャが見つかりません。 - Init_gdbm (LoadError)
./gdbm.so

が出てしまいました。
ruby 1.6.8 (2002-12-24) [i586-mswin32] です。
0558デフォルトの名無しさんNGNG
嘘を嘘と見抜けない人は……(ry

まあ、元の聞き方が悪いから仕方がないけど。
それはrubyから(gdbmモジュールを通して)使うgdbmライブラリ本体だよ。
それくらいzipファイルの中身を見て見当つけなさい。

0559デフォルトの名無しさんNGNG
つーか、jarpのwin32ディレクトリの存在を知ってるのにその意味を知らない
というのはいかがなものか。
0560デフォルトの名無しさんNGNG
Ruby のスレで嘘を付かれるなんて、信じていたのにッ。
0561デフォルトの名無しさんNGNG
>558
後学のためにどう聞けば良かったか教えてください。
0562デフォルトの名無しさんNGNG
>>561
558じゃないけど。

Makefileがどう妙なの?
どうやってMakefileを作ったの?
rubyのバージョンは?(557に書いてあるけど)

あたりは最低限必要かと。
それがわかれば、もうちょっとましな質疑応答になると思われ。

ちなみに、今回の場合は、550が嘘で552は本当だけどミスリーディング。
0563デフォルトの名無しさんNGNG
RDってHTMLと比べて何が嬉しいんですか?
0564デフォルトの名無しさんNGNG
生でも読みやすいところ?

unix板の情報整理スレでも「メモはRDで書いてる」ってのが
何度か挙げられていたから、良いモノなのかも。
0565デフォルトの名無しさんNGNG
タグが少ないからうちやすい
0566デフォルトの名無しさんNGNG
RD って plain2 と比べて何が嬉しいんですか?
0567デフォルトの名無しさんNGNG
Apacheのログの解析してるんですが、
ttp://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&q=Google+UTF-8+%E6%A4%9C%E7%B4%A2%E6%96%87%E5%AD%97%E5%88%97+Ruby&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
のq=???の日本語部分のデコードができなくて困っています。
CGI.unescape や NKF してたんですが、うまくいきません。
UTF-8だからかな?
できればポインタなどお願いします。
0568デフォルトの名無しさんNGNG
>>567
UTF-8は現nkfでは扱えない(nkf自体Unicode制定前のものだから当然だが)ので、
uconv,iconv,unkfあたりを使う。在処は

uconv: RAA
iconv: 1.8では標準、1.6ならshim
unkf: rough

0569デフォルトの名無しさんNGNG
>>568
さがしてやってみます。
0570567NGNG
できました。
unkfをインストールして、
require "cgi"
require "unkf"
q="%93%FA%96%7B%8C%EA"
NKF.nkf("-e", CGI.unescape(q))
で、EUCの文字列が取得できました。

どうもありがとうございます。
0571デフォルトの名無しさんNGNG
print nil
とすると、nilと表示されてしまうのですが、これを何も表示されないようにしたい。

class NilClass
def to_s
''
end
end
としても、
def nil.to_s
''
end
としても、nilと出力されてしまう。

どうすればよいか、知恵を拝借したい。
printを再定義しないとだめ?
0572デフォルトの名無しさんNGNG
inspect を再定義。
つか、print 対象に nil がこないようなロジックにすべきじゃないかと。
0573デフォルトの名無しさんNGNG
>>571
諦めてprintを再定義してくれ。

>>572
inspectをどれだけ変えても無駄では?
なにしろ、printのソースが
 case T_NIL:
  rb_io_write(out, rb_str_new2("nil"));
だ。

0574デフォルトの名無しさんNGNG
>>573
あ、ほんとだ。早とちりだった。
0575デフォルトの名無しさんNGNG
>>573
まじで?ソースコード埋め込みだったのか。

質問の背景を説明すると、RubyでCGIを作成してて、
cgi = CGI.new
user, = cgi['user']
mail, = cgi['mail']
print user, "<br/>\n"
print mail, "<br/>\n"
としてるんだけど、このときuserやmailがnilと表示されるので
どうにかしたかった。いちいち
user ||= ''
mail ||= ''
とするのもうざったいし。
こんなとき、みんなはどうしてるの?
0576デフォルトの名無しさんNGNG
>>575
もっといい方法がありそうだが、
user = cgi['user'].first || ''
なんてのはどうだろう。一行で書けるし。
0577デフォルトの名無しさんNGNG
print "#{user}<br/>\n"
print "#{mail}<br/>\n"
0578デフォルトの名無しさんNGNG
>>575
576+577で脳内idiom化済み。
0579デフォルトの名無しさんNGNG
>>576
最初はこうしてたんだけど、
http://localhost/login.rbx
と
http://localhost/login.rbx?username=&password=
とを区別したかったので(前者ではcgi['username'][0]はnil、
後者では "" )、使わないことにした。

>>577
これ、うまくいくね。ありがとう。
でもなんで?もし仕組みをしってたら教えてください。
0580デフォルトの名無しさんNGNG
#{} は String 以外は to_s で String に変換するから。

もちろん明示的に
print user.to_s, "<br/>\n"
としても望み通りになる。
0581デフォルトの名無しさんNGNG
>>580
うー、そういうことか。
def nil.to_s() とか class NilClass; def to_s() ... とか
していたおれはアホやね。すでにそうなっていたのか。
さんきうです。
0582デフォルトの名無しさんNGNG
そもそも、CGIの入力を無加工で出力するなんて考えられないのだが。
0583デフォルトの名無しさんNGNG
だって、質問のためのサンプルだもん。
現実のコードが複雑なら、質問するときは本質部分だけをとりだした
簡単なものを示すのが普通では?
0584デフォルトの名無しさんNGNG
>>583
その「簡単なもの」が571だというならそれはそれで納得なんだけど。

575のようにCGIの入力を無加工でprintに渡すわけはないので、
それまでに別のところでnil問題に遭遇するだろう、ということだよ。
なので、575でいう「こんなとき」はありえない。
0585デフォルトの名無しさんNGNG
Cygwinにpackage: ruby-1.6.8-1が出たわけだけど、
ソース取ってきて自分でビルドするのと比較して何が嬉しいの?
0586デフォルトの名無しさんNGNG
ソース取ってきて自分でビルドしなくてもいい
0587デフォルトの名無しさんNGNG
ruby捨てるのが簡単に
0588デフォルトの名無しさんNGNG
>>585
ソース取ってくるほど熱心でないユーザも使う可能性が増える。
0589デフォルトの名無しさんNGNG
そしてリリースがますます慎重に
0590デフォルトの名無しさんNGNG
cygwinのバイナリをビルドした設定って後から参照できるように記録されているの?
だとしたら、使ったバイナリをビルドした設定を記録するのがちょっとは楽になるかな。
0591デフォルトの名無しさんNGNG
>>590

???
今いち言いたいことが分からないけど、Un*x と変わらないよ?
■ このスレッドは過去ログ倉庫に格納されています