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

Ruby について Part 3

レス数が900を超えています。1000を超えると表示できなくなるよ。
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/
0809デフォルトの名無しさんNGNG
>>808
> hashにmapなんてのがあるんですね
> ここにあるHashのメソッドしか知りませんでした.

漏れもよくはまるんだけど、Array や Hash は Enumerable を include してるので、
そっちのメソッドもチェックしる。
0810デフォルトの名無しさんNGNG
>>809
そうね。Hashに限らず何を継承(include含む)してるか見ないとね。
おれの場合マニュアル見るときFileを見るべきかIOを見るべきか
迷うことがよくあるw
0811デフォルトの名無しさんNGNG
リフレクションかなんか使って
オブジェクトが持ってるメソッド全部を
列挙できなかったっけ?
まあ列挙しただけじゃ使い方はわからないから
結局リファレンスを見ないとダメか。
0812デフォルトの名無しさんNGNG
>>811
できるしそういうブラウザもある。

でもやっぱり Hash や Array の場合、Enumerable のメソッドもマニュアルに
書いておいたほうが親切だと思うなあ。
0813796NGNG
>>809
なるほど
今後はもっとチェックしまつ
0814デフォルトの名無しさんNGNG
irb使ってるか?
0815デフォルトの名無しさんNGNG
irbってもっとカッコイイ名前だったらいいのになー。
0816デフォルトの名無しさんNGNG
iRuby?
0817デフォルトの名無しさんNGNG
ょぅι゙ょ
0818デフォルトの名無しさんNGNG
ムーア
0819デフォルトの名無しさんNGNG
伊良部でいいよ
0820デフォルトの名無しさんNGNG
irbと書いて I love Ruby と読む。これ最強。
0821デフォルトの名無しさんNGNG
電卓代わりに使ってる
0822デフォルトの名無しさんNGNG
>>821
電卓代わりならPerlとどっちがいいかな?
俺Perlつかってるけど
0823デフォルトの名無しさんNGNG
電卓代わりだったら、MAXIMAかSciLab、Risa/asirあたり
の方が強力だよ。
0824デフォルトの名無しさんNGNG
irb をログインシェルに使ってる香具師の数 →
0825デフォルトの名無しさんNGNG
0だな。
0826822NGNG
>>823
全部知らないや・・・調べてみよ―っと
0827デフォルトの名無しさんNGNG
>>823
電卓というにはちとオーバースペックな気もする
俺はちょっとした計算は
emacsの*scratch*バッファでelisp使ってます。
0828デフォルトの名無しさんNGNG
俺はbcだな。
0829デフォルトの名無しさんNGNG
ちょっとした計算なら俺は M-: だな。
0830デフォルトの名無しさんNGNG
俺はexprだな。
0831デフォルトの名無しさんNGNG
俺はRだな。
0832デフォルトの名無しさんNGNG
俺は電卓だな
0833デフォルトの名無しさんNGNG
俺はcalcだな
0834デフォルトの名無しさんNGNG
俺は指だな。
0835デフォルトの名無しさんNGNG
俺は爪楊枝です
つまようじ最強
0836822NGNG
>>835
計算してるときにケガしないように気をつけてね
0837デフォルトの名無しさんNGNG
俺は算木だな
0838デフォルトの名無しさんNGNG
俺はおなーにだな
0839デフォルトの名無しさんNGNG
>>827

elispって、(/ 3 2)が1になっちゃうんですけど、
その程度でいいってこと?
0840デフォルトの名無しさんNGNG
晒しあげ。
0841デフォルトの名無しさんNGNG
俺は計算尺だな。
0842デフォルトの名無しさんNGNG
俺は脳内妄想電卓だな。
0843デフォルトの名無しさんNGNG
>>839
rubyって 3/2 が1になっちゃうんですけど(ry
0844デフォルトの名無しさんNGNG
exprって 3 / 2 が1になっちゃうんですけど(ry
0845デフォルトの名無しさんNGNG
俺は gosh だな。
0846デフォルトの名無しさんNGNG
>>843
必要に応じて
require "mathn"
0847デフォルトの名無しさんNGNG
int/int が rational なのは結局Cプログラマが多いせいなんだろうな
0848デフォルトの名無しさんNGNG
間違えた逆だw
0849デフォルトの名無しさんNGNG
100万回ループの所要時間を調べようと思ったのですが

starttime = Time.now.to_f
for i in 1..1000000;end
p [Time.now.to_f - starttime]

と、

def bench
starttime = Time.now.to_f
yield
p [Time.now.to_f - starttime]
end
bench {for i in 1..1000000;end}

では 1割くらい前者のほうが速いのですが、何故でしょう?
0850デフォルトの名無しさんNGNG
$ruby -rprofile hoge.rb
0851デフォルトの名無しさんNGNG
Range#each の速度が、トップレベルで使う場合と yield で呼び出された中で使う場合
で、かなり差があるように見えるんだけど、何か勘違いしている?
0852849NGNG
def forloop
for i in 1..1000000;end
end

starttime = Time.now.to_f
forloop
p [Time.now.to_f - starttime]

だとさらに結果が違うよう。わけわからん。
0853827NGNG
>>839
847 で答え出てるけど一応教えておく。
C でも 3 / 2 は 1 になるだろ!
小数値がほしかったら (/ 3.0 2.0) にしろや、ボケ。
0854デフォルトの名無しさんNGNG
>>849
後者はiがブロックローカル変数になるから。
0855デフォルトの名無しさんNGNG
>>853
だから、そんな面倒なことしてちゃ、今の時代生き残れないよってこと言いた
かったんよ。
rubyでcalc作ってる。自分用のoptionもたくさんあって、これ最強。
0856デフォルトの名無しさんNGNG
訳の分からないことを言いたがらないでください。
0857デフォルトの名無しさんNGNG
>>855
おまえは生き残れない
0858デフォルトの名無しさんNGNG
なるほど!伊良部の略だったのか、なるほど。
で、伊良部とrubyのつながりはどこにあるのだろうか?

わからない
0859デフォルトの名無しさんNGNG
>>853
ではCに合わせてるとみてよろしいか
0860855NGNG
>>857
俺は生きる、生き抜いてやる。
0861デフォルトの名無しさんNGNG
計算機が欲しければ普通にmaximaとかmupad使うのがいいと思うけど。
お金があるならmathematicaとかmatlabを使えばいいわけで。
分数計算で十分なら irb -m でもいいだろうが変数の入った式は扱えない。
0862デフォルトの名無しさんNGNG
Emacsじゃ(/ 3 2) => 1 かもしれないけど
Xyzzyなら (/3 2) => 3/2 だよ。
有理数のまま計算していって、答えを出す手前で + 0.0 して実数に直すと
丸め誤差が少なくてイイ!
0863862NGNG
/ と 3 がくっついてしまった。
誤: Xyzzyなら (/3 2) => 3/2 だよ。
正: Xyzzyなら (/ 3 2) => 3/2 だよ。
0864デフォルトの名無しさんNGNG
>>854
なるほど。たしかにbench {...} の前に i=nil を入れると速度差は誤差の範囲になりました。
しかしブロックローカルの変数って何で遅いんだろ?
0865デフォルトの名無しさんNGNG
Rubyの勉強にruby-dbiとPostgresを利用してるのですが、
select文で取得したレコードの、日本語の部分が化けてしまうのです。
原因・解決方法など教えてもらえませんか・・・?

0866865NGNG
化けた文字は

テスト
\245\306\245\271\245\310

こんなかんじです。
0867デフォルトの名無しさんNGNG
>>866
pの多バイト文字の出力はそんな感じになる。
print/putsあたりを使えば?
0868865NGNG
>>867
なるほど。print/putsは日本語表示されました。
pはprintの略なのかなぁと思ってました。
ありがとうございあす。
0869デフォルトの名無しさんNGNG
>>868
あるいは$KCODEを指定しとく。
0870デフォルトの名無しさんNGNG
>>864
メソッドスコープのローカル変数は配列になってるのに対して、
ブロックローカルはIDとVALUEのlinked listになってるから、
それをたどる分だけ遅くなる。
0871デフォルトの名無しさんNGNG
>>870
やっぱり Ruby Hacking Guide を読まなきゃならんか。
0872デフォルトの名無しさんNGNG
>>870
あんたすげーよ。勉強になった。
0873デフォルトの名無しさんNGNG
インスタンス変数へのaccessorは attr_accessor :v1, v2, ... を
使うことで簡単に定義できる。
では、クラスインスタンス変数へのaccessorはどうすればよい?
今は
class Foo
def self.v1=(v)
v1=v
end
def self.v1
@v1
end
end
とチマチマ定義している。
これをもっと簡単に定義したい。
0874デフォルトの名無しさんNGNG
>>873
class Foo
class << self
attr_accessor :v1,:v2,:v3
end
end
0875デフォルトの名無しさんNGNG
ようやくwww.cygwin/setup.exeにrubyが標準搭載されたので
次はRuby.netがVS.NETで使えるようにして欲しい。
0876デフォルトの名無しさんNGNG
>>874
ごっつさんくす。
かなーりたすかった。
今度おごるよ。
0877デフォルトの名無しさんNGNG
>>874

この書き方だとRubyスクリプトとしてはまったく問題ないけど、
RDocがうまく解釈してくれないね。惜しい。

(RDocのバージョン:RDoc Vbeta-2: 2002/07/22 21:07:31 (1.67))
0878874NGNG
>>877
class Foo
 class << self
  # v1 - Foo's instance variable
  attr_accessor :v1
 end
 # v1 - Foo's attribute
 attr_accessor :v1
end

みたくコメントを工夫するしかなさそうだね。
0879デフォルトの名無しさんNGNG
>>878

あれー、それでうまくいった?
試したけど、どちらもインスタンス変数へのアクセッサと
してしか認識されなかったよ。
RDocのバージョンが古いのかな?
0880デフォルトの名無しさんNGNG
win32api の SendInput() を使いたいんですが、誰か書いてませんか。
引数が Struct 使う場合にどうすればいいのかよくわからないんです。
0881デフォルトの名無しさんNGNG
>880
配列をpackした文字列を渡す。
0882デフォルトの名無しさんNGNG
ブロックローカル変数をローカル変数と同様の実装にできないのはなんでだろ
0883デフォルトの名無しさんNGNG
>>882
Rite では直すのかな?
0884デフォルトの名無しさんNGNG
eRubyをはじめて使ってみたんだけど
index.rhtml:1:missing end delimiter (ERuby::CompileError)

こういうエラーがでてしまう。
何が悪いのだろうと調べて、キーワという文字列を抜くと動く。
日本語を含んだ文を書き出すには、なにか必要なのでしょうか。
0885デフォルトの名無しさんNGNG
よくは分からんがこういうことかな

require "kconv"
s = "ーワ".toeuc
d = ""
s.each_byte{|c| d << (c&0x7F)}
$KCODE = "n"
p s # "\241\274\245\357"
p d # "!<%o"

$KCODE を変えてみれば動くかも
0886デフォルトの名無しさんNGNG
Proc.new {|a|}.arity => -1 になるのが俺の悪い頭では理解できません。
引数の数だから、1 になるんじゃないかと思うんだけど、
なんで -1 になるのか誰か教えてー。
0887デフォルトの名無しさんNGNG
arityが-Nってのは、N-1個以上の引数を取れるって意味ってとこまではOK?
で、ブロック引数は多重代入と同じセマンティクスを持つので、

a = 1, 2, 3 # => a == [1,2,3]

と任意の個数の引数を取れるということ。

だったんだが、1.8.0 preview3ではそれは1になる模様。
0888デフォルトの名無しさんNGNG
Paint Shop Pro 8のマクロ言語としてPythonが採用されたそうだ。
Rubyが採用された市販アプリって有るのか?
まぁ、PSPは米国製だからってのもあるんだろうが。

つか、Rubyを採用しようにも、簡単に組み込めるようなライブラリが
無いよな? Pythonにはそれが有るらしいが(伝聞)。
そのへんどうにゃのよ?
0889デフォルトの名無しさんNGNG
Rubyも組み込むのはそんなに難しくないよ。
最近の俺的には、ネイティブスレッドに対応してないのでRubyは選べないけど。
0890886NGNG
>>887 さん
わかりやすい説明どうもありがとう。

> で、ブロック引数は多重代入と同じセマンティクスを持つので、
はじめて知りますた。。。
なるほど納得です。

> だったんだが、1.8.0 preview3ではそれは1になる模様。
ふむ!こっちのほうが俺にはわかりやすいです。

ためになる情報ありがとうございました。




0891デフォルトの名無しさんNGNG
>>887
> だったんだが、1.8.0 preview3ではそれは1になる模様。

lambda{|x|}[] とか def f() yield end ; f{|x|} が出来なくなるということ?
0892デフォルトの名無しさんNGNG
>>891
> lambda{|x|}[] とか def f() yield end ; f{|x|} が出来なくなるということ?
できるけど、警告が出る。

$ ruby -ve 'lambda{|x|}[]'
ruby 1.8.0 (2003-06-21) [i686-linux]
-e:1: warning: multiple values for a block parameter (0 for 1)

任意個の引数を取るときには|*x|、一個だけなら|x,|と書けば、1.6以前でも問題ない。

ちょうど同じ話題が出てる
ttp://jarp.jin.gr.jp/diary/200306c.html#200306211
0893デフォルトの名無しさんNGNG
>>888
Becky!用のRuby pluginってのはある。
あとtalkではたびたびアプリケーションに組込むって話がでてるけど、
具体的な製品名は分からない。
0894デフォルトの名無しさんNGNG
Rubyを自作アプリに組み込むHowToマニュアル出して欲しいな。
できれば、Win版とUNIX版両方で。
0895デフォルトの名無しさんNGNG
C++用だけどこういうのがあることはある。
ttp://metaeditor.sourceforge.net/embed/
0896デフォルトの名無しさんNGNG
>>892
ああ、それなら知ってるけど、どうしていまさら後方互換性をなくす方向に
動き出したんだろ。2.0への布石?
0897デフォルトの名無しさんNGNG
>>896
> 動き出したんだろ。2.0への布石?
そんなとこだと思うけど。
arityに関しては、たしかに分かりにくいという声が以前からあったし。
0898デフォルトの名無しさんNGNG
>>894
一時期の出版ラッシュのついでに出しておいてくれれば良かったのに。
0899デフォルトの名無しさんNGNG
>自作アプリへの組み込み
Cマガあたりに記事がなかったっけ?
Web上でも読めた気がする。
0900デフォルトの名無しさんNGNG
>>899
本じゃないが、erubyなんかはいい例にならないかな。
0901デフォルトの名無しさんNGNG
1.8.0 preview3出ますた。
0902784NGNG
標準入力ってなんでopenできないの。

>ruby -ve "File.open '-'"
ruby 1.6.8 (2002-12-24) [i386-mingw32]
-e:1:in `open': No such file or directory - "-" (Errno::ENOENT)
from -e:1
0903デフォルトの名無しさんNGNG
- は標準入力ではないです。
0904デフォルトの名無しさんNGNG
標準入力は $stdin
0905デフォルトの名無しさんNGNG
あぁ。すんません。
具体的に質問します。

コマンドラインでファイル名が指定されたらそれを、
指定されなければ標準入力を開くって処理をしたいんです。

Perl だと
push(@ARGV, "-") if no @ARGV
foreach (my $file @ARGV) {
open(F, $file);
#ほげほげ
}

とかできて楽なんですけど、Rubyだとどう書くんですか。
ファイル単位で(ファイル名を意識して)処理したいんで、ARGFは却下です。
0906デフォルトの名無しさんNGNG
>>905
なんかいろいろ間違ってる・・・Perl久しぶりとはいえ・・・欝だ。
0907デフォルトの名無しさんNGNG
ARGV.each do |file|
f = (file == '-' ? STDIN : open(file))
begin
# ほげほげ
ensure
f.close unless f == STDIN
end
end
0908デフォルトの名無しさんNGNG
def reading(file, &block)
if file == '-'
yield STDIN
else
open(file, &block)
end
end

ARGV.each do |file|
reading(file) do |f|
# ほげほげ
end
end

レス数が900を超えています。1000を超えると表示できなくなるよ。