トップページ⇒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/
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 と変わらないよ?
0592デフォルトの名無しさんNGNG
Cygwin 環境だと configure につけるオプションって --enable-shared くらいじゃ。
0593デフォルトの名無しさんNGNG
yamlインポートage
0594デフォルトの名無しさんNGNG
>>593
でも動かない。
0595デフォルトの名無しさんNGNG
インポート?
0596デフォルトの名無しさんNGNG
addだな。いやそういうことはどうでもいいんだが。
0597デフォルトの名無しさんNGNG
YAML.rb って Racc で真面目にフル実装しようとしてるせいか、かなり重くないですか?
機能限定でいいから軽い YAML 実装ってないですかね?
無きゃ自分で書くしかないんだけど・・・
0598デフォルトの名無しさんNGNG
>>585
Cygwin入れてない環境でも、Cygwin DLLさえあれば使える。
…mswin32版との具体的な差が気になるところではあるけれども。
0599デフォルトの名無しさんNGNG
プログラミング自体初心者なんだけど、
「これは見とけ」とか言うサイトや本ある?
もう、馬鹿でも分かるような。
0600デフォルトの名無しさんNGNG
ruby本で?
「たのしいruby」あたりはどうかね。
0601名無しさん@xyzzyNGNG
Ruby ホームページ
http://www.ruby-lang.org/ja/

ユーザーズガイド
http://www.ruby-lang.org/ja/uguide/uguide00.html

リファレンスマニュアル
http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Ruby%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9%A5%DE%A5%CB%A5%E5%A5%A2%A5%EB
0602599NGNG
ありがとうございます。
Rubyのオフィシャルサイトはもちろん見ましたよー。
でもRubyって、どのサイトも
「プログラミングそこそこ理解できる」が前提みたいな感じで、
まるっきりの初心者対象にしたようなページはあまり見つからないんですよね。
その点で多少敷居が高いと感じたり…。
0603デフォルトの名無しさんNGNG
やっぱり「たのしいruby」とか「Rubyプログラミング入門」くらいしか思い浮
かばんなぁ。

ところで、「プログラミング初心者」であっても「コンピュータの初心者」じゃ
あないよな?
0604597NGNG
結局 YAML.rb 使わないことにしますた。
しかし、-ryaml するだけで重いんですよね。
そもそも Racc 自体が重いのかしら・・・?
0605デフォルトの名無しさんNGNG
1.8に入ったsyckはracc使ってないと思う。
0606デフォルトの名無しさんNGNG
高橋 麻奈で「やさしいRuby」か
結城 浩で「Ruby言語プログラミングレッスン」キボン
いや、Rubyはプログラミング初心者にはやさしいつくりではあるが、
解説書で初心者(他言語経験者を除く)にやさしいのはっていうとちょっと?だったりする。
他言語のいい初心者本からRubyにきたほうがいいかもって、本末転倒。
ひと頃と比べるとRuby本の出るペースも落ちてきてちょっとさびしい。
0607597NGNG
>>605
どうもです。ちょうどさっき Syck の存在を知って調べ始めたところでつ。
# 1.6 ユーザなので流行に乗り遅れてますね・・・
0608597NGNG
Syck でつが、コメントの扱いとかダメダメな悪寒。
ほかにも気になるところが沢山あるのですぐには使えないな・・・
もうちょっと調べてみよう。
0609デフォルトの名無しさんNGNG
>>608
詳しくレポートきぼん。
量が多ければruby-bugsかruby-devへ。
0610599NGNG
>>603
どのくらいの知識と経験を積めば「コンピュータの初心者」から脱出できるのか
分からないので何とも言えませんが、少なくとも、
PCを昨日今日買ってきたというレベルではありません。

以前、まつもとゆきひろ氏の「Rubyプログラミング入門」を入門書として購入しましたが
余計な注釈や、読みづらい本文で(゚Д゚)ポカーン
この本では「楽しいRuby」は無理だと感じました。
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'
■ このスレッドは過去ログ倉庫に格納されています