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

Rubyについて Part 15

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

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

= 前スレ
: Rubyについて Part 14
http://pc5.2ch.net/test/read.cgi/tech/1103997158/
0232デフォルトの名無しさん ◆m7YeytgDFE 05/02/23 15:50:07
>>227
下記のような違いがあるということかな?
%Q( #{ Time.now } ) # => " Wed Feb 23 15:48:08 JST 2005 "
%q( #{ Time.now } ) # => " \#{ Time.now } "
0233デフォルトの名無しさん ◆m7YeytgDFE 05/02/23 15:53:58
>>232
あ、これは"〜"と'〜'の違いっていうだけか。
良く分かってませんでした。失礼しました...。
0234デフォルトの名無しさん05/02/23 16:12:09
ただ単に文字列中に ' を入れたいなら " でくくればいいし、
ただ単に文字列中に " を入れたいなら ' でくくればいいのだが、
文字列中に #{} と " の両方を入れたいなら " でくくるのはちょっと、
という話ではないだろうか。
0235デフォルトの名無しさん05/02/23 16:26:33
>>231
%Q(abc(def) が通らないっていうのはすごくヘンだと思うぞ。なんで文字列の
中でカッコのマッチングをわざわざ取ってるんだ?
%Q|abc(def| とか、他の記号を使うとオーケーなのにね。
%記法をつかうなら中に入らない文字を使えってことかな。
0236デフォルトの名無しさん05/02/23 16:33:46
ヘンとか言われてもそういう仕様なので・・・

つーか、
> %記法をつかうなら中に入らない文字を使えってことかな。
という認識は、きっと逆で、
中でかぶらない任意の文字を区切り文字として使いたい、
という場合に%記法を使うのが正しい使い方と思われ。
023723105/02/23 18:09:39
>>235
確かに不思議な仕様ではあるね。
なんとなく%Q(()) => "()"としたかったのかな。
他の言語(Perlとか)からごっそり取り込んだだけの仕様だったりする?

ところでもし>>225==>>235なら、
>%Q(abc(def)はエラーで、%q(abc(def))は通るんですよね。
でわざわざ%Qと%qを使った理由を教えてくれ。
023822605/02/23 18:34:01
>>228-230
$が、改行の前か、文字列の最後ってことは、色々調べて書いてあったんですが、
その上で、226を実行すると、/\n$/っていうのがabc\nにマッチしてしまう理由がわからないのです。
$が改行の前なら、マッチして欲しくないんですが。
023922505/02/23 18:37:54
225!=235
あ、今知ったんですが、%qとか%Qって、括弧()じゃなくてもつかえるんですね!!
これなら、便利かも。

ところで、やっぱり、変な仕様である気はしますね。%q(()のエラー。
0240デフォルトの名無しさん05/02/23 18:56:47
>>238
/\n$/ は「\n の後に行末(または文字列の末尾)が来るもの」という意味になるよね。
"abc\n"は \n の後に文字列の末尾が来るから問題ないじゃん。

ちょっと見てみるとこれは 1.8 からの仕様変更で、 Perl の挙動に合わせたものらしい。
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=trap%3A%3ARegexp
0241デフォルトの名無しさん05/02/23 19:00:45
>>239
それを知らなかったのなら仕方ないか。
%記法は、括弧のときだけ特別に中身の対応をチェックするようになっている。
親切なような、余計なお世話のような。

%Q'文字列中に"をエスケープなしで'
%q"文字列中に'をエスケープなしで"

とか書いたりもするなあ。
024222505/02/23 19:32:26
>>240
なるほど。わかりました。
0243デフォルトの名無しさん05/02/23 19:41:51
でもさ
# Perl では $ は改行の前と文字列末尾にマッチする

とあるけど

print "true\n" if "\n" =~ /$\n/;

はperlでマッチしないのね。
でもrubyだとマッチする。
0244デフォルトの名無しさん05/02/23 20:06:46
http://www.namikilab.tuat.ac.jp/~sasada/diary/vote.cgi?no=54&mode=show
0245デフォルトの名無しさん05/02/23 20:15:27
>>243
Perlでは$は、改行文字そのものとマッチするが後方参照しても文字列が取り
出せないもの、としているということなのかな。

perl -e 'print "true\n" if "\na" =~ /$a/;' # => 改行の後にaだから真
ruby -e 'print "true\n" if "\na" =~ /$a/;' # => 改行の直前の後にaだから偽

となるね。

"\na" =~ /^a/ が Perl では成立しないが Ruby では成立するとか、この辺はいろいろ面倒だな。
0246デフォルトの名無しさん05/02/23 20:21:12
質問です。
["a", "b"] → "["a", "b"]" のように
Array クラスを String クラスにしたいんですが、どうすればいいでしょうか?
0247デフォルトの名無しさん05/02/23 20:26:19
>>245
"\na" =~ /^a/は複数行モードの問題じゃね?
"\na" =~ /^a/mにすればperlもrubyもマッチする
0248デフォルトの名無しさん05/02/23 20:28:51
>>246
["a", "b"].inspect
0249デフォルトの名無しさん05/02/23 20:32:49
>>247
Ruby はデフォルトで複数行モードがセットされてるってこと?
025024605/02/23 20:33:06
>>248
サンクス。inspect覚えておきまつ。
0251デフォルトの名無しさん05/02/23 20:43:39
>>249

http://www.kt.rim.or.jp/~kbk/perl-5.8/perlreref.html#___z_q
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/7960
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%A5%EA%A5%C6%A5%E9%A5%EB#a.c0.b5.b5.ac.c9.bd.b8.bd.a5.ea.a5.c6.a5.e9.a5.eb

rubyはさいしょからperlのm相当でrubyのmはperlのs相当ってことなんかね
0252デフォルトの名無しさん05/02/23 20:59:02
>>251
マジで?

Ruby には s なんて無い (Shift_JIS モードになるオプションに当てられてる) わけだけど、
どうやって単行モードにするの?
0253デフォルトの名無しさん05/02/23 21:15:45
make test-all は make install が済んだことが前提でしょうか?
/usr/local/bin/ruby が存在しなくてエラーになりまくりなのですが。
0254デフォルトの名無しさん05/02/23 21:37:47
>>248
日本語は?
0255デフォルトの名無しさん05/02/23 21:39:10
>>254
-K オプションを指定すれば?
0256デフォルトの名無しさん05/02/23 21:47:12
>>255
・・・知らなかった、サンクスorz
$KCODE= = 'SJIS'にしてみた
0257デフォルトの名無しさん05/02/23 21:55:23
res256.gsub!(/\$KCODE= = 'SJIS'/,"$KCODE = 'SJIS'") # orz
0258デフォルトの名無しさん05/02/23 23:16:33
>>252
そんなモードいらん
025922605/02/24 00:05:30
p "abc\n" =~ /$\n$/ #=> 3
p "abc\n" =~ /$$$\n$$$/ #=> 3
なるほど。
0260デフォルトの名無しさん05/02/24 00:59:19
Rubyの初心者スレとかあるけど。
http://pc5.2ch.net/test/read.cgi/tech/1107799347/
0261デフォルトの名無しさん05/02/24 01:10:19
>258
むしろNオプションでネコミミモード
……どんなモードやねん、と自分で突っ込んでおく
0262デフォルトの名無しさん05/02/24 01:11:56
いまRuby-listにも主催者(でいいんだよね)Todd NathanからPOSTされた。
http://www.rubyist.net/~matz/20050222.html#p01
これ、だれかやるの?
0263デフォルトの名無しさん05/02/24 09:49:34
>>262
されてないんだけど、ruby-talk の間違い?
0264デフォルトの名無しさん05/02/24 10:33:09
>>263
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/40638
これ?
0265デフォルトの名無しさん05/02/24 11:18:14
spam判定されてた。スマソ OTL
0266デフォルトの名無しさん05/02/24 11:45:27
Railsを使ってみようと思って、Ruby one click installer 1.8.2final(windows)
をインストールして、ruby gemsを使ってみたんですが、
indexをupdateするってところで、とまってしまいます。
どうしても無理みたいなので、

ActiveScriptRubyをインストールして、gemsもインストールして使うことにしました
ruby install.rbでインストールは成功したのですが、
実際使おうとすると、

C:\Documents and Settings\Toshihiro>gem
ruby: No such file or directory -- C:/Program (LoadError)

ってなります。
このエラーって、どのレベルのエラーでしょう。。
どうもパスにスペースが入ってるところに問題があるみたいです。
実は、gemsって、Windowsではそのまま使えなかったりするんでしょうか??

ところで、one click installerでみなさん、使えてるのでしょうか??
026726605/02/24 11:53:06
ActiveScriptRubyを、c:\rubyにインストールして解決です。
やはり、パスにスペースが入ってるとうまくいかないようです。>gems

デフォルトで、RubyGems添付になって、
RAAに登録されているのは、Gem形式で配布されればいいのに。。
026826605/02/24 12:00:09
Gems動くようになったけど、
updating gem source index for: http://gems.rubyforge.org
ってところから進まないぞぉー
026926605/02/24 13:17:41
誰か、gems使わないrailsのインストール方法教えてください。
るびま見たら、actionmailとか必要みたいなので、インストールしようと思ったら、
RAAにないし。。

RAAからrailsだけとってきて、インストールしたらいいのかな??
0270デフォルトの名無しさん05/02/24 13:43:37
>>266
updating gem source index for: http://gems.rubyforge.org
と表示されてから完了するまでかなりの時間(2、3分)かかるので、
すぐにやめずに少し待ってみては。
027126605/02/24 19:18:53
ちょっと、気になったんですけど
僕のインストール方法は、
ruby setup.rb を実行しただけなんですよ。
それで、同じフォルダに
post-install.rb ってあって、それを実行したら、
C:/Documents and Settings/Toshihiro/デスクトップ/rubygems-0.8.4/rubygems-0.8.4/post-install.rb:40:in `install_windows_batch_files': uninitialized constant Config (NameError)
from C:/Documents and Settings/Toshihiro/デスクトップ/rubygems-0.8.4/rubygems-0.8.4/post-install.rb:72
Completed(1)
こう出てしまいます。ここに問題があるんでしょうか。。


あと、ruby gemsのインストールマニュアルって見つからないんですが、どこかにあります??
http://rubygems.rubyforge.org/wiki/wiki.pl?RubyGems

それと、updating gem source ..... って出た後、10分くらい待ってみたけどだめでした。
0272デフォルトの名無しさん05/02/24 20:29:56
(???: ??????????? ??) <-- translated online

翻訳してくれ。
0273デフォルトの名無しさん05/02/24 20:52:02
(これ: 文字化け ?) <-- translated online
0274デフォルトの名無しさん05/02/24 22:16:41
Amrita2 initial releaseキタ━━━━━━(゚∀゚)━━━━━━!!
http://one.textdrive.com/pipermail/rails/2005-February/003444.html
0275デフォルトの名無しさん05/02/24 22:18:55
>>271
インストールマニュアルというか、
http://rubygems.rubyforge.org/wiki/wiki.pl?UserGuide
の「Installing the RubyGems library」がインストール作業の全説明だと思う。
post-install.rbはsetup.rbから呼び出されるもので、直接呼び出す必要はないから、
そのエラーは気にしなくてもよいです。

あと、手元のCygwinでgem list --remoteを試したら50秒弱で終わりました。
0276デフォルトの名無しさん05/02/24 22:59:38
質問です。
[1, a, 2, b, 3, c] → [[1, a], [2, b], [3, c]]
としたいのですが、何かイイ方法ありませんか?
初心者でスマソ。
0277デフォルトの名無しさん05/02/24 23:05:10
効率とか考えずに。
Hash[*[1, a, 2, b, 3, c]).to_a
0278デフォルトの名無しさん05/02/24 23:07:15
ary = [1, a, 2, b, 3, c]
Hash[*ary].to_a # => [[1, a], [2, b], [3, c]]
027927705/02/24 23:07:52
あ、これじゃあ順番が保存されない可能性があるか。ゴメン。
028027805/02/24 23:12:14
負けた……orz

もういっちょ。
ary = [1, a, 2, b, 3, c]
ary2 = Array.new(ary.length/2)
ary2.length.times { |i| ary2[i] = [ary[i*2], ary[i*2+1]]}

美しくないですが。
028127705/02/24 23:20:51
ary2, a = [], nil
ary2 << [a, ary.shift] while a = ary.shift
028227605/02/25 01:00:55
>>277, >>278
ありがとうございました。Rubyならwhileやfor文を使わなくても
きれいに書けるかなと思ったんですが、なかなか難しいみたいですね。
0283デフォルトの名無しさん05/02/25 01:06:56
欝になるほど汚いコードコンテストの会場はここですか?
0284デフォルトの名無しさん05/02/25 01:16:47
>>282
> Rubyならwhileやfor文を使わなくても
そーいや、ここしばらくイテレータ以外で繰り返し処理かけてないな。
0285Py厨05/02/25 01:42:31
>>> ary = [1, 'a', 2, 'b', 3, 'c']
>>> zip(ary[::2], ary[1::2])
[(1, 'a'), (2, 'b'), (3, 'c')]
0286デフォルトの名無しさん05/02/25 01:43:53
もうRubyだめだな
汚すぎる
0287デフォルトの名無しさん05/02/25 08:14:11
そこだけ見て判断するのはどうかと思うが、Pythonのスライスは便利だよな。rangeと共に重宝してます
Pythonだと a[1:] とかけるのが、Rubyでは a[1,a.size-1] と書かなければいけない、など
細かい事言えば、どちらも得意/不得意な事はあるんだけど

(0...a.length/2).map{|i| a.values_at i*2,i*2+1 }
(0...a.length/2).map{|i| a[i*2,2] }

Rubyの場合、特異クラスでメソッド追加出来るので、汚い部分はメソッドのなかに閉じ込めて、
0288デフォルトの名無しさん05/02/25 08:27:37
>>287
>Rubyでは a[1,a.size-1] と書かなければいけない
a[1..-1]
0289デフォルトの名無しさん05/02/25 18:12:10
Rubyで "[a,b]" を [a, b] と評価する関数ってあったっけ?
0290デフォルトの名無しさん05/02/25 18:39:52
Proc オブジェクトをそのまま文字列にマーシャリングしたいんですが、
うまいやり方とかあるでしょうか。

proc = Proc.new do |foo|
...
end

みたいな proc があったとき、

proc.to_s
#=> "Proc.new do |foo|
...
end

みたいにソースコードをそのまま取り出したいんですが・・・
0291デフォルトの名無しさん05/02/25 19:25:12
>>289
eval
>>290
無理。
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/40330
029229005/02/25 20:37:59
無理なのか・・・
>>291
どうもありが�d
0293デフォルトの名無しさん05/02/25 21:20:53
> 276
ary.values_at(*(0..ary.length-1).select{|a| a%2==0}).
zip(ary.values_at(*(0..ary.length-1).select{|a| a%2!=0}))
0294デフォルトの名無しさん05/02/26 02:01:24
ぱっと見て何をやってるかわからない1行よりは、素直な5行のほうがいいコード
5行がいやならメソッドに切り出せばいいし
0295デフォルトの名無しさん05/02/26 02:16:04
RubyにCとかで言うところのマクロはありますか?
0296デフォルトの名無しさん05/02/26 02:20:18
プリプロセッサに直接対応するものはない。
でもプリプロセッサの個々の機能に対応するRubyの機能はないとは限らない。
0297デフォルトの名無しさん05/02/26 02:47:51
>>294 と、素直な5行のコードも書けない奴がほざいております。
029829405/02/26 03:54:04
じゃあ5行で。

array = [1, 'a', 2, 'b', 3, 'c']
result = []
while e = array.shift do
result << [e, array.shift]
end

まあ、やってることは >281 とかわらんが。
0299デフォルトの名無しさん05/02/26 03:58:06
どうでもいいが、インデント修正。

array = [1, 'a', 2, 'b', 3, 'c']
result = []
while e = array.shift do
 result << [e, array.shift]
end
0300デフォルトの名無しさん05/02/26 10:52:59
>>298
>>299
Nice post!!

トリッキーなのも
「一行書き捨て、今後もう使わんだろー」っていうスクリプトならいいけど、
プログラムとして継続的につかい、しかも他人との共同作業であればなおさら、
ちょっとわかりやすすぎるし、ちょっと長いけど、単純な記述のほうが
あとあとうれしいもんだ〜ね。

........聞いてるかっ福沢!<だれやねん。
0301デフォルトの名無しさん05/02/26 10:54:58
ソースが仕様書 なRubyなのになにをいまさら.
0302デフォルトの名無しさん05/02/26 11:09:34
>>300
自分突っ込みは痛いんで、もう死んだほうがいいと思うよ?
0303デフォルトの名無しさん05/02/26 12:01:09
Rubyでヘンだと思うところは
empty_array = []
empty_hash = {}
みたいな空データを作ってから、そのあと
<< で要素を追加していくところ。
0304デフォルトの名無しさん05/02/26 12:16:13
副作用を利用したコードって、わかりやすい?
0305デフォルトの名無しさん05/02/26 12:31:47
ary = [1, a, 2, b, 3, c]
ary2 = ([[,]])ary
0306デフォルトの名無しさん05/02/26 12:42:31
http://www02.so-net.ne.jp/~greentea/pre.html

バカが往くのひとはどこの誰に切れたんですか?
0307デフォルトの名無しさん05/02/26 12:49:41
>>304
def mkpair(cs)
if cs.nil? || cs.length < 2; []
else ; [[cs[0],cs[1]]] + mkpair(cs[2..-1]) ; end
end
p mkpair([1, 'a', 2, 'b', 3, 'c'])

副作用もループもなしで
0308デフォルトの名無しさん05/02/26 13:27:26
tail recursionきたー
0309デフォルトの名無しさん05/02/26 13:44:13
しかしRubyの汚く詰めて書いたほうが勝ちって風潮はいったいどこから来てるんだろう
0310デフォルトの名無しさん05/02/26 13:53:35
Matzが1行プログラム好きだから
0311デフォルトの名無しさん05/02/26 13:58:15
>>309
それはあなたの思い込みでしょう。
そもそもそんな風潮なんてないし、
そもそも詰めて書いたら汚いなんてこともないし、
そもそも勝ち負けなんてないし。
0312デフォルトの名無しさん05/02/26 14:45:55
>>308

def mkpairs(cs)
def loop(rs,cs); (cs.nil? || cs.length<2) ? rs : loop(rs+[[cs[0],cs[1]]], cs[2..-1]); end
loop([],cs)
end
p mkpairs([1, 'a', 2, 'b', 3, 'c', 4])

>>307 は tail recursion じゃないと思われ。こっちの方がシンプルか?

def mkpair(cs)
(cs.nil? || cs.length<2) ? [] : [[cs[0],cs[1]]] + mkpair(cs[2..-1])
end
p mkpair([1, 'a', 2, 'b', 3, 'c', 4])
0313デフォルトの名無しさん05/02/26 14:56:50
>>307
>>312
どちらも
[[[1, 'a']], [[2, 'b']], [[3, 'c']]]
こうなってしまいませんか?
0314デフォルトの名無しさん05/02/26 16:15:01
>>313
実行してみると、きちんと [[1, "a"], [2, "b"], [3, "c"]] が出てくるけど。
0315デフォルトの名無しさん05/02/26 20:26:37
>>300
祥子お姉さま、お呼びになりましたか?
0316デフォルトの名無しさん05/02/26 21:59:35
ruby/tkの使い方がよくわからず、こまっとります
たとえば変数aを1秒間に10回監視しa=1の時、正方形の中身を赤
2の時は青、それ以外の時黒に塗るというのはどう書けばいいのでしょうか?
0317デフォルトの名無しさん05/02/27 00:52:28
>315
ごきげんよう。
0318デフォルトの名無しさん05/02/27 05:37:53
>>285
pythonやyorickの添え字増分は便利だねえ。rubyでまねるならこうかな。

class Array
alias_method(:aref, :[])

def [](*a)
range, by = *a;
return aref(*a) unless a.size == 2 and range.is_a?(Range)
tmp = aref(range)
tmp.values_at(*(0..(tmp.size-1)/by).map{|i| i*by})
end
end

ary = [1, 'a', 2, 'b', 3, 'c']
p ary[0..-1, 2].zip(ary[1..-1, 2])
0319デフォルトの名無しさん05/02/27 05:53:49
>>316
tkに限らず、1秒に10回と正確に指定するのは無理だと思う。
ためしに sleep 0.1 のループを別の忙しいループと並べて走らせたら、
100回で1割程度の遅れがでた。
0320デフォルトの名無しさん05/02/27 06:21:06
>正確に
論点はそこではないだろ
0321デフォルトの名無しさん05/02/27 07:51:59
誰が見てもわかりやすい、メンテしやすいコーディングという面から考察した場合
イテレータを使うというのはどうなんだろう・・

rubyらしいコーディング・・ かぁ・・・・ むーん
0322デフォルトの名無しさん05/02/27 09:32:29
とりあえず、何でrubyが読みやすい言語ってことに
なっている(売りにしている)のかがよくわからん。
慣れれば書きやすいとは思うが読みやすいとは全然思わない。
0323デフォルトの名無しさん05/02/27 10:52:07
perlより、というプリフィックスをつけるんだ!
0324デフォルトの名無しさん05/02/27 12:27:24
無駄にいろんな機能を使いこなそうとせずに
普通に書いてる分にはきれいで読みやすいと思うけどね。
0325デフォルトの名無しさん05/02/27 13:31:17
>>321
イテレータって問題なの?
Rubyを知らない人にはわからんだろうけど。

>>322
じゃあ例えば何なら読みやすい?
0326デフォルトの名無しさん05/02/27 13:34:03
lisp
0327デフォルトの名無しさん05/02/27 14:51:25
んー、確かにRubyがよくわかってる人なら問題ないのかもしれないけれど

「ん、 なんだ この識別子は・・」 ->defってるところを探す
「ふむ・・ ここか・・ なになに?・・」

ここで思考停止になるパターン多そうな気がしない?

yield、イテレータの引数、渡されるブロック、ブロックパラメータ・・・
「んん?? これが・・ こうなって・・あれれ?」
0328デフォルトの名無しさん05/02/27 15:12:46
インタフェイスを複雑にしない
適切な名前をつける
0329デフォルトの名無しさん05/02/27 15:43:04
>>328
例えば、String型のデータを作るとき。

str_test01 = ""

とせずに、

str_test02 = String.new("")

とすると、大量な文字の羅列が積み重なるファイルの中では
ひとつひとつの行では、一見わずかな効果しか無いようだが、
積み重なったとき、実感できるほどに「見通し」が良くなるような気がする。

タイプの量は増えるけど、後々を考えると、どうだろう。
0330デフォルトの名無しさん05/02/27 15:49:55
イテレータの使い方とか表面的なことすらわかってない人を
「Rubyをちょっとはわかっている人」と言えるのか?
いや、イテレータの理論とかは俺も知らないが。

他の有名な言語ではあまり見ないfeatureだから
他の言語を知っている(特に手続き型な言語しか知らない)Ruby初学者には
直感が働かないところかもしれないけどね。

しかしそんなやつにRubyのソースをメンテさせたりするな。
Cしか知らないやつにC++のソースをメンテさせるのと同じくらい無茶だ。
0331デフォルトの名無しさん05/02/27 16:00:26
>>329
言いたいことが全然伝わってこない。
例が""じゃString.newを書き足しても冗長なだけに見える。
さらに変数名がstr_だったら普通Stringだと伝わるだろう。
これはまさに>>328の言うとおり。

多分例が悪いんだと思う。それともまた型の話か?
■ このスレッドは過去ログ倉庫に格納されています