トップページ⇒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/
0611デフォルトの名無しさんNGNG
「Rubyプログラミング入門」は原先生のはずだが。

注釈云々からすると「オブジェクト指向スクリプト言語Ruby」(通称Ruby本)じゃ
ないかと思うが、あれはまったく初心者向けじゃないよ。
0612デフォルトの名無しさんNGNG
Rubyの初心者向けであって、(オブジェクト指向)プログラミングの初心者向けじゃない。
つーことね。
0613デフォルトの名無しさんNGNG
>>610
個人的経験からいうと、初心者向けのサイトを作ると覚えるよ。
0614599NGNG
>>611
スマソ、今見直したら
「原信一郎 著 まつもとゆきひろ 監修」と書かれてますた。
「著 まつもとゆきひろ」部分だけ見て激しく勘違い。
本の名は間違い無く「Rubyプログラミング入門」。
0615名無しさん@xyzzyNGNG
>>599
目的がないからおぼえないんだよきっと。tdiaryとか導入していま流行の
bloggerになってみれば?tdiaryのpluginをかくためにrubyを覚えたひと
もいるよ。

0616デフォルトの名無しさんNGNG
オレも「たのしいRuby 」に一票。
0617597NGNG
>>609
syck-0.15 とかいうのだとダメだったんで、
CVS 最新を取り寄せて試してみたところ、問題なさそうでした。
また何か問題が見つかったら適宜報告するようにします。
0618597NGNG
つーか、 Syck は全然重くないっすね。快適快適。
YAML もっと普及するといいなぁ。
0619デフォルトの名無しさんNGNG
結城 浩(の本)に−1票
0620デフォルトの名無しさんNGNG
Perlをちょっとやったことあるなら「Rubyプログラミング入門」がいいね。
これ読むまで、
オブジェクト?はぁ?クラス?はぁ?インスタンス?はぁ?
って感じの漏れだったが、これ読んだら概念がちょこっとわかったよ。
ちなみに「たのしいRuby」を読んでもオブジェクト指向がなんなのか
全然理解できなかった。これを読んだあとも
オブジェクト?はぁ?クラス?はぁ?インスタンス?はぁ?
の状態に変わりはなかった。
けど、超基礎から説明してるので、
プログラム自体が初心者の人は「たのしい」から読むべきだろうね。
「Rubyプログラミング入門」はUNIXの基礎とか、プログラムの基礎とか知らないと、
わけの分からん用語の連続になっちゃうよ。
0621デフォルトの名無しさんNGNG
プログラムスーパー初心者です。
Rubyに興味を持ち、先日初めてオフィシャルページを
みてきました。Rubyはvariable declarationがいら
ないようなんですが、そこで質問です。
functionがinteger valueにreturnするときなんか
はどうなるのでしょう?例えばc++で
int function(int i, int j)
{
return i+j;
}
これをRubyでかくと、どうなるのでしょうか?
簡単すぎる質問ですみません。

0622Ruby知らないNGNG
関数(とは言わない?)の書き方くらいマニュアルや初心者本でも載っているんじゃなかろうか。
0623621NGNG
>>622
すみません。海外在住なのです。
日本の本が手に入らない僻地にいるので、webだけが
たよりなのですが、なかなか簡単なサンプルがないの
で、ここで聞きました。
0624_NGNG
  ∧_∧
 ( ・∀・)/< こんなのみつけたっち♪ 
http://www.hiroyuki.zansu.com/hankaku/jaz03.html
http://hiroyuki.zansu.com/hankaku/jaz10.html
http://www.hiroyuki.zansu.com/hankaku/jaz08.html
http://hiroyuki.zansu.com/hankaku/jaz09.html
http://www.hiroyuki.zansu.com/hankaku/jaz06.html
http://hiroyuki.zansu.com/hankaku/jaz05.html
http://www.hiroyuki.zansu.com/hankaku/jaz01.html
http://hiroyuki.zansu.com/hankaku/jaz02.html
http://www.hiroyuki.zansu.com/hankaku/jaz07.html
http://hiroyuki.zansu.com/hankaku/jaz04.html
0625デフォルトの名無しさんNGNG
>>621

def function(i,j)
 return i+j;
end

とも書けるけど、大半のヤシは

def function(i,j)
 i+j
end

と書くだろう。
0626デフォルトの名無しさんNGNG
>>597
YAMLは、現在開発中の新バージョンは拡張ライブラリになって
おり、これはとっても速いらしい。まだα状態だろうけど。
0627デフォルトの名無しさんNGNG
>>621
def function(i,j) i+j end
p function(1,2) #=> 3
p function("foo"+"bar") #=> "foobar"

型を指定するための方法というのはない
どうしても検査したければ obj が Klass のインスタンスであることを
obj.is_a? Klass によって検査することはできるがあまり使わない
0628デフォルトの名無しさんNGNG
>>627
> p function("foo"+"bar") #=> "foobar"
p function("foo","bar") #=> "foobar"

0629621NGNG
マトリックスを観てきて、今帰ってきました。
夜12時のshowだったのですが、すごい混雑ぶりでした。

>>625, 627
どうもありがとうございます。
本当に型がないのですね。(笑) javaとC++しかしらな
い私にとっては、とても不思議です。
0630デフォルトの名無しさんNGNG
>>629
> 本当に型がないのですね。
変数にはない。オブジェクトが型を持っている。
0631_NGNG
  ∧_∧
 ( ・∀・)/< こんなのみつけたっち♪ 
http://www.hiroyuki.zansu.com/hankaku/jaz03.html
http://hiroyuki.zansu.com/hankaku/jaz10.html
http://www.hiroyuki.zansu.com/hankaku/jaz08.html
http://hiroyuki.zansu.com/hankaku/jaz09.html
http://www.hiroyuki.zansu.com/hankaku/jaz06.html
http://hiroyuki.zansu.com/hankaku/jaz05.html
http://www.hiroyuki.zansu.com/hankaku/jaz01.html
http://hiroyuki.zansu.com/hankaku/jaz02.html
http://www.hiroyuki.zansu.com/hankaku/jaz07.html
http://hiroyuki.zansu.com/hankaku/jaz04.html
0632デフォルトの名無しさんNGNG
>>597
開発中のYAML次期バージョンは拡張ライブラリとして実装
されているため、とても速いらしい。
0633( ´w`)NGNG
http://www13.big.or.jp/~fubuki/
ここの管理人は『2chに行くヤツは全員オタクだ。
2ch用語発言したボケはアク禁』などとほざくゴミだ。
これはひろゆき氏及び全ての2ちゃんねらーに対する侮辱である。
ここに行って2ch用語を連発して頂きたい。
0634デフォルトの名無しさんNGNG
>>633
藻前一人でいきがってれば?
0635デフォルトの名無しさんNGNG
>>634
藻前
konnnakotobadukaisuruyatuniiwaretakunaiyona.
0636デフォルトの名無しさんNGNG
>>597
開発中の次期バージョンの Ruby は拡張ライブラリとして
現在とても速いα実装をしており、とても YAML らしい。
0637デフォルトの名無しさんNGNG
人工無能のテスト中なのか…?
0638デフォルトの名無しさんNGNG
Array を shuffle したいのですが、スマートな方法はありますか?
0639638NGNG
試しに自分でも書いてみた。非破壊的バージョン。でもいまいちだよなぁ。

class Array
def shuffle
src, dst = self.dup, []
while not src.empty?
dst << src.delete_at(rand(src.size))
end
dst
end
end
0640デフォルトの名無しさんNGNG
古いのが出て来た。

class Array
 def shuffle!
  size.downto(2) do |i|
   j = rand(i)
   self[i], self[j] = self[j], self[i] unless (i -= 1) == j
  end
  self
 end

 def shuffle
  dup.shuffle!
 end
end
0641デフォルトの名無しさんNGNG
class Array
 def shuffle!
  size.downto(1){|i|
   push delete_at(rand(i))
  }
  self
 end
end
0642デフォルトの名無しさんNGNG
rand(1)は常に0だから1までdowntoするのは無駄。

それと、delete_atはそれ以降を全部ずらすから、大きいArrayに対しては効率
が落ちる。
0643デフォルトの名無しさんNGNG
要素数がトランプの枚数くらいだったら>>641のが速い(Ruby1.6.8)…が、それくらいならそもそも速度気にしない罠

おまけ(実用性はたぶんない)
class Array
 def shuffle!
  sort!{
   rand - 0.5
  }
 end
end
0644デフォルトの名無しさんNGNG
sort{ rand - 0.5 } がランダムな入れ替えになるというのがいまだによく分からない。

いや、もちろんなんだかぐちゃぐちゃになりそうだなってのは分かるけど
ちゃんとn!通りの並びの全てが等確率で出るのかどうかよく分からない。
0645デフォルトの名無しさんNGNG
しかも終わらなさそーだし。
0646デフォルトの名無しさんNGNG
>>645
ソートのアルゴリズムも知らない中学生ですか?
0647デフォルトの名無しさんNGNG
>>646
試してみるとわかると思うが、終わらない。
0648デフォルトの名無しさんNGNG
>>647
% ruby -e 'class Array; def shuffle!() sort!{ rand - 0.5 } end end ; a=[0
,1,2,3,4,5,6,7,8,9]; a.shuffle!; p a'
[1, 7, 9, 3, 5, 0, 8, 6, 2, 4]
%
終わるけど?
0649デフォルトの名無しさんNGNG
class Array
  def shuffle!(&block)
    if block
      1.upto(size-1){|i| j = block[i+1] ; self[i],self[j] = self[j],self[i]}
    else
      1.upto(size-1){|i| j = rand(i+1) ; self[i],self[j] = self[j],self[i]}
    end
    self
  end
end

上の方法だとrand(n)かblock[n]が0,…,n-1を等確率で返すことを仮定すれば
すべての要素が異なるときにそれぞれの順列が等確率になることを証明できるが
他の方法はどう?
0650デフォルトの名無しさんNGNG
>>643の場合を、quick sortで考えてみる。
中央値はランダムに決定されることは自明だと思うので省略。
残りの要素はランダムに振り分けられるので、左右どちらに行くかは等確率。
これを再帰的に繰り返せば全体も等確率と考えていいんじゃないかな。
ただ、最後はselection sortを使ってるんで、これは等確率じゃないような気がする。
n個の要素から最小値を選び出す場合、最初に比較された要素が選ばれる確率は
2**(1-n)だけど、最後に比較されたものが選ばれる確率は1/2。

おまけ
def tossup
  rand(2)*2-1
end
0651デフォルトの名無しさんNGNG
for i := 0 to length(arr)-1 do
 swap(arr[i], arr(rand(length(arr))));
0652デフォルトの名無しさんNGNG
>>644 ダメポ
def hist(n,k)
a, h = 1..n, Hash.new(0)
(a.inject{|i,j|i*j}*k).times{ h[yield(a)]+=1 } ; h
end

n, k = (ARGV[0]||3).to_i, (ARGV[1]||100).to_i
h = hist(n,k){|a|a.sort{rand-0.5}}
h.sort_by{|i,j| [j*10/k,i]}.each{|i| p i}

>>650 スマン、最後はselection sortってどういうこと?
それは抜きにしても左右に振られるのがランダムであることから
等確率であることをいうのは飛躍が大きいと思われ。
0653デフォルトの名無しさんNGNG
ary.sort_by { rand }
0654デフォルトの名無しさんNGNG
Enumeration#sort_by の実装の話?
0655デフォルトの名無しさんNGNG
Enumerable の typo だとしても、何を言いたいか分からない。
0656デフォルトの名無しさんNGNG
>>652
> >>650 スマン、最後はselection sortってどういうこと?
勘違い。ruby_qsort()は切替えたりしてないな。

> それは抜きにしても左右に振られるのがランダムであることから
> 等確率であることをいうのは飛躍が大きいと思われ。
というか、順次比較して行くから等確率じゃないな。
0657デフォルトの名無しさんNGNG
>>645の意図が分かった気がする。
>>643の場合、停止確率は1だが停止しない場合もあると言いたかったんだろう。
それならば正しい。
しかし>>647は間違いだな。確率0の事象を実際にみることはないに等しい。
0658デフォルトの名無しさんNGNG
>>657
>>643については正しいが、確率1だからといって見ることができるとは限らないので
「確率0の事象を実際にみることはないに等しい」は言い過ぎかと。

class Array
  def shuffle!()_=self;1.upto(size-1){|i|j=rand(i+1);_[i],_[j]=_[j],_[i]};_ end
  def shuffle() o = dup ; o.shuffle! ; o end
  def sorted?() empty? or !! inject{|i,j| i <= j ? j : break} end
  def bogosort!() until sorted? do shuffle! end ; self end
  def bogosort() o = dup ; o.bogosort! ; o end
end

100.times do |i|
  STDERR.printf("%2d: ", i)
  a = (1..i).to_a.shuffle ; t0 = Time.now ; b = a.bogosort ; t1 = Time.now
  STDERR.printf("%f sec [%s] --> [%s]\n", t1-t0, a.join(","), b.join(","))
end
0659デフォルトの名無しさんNGNG
>>656
> というか、順次比較して行くから等確率じゃないな。

それも明らかじゃないと思う。難しい。
0660653NGNG
>>653って何かおかしい? スマートな実装だと思ったんだけど……。
0661653NGNG
つーか、>>508 あたりから既出なのか。スマソ。
0662デフォルトの名無しさんNGNG
[ruby-dev:20209] からのスレッドを見ると、>>491 のような疑問は尤なような。
0663デフォルトの名無しさんNGNG
rdoc なんだけど、ここ
ttp://rrr.jin.gr.jp/doc/http-access2/
の rdoc の出力は、rdoc-0.9.0 の標準 (Squeak のクラスブラウザみたいに、上半分に
クラス階層やメンバが表示されているやつ) とは違って、左半分にクラス階層やメンバが
表示されているんだけど、

これって rdoc の CVS 版使うとこうなるのかな?誰か知っている人いますか?

0664663NGNG
>>663
すいません、自己解決しました。

ttp://rrr.jin.gr.jp/doc/Makefile
をみたら、--template kilmer っていうオプションが rdoc にあるみたいね。
0665デフォルトの名無しさんNGNG
rubyで、文字列が'aaa', 'bbb', 'ccc'のどれかであれば真、
それ以外では偽という条件を書くとき、
if str=='aaa' || str=='bbb' || str=='ccc' then
 ...
end
としているのですが、もっとうまい書き方はありますか?

case str
 when 'aaa', 'bbb', 'ccc'
 ...
end
でもよかったんだけど、if修飾子としても使いたいので
できればif文での書き方を希望。
0666デフォルトの名無しさんNGNG
>>665
Rubyスレをあげないでください。
0667デフォルトの名無しさんNGNG
>>665
if %(aaa bbb ccc).include?(str)
0668667NGNG
うおお、ミスった。
if %w(aaa bbb ccc).include?(str)
0669デフォルトの名無しさんNGNG
>>668
なるほど、配列の要素として含むかどうかで判断するのね。
ちなみにこれ、実行するたびに配列が作成されるのかな?
erubyやmod_rubyで使用すると、実行するたびにオブジェクトが
増えてしまう?
(仕方ないか)
0670667NGNG
>>669
実行のたびに配列は生成されちゃうだろうね。
それがいやだったら、配列を定数に入れとくとか。

ifの評価が終わったら参照されない配列になるから、
gcされちゃうんで増え続けることはないだろう。
0671デフォルトの名無しさんNGNG
漏れならこっち
if /\A(?:aaa|bbb|ccc)\z/ =~ str
0672669NGNG
どうもありがとう。
いろんなやりかたがあるのね。
0673デフォルトの名無しさんNGNG
>>671
なるほど。正規表現のリテラルだったら毎度同じオブジェクトなのか。

$ ruby -e '2.times do p /hoge/.id end'
538146270
538146270

$ ruby -e '2.times do p ["hoge"].id end'
538146160
538146130

VALUE * を使い回す話とごっちゃになってた。
0674デフォルトの名無しさんNGNG
>>673
> VALUE * を使い回す話とごっちゃになってた。
何それ?
0675デフォルトの名無しさんNGNG
>>674
たぶんC言語レベルでのソースコードの話。
VALUEって型があって、それへのポインタのことでは?
0676デフォルトの名無しさんNGNG
>>673
そうとも限らないんだけどね。

ruby -e '2.times do |i| p /mona/.id end'
ruby -e '2.times do |i| p /#{i}/.id end'
ruby -e '2.times do |i| p /#{i}/o.id end'
0677デフォルトの名無しさんNGNG
真中のは厳密にはリテラルと言わないような気もする。
0678デフォルトの名無しさんNGNG
真中のは言わなくても最後のは言うの?
0679デフォルトの名無しさんNGNG
>>675
それは分かるんだけど、「使い回す」ってのが何の話だかが。
0680デフォルトの名無しさんNGNG
>677 はリテラルとは何か定義してみれ。
# 最近fj.lang.cでフレームになってたような気もするが。
0681デフォルトの名無しさんNGNG
fj.lang.cだと最近じゃないわけだが。
0682デフォルトの名無しさんNGNG
文脈によっては、たとえ100年前でも最近ていうからなぁ。
0683デフォルトの名無しさんNGNG
で、そういう文脈なの?
0684デフォルトの名無しさんNGNG
俺様のニュースサーバで expire されてなければ最近。
0685デフォルトの名無しさんNGNG
で、あなた様のニュースサーバはどこにあるんですか?
0686山崎渉NGNG
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
0687デフォルトの名無しさんNGNG
http://www.rubyist.net/~matz/slides/ipsj-hi103/index.html
にあるグラフはどっからのデータのグラフなんだ
もしかしてmatzが主観で書いたグラフか?
0688デフォルトの名無しさんNGNG
客観データだとしたらむしろびっくりだ
0689デフォルトの名無しさんNGNG
lzhやzipなどの書庫ファイルの中身を
Rubyからアクセスしたいのですが、どうしたらいいでしょうか。
0690デフォルトの名無しさんNGNG
list = `"lzh lq #{archive}")`.split(/\n/)
list = `"zipinfo #{archive}"`.split(/\n/)[1...-1]
0691デフォルトの名無しさんNGNG
Array#sort が比較関数をブロックで渡せるんだから、
Array#uniq も比較関数をブロックで渡せたら…と思いませんか?
0692デフォルトの名無しさんNGNG
>>691
思わないなぁ。めんどくさいと思うよ。
それなら俺様 uniq を作った方が早いと思う。
0693デフォルトの名無しさんNGNG
>>690
どうも。
書庫内のファイルの中身も見たいので、DLLのAPIヘルプを見ているところです。

0694デフォルトの名無しさんNGNG
>>693
環境はWindowsなのか?
なら「Ruby+統合アーカイバ+DLL」でぐぐるとなんか出てくる。

zlibを使ったRubyZipってのもあったはず。
0695デフォルトの名無しさんNGNG
というか、RAA。
0696デフォルトの名無しさんNGNG
>>694
情報どうもです。いろいろ試してみます。
0697デフォルトの名無しさんNGNG
pythonマンセ〜
0698デフォルトの名無しさんNGNG
http://pc2.2ch.net/test/read.cgi/tech/1047970129/782 に出ている、
遅延評価に対応した ruscheme というのを試してみたいのですが、
どこかダウンロード可能なところは無いでしょうか?
0699デフォルトの名無しさんNGNG
>>698
ぐぐれ。ちなみに綴りが間違ってる。 Rucheme だ。
0700デフォルトの名無しさんNGNG
綴り間違い失礼。

rucheme003 はまだ遅延評価に対応していないみたいなんです。
もっと新しいのはダウンロードできないんでしょうか?
0701デフォルトの名無しさんNGNG
まつもっちゃんよ・・・

頼 む か ら ソ ケ ッ ト の g e t c で デ ッ ド ロ ッ ク す る の 直 し て く れ

これじゃネットワーク全然使えねーよ
0702デフォルトの名無しさんNGNG
>>701
再現出来る短いコードを書き環境を明示して晒してみたら?
0703デフォルトの名無しさんNGNG
ごめ。スレッド使えばデッドロックにはならないぽい。
でもスレッドは止まる。timeoutも効かん。

再現?簡単だYO!
TCPServerとTCPSocketで試してみ。

ソケットオープソ
↓
接続
↓
getc (getsでもreadでも何でもいいが)
↓
受信データを送らない
↓
あぼーん
0704デフォルトの名無しさんNGNG
>>703
だから、再現コードと再現環境を晒せっての。
どんなコードや環境でも再現するようなら
今頃 Ruby なんか使ってる香具師なんかいねえよ。
0705デフォルトの名無しさんNGNG
>>704
ワカタ。ゴメン。ちょと待ってろ
0706703NGNG
uwaaaaaaan

書き込めねえよ

でけえとかなげぇとか言うなよ

>>704スマソ
環境だけ書かせてもらうわ

Ruby1.6.8 無印とCVS版200304全般
mswin32、mingwは全滅。Cygwinは送信だか受信のどっちか×だった。

1.8pre2のLinux版では問題なし。
0707デフォルトの名無しさんNGNG
ttp://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=trap%3A%3Atimeout
これってまだ直ってないんだっけ
0708703NGNG
少なくとも上の環境では無理ぽ
0709デフォルトの名無しさんNGNG
>>706
> mswin32、mingwは全滅。
winsockの呼び出しは中断できないから。

ついでにいっとくと、Windows対応はまつもとさんにいっても無意味。
0710デフォルトの名無しさんNGNG
つか、デッドロックの意味がわかってない悪寒
■ このスレッドは過去ログ倉庫に格納されています