Rubyについて Part 15
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
05/02/12 06:58:04Ruby 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下記のような違いがあるということかな?
%Q( #{ Time.now } ) # => " Wed Feb 23 15:48:08 JST 2005 "
%q( #{ Time.now } ) # => " \#{ Time.now } "
0233デフォルトの名無しさん ◆m7YeytgDFE
05/02/23 15:53:58あ、これは"〜"と'〜'の違いっていうだけか。
良く分かってませんでした。失礼しました...。
0234デフォルトの名無しさん
05/02/23 16:12:09ただ単に文字列中に " を入れたいなら ' でくくればいいのだが、
文字列中に #{} と " の両方を入れたいなら " でくくるのはちょっと、
という話ではないだろうか。
0235デフォルトの名無しさん
05/02/23 16:26:33%Q(abc(def) が通らないっていうのはすごくヘンだと思うぞ。なんで文字列の
中でカッコのマッチングをわざわざ取ってるんだ?
%Q|abc(def| とか、他の記号を使うとオーケーなのにね。
%記法をつかうなら中に入らない文字を使えってことかな。
0236デフォルトの名無しさん
05/02/23 16:33:46つーか、
> %記法をつかうなら中に入らない文字を使えってことかな。
という認識は、きっと逆で、
中でかぶらない任意の文字を区切り文字として使いたい、
という場合に%記法を使うのが正しい使い方と思われ。
0237231
05/02/23 18:09:39確かに不思議な仕様ではあるね。
なんとなく%Q(()) => "()"としたかったのかな。
他の言語(Perlとか)からごっそり取り込んだだけの仕様だったりする?
ところでもし>>225==>>235なら、
>%Q(abc(def)はエラーで、%q(abc(def))は通るんですよね。
でわざわざ%Qと%qを使った理由を教えてくれ。
0238226
05/02/23 18:34:01$が、改行の前か、文字列の最後ってことは、色々調べて書いてあったんですが、
その上で、226を実行すると、/\n$/っていうのがabc\nにマッチしてしまう理由がわからないのです。
$が改行の前なら、マッチして欲しくないんですが。
0239225
05/02/23 18:37:54あ、今知ったんですが、%qとか%Qって、括弧()じゃなくてもつかえるんですね!!
これなら、便利かも。
ところで、やっぱり、変な仕様である気はしますね。%q(()のエラー。
0240デフォルトの名無しさん
05/02/23 18:56:47/\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それを知らなかったのなら仕方ないか。
%記法は、括弧のときだけ特別に中身の対応をチェックするようになっている。
親切なような、余計なお世話のような。
%Q'文字列中に"をエスケープなしで'
%q"文字列中に'をエスケープなしで"
とか書いたりもするなあ。
0243デフォルトの名無しさん
05/02/23 19:41:51# Perl では $ は改行の前と文字列末尾にマッチする
とあるけど
print "true\n" if "\n" =~ /$\n/;
はperlでマッチしないのね。
でもrubyだとマッチする。
0244デフォルトの名無しさん
05/02/23 20:06:460245デフォルトの名無しさん
05/02/23 20:15:27Perlでは$は、改行文字そのものとマッチするが後方参照しても文字列が取り
出せないもの、としているということなのかな。
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"\na" =~ /^a/は複数行モードの問題じゃね?
"\na" =~ /^a/mにすればperlもrubyもマッチする
0248デフォルトの名無しさん
05/02/23 20:28:51["a", "b"].inspect
0249デフォルトの名無しさん
05/02/23 20:32:49Ruby はデフォルトで複数行モードがセットされてるってこと?
0251デフォルトの名無しさん
05/02/23 20:43:39http://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マジで?
Ruby には s なんて無い (Shift_JIS モードになるオプションに当てられてる) わけだけど、
どうやって単行モードにするの?
0253デフォルトの名無しさん
05/02/23 21:15:45/usr/local/bin/ruby が存在しなくてエラーになりまくりなのですが。
0254デフォルトの名無しさん
05/02/23 21:37:47日本語は?
0255デフォルトの名無しさん
05/02/23 21:39:10-K オプションを指定すれば?
0256デフォルトの名無しさん
05/02/23 21:47:12・・・知らなかった、サンクスorz
$KCODE= = 'SJIS'にしてみた
0257デフォルトの名無しさん
05/02/23 21:55:230258デフォルトの名無しさん
05/02/23 23:16:33そんなモードいらん
0259226
05/02/24 00:05:30p "abc\n" =~ /$$$\n$$$/ #=> 3
なるほど。
0260デフォルトの名無しさん
05/02/24 00:59:19http://pc5.2ch.net/test/read.cgi/tech/1107799347/
0261デフォルトの名無しさん
05/02/24 01:10:19むしろNオプションでネコミミモード
……どんなモードやねん、と自分で突っ込んでおく
0262デフォルトの名無しさん
05/02/24 01:11:56http://www.rubyist.net/~matz/20050222.html#p01
これ、だれかやるの?
0263デフォルトの名無しさん
05/02/24 09:49:34されてないんだけど、ruby-talk の間違い?
0264デフォルトの名無しさん
05/02/24 10:33:09http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/40638
これ?
0265デフォルトの名無しさん
05/02/24 11:18:140266デフォルトの名無しさん
05/02/24 11:45:27をインストールして、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でみなさん、使えてるのでしょうか??
0267266
05/02/24 11:53:06やはり、パスにスペースが入ってるとうまくいかないようです。>gems
デフォルトで、RubyGems添付になって、
RAAに登録されているのは、Gem形式で配布されればいいのに。。
0268266
05/02/24 12:00:09updating gem source index for: http://gems.rubyforge.org
ってところから進まないぞぉー
0269266
05/02/24 13:17:41るびま見たら、actionmailとか必要みたいなので、インストールしようと思ったら、
RAAにないし。。
RAAからrailsだけとってきて、インストールしたらいいのかな??
0270デフォルトの名無しさん
05/02/24 13:43:37updating gem source index for: http://gems.rubyforge.org
と表示されてから完了するまでかなりの時間(2、3分)かかるので、
すぐにやめずに少し待ってみては。
0271266
05/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翻訳してくれ。
0273デフォルトの名無しさん
05/02/24 20:52:020274デフォルトの名無しさん
05/02/24 22:16:41http://one.textdrive.com/pipermail/rails/2005-February/003444.html
0275デフォルトの名無しさん
05/02/24 22:18:55インストールマニュアルというか、
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:10Hash[*[1, a, 2, b, 3, c]).to_a
0278デフォルトの名無しさん
05/02/24 23:07:15Hash[*ary].to_a # => [[1, a], [2, b], [3, c]]
0279277
05/02/24 23:07:520280278
05/02/24 23:12:14もういっちょ。
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]]}
美しくないですが。
0281277
05/02/24 23:20:51ary2 << [a, ary.shift] while a = ary.shift
0282276
05/02/25 01:00:55ありがとうございました。Rubyならwhileやfor文を使わなくても
きれいに書けるかなと思ったんですが、なかなか難しいみたいですね。
0283デフォルトの名無しさん
05/02/25 01:06:560284デフォルトの名無しさん
05/02/25 01:16:47> Rubyならwhileやfor文を使わなくても
そーいや、ここしばらくイテレータ以外で繰り返し処理かけてないな。
0285Py厨
05/02/25 01:42:31>>> zip(ary[::2], ary[1::2])
[(1, 'a'), (2, 'b'), (3, 'c')]
0286デフォルトの名無しさん
05/02/25 01:43:53汚すぎる
0287デフォルトの名無しさん
05/02/25 08:14:11Pythonだと 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>Rubyでは a[1,a.size-1] と書かなければいけない
a[1..-1]
0289デフォルトの名無しさん
05/02/25 18:12:100290デフォルトの名無しさん
05/02/25 18:39:52うまいやり方とかあるでしょうか。
proc = Proc.new do |foo|
...
end
みたいな proc があったとき、
proc.to_s
#=> "Proc.new do |foo|
...
end
みたいにソースコードをそのまま取り出したいんですが・・・
0291デフォルトの名無しさん
05/02/25 19:25:12eval
>>290
無理。
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/40330
0293デフォルトの名無しさん
05/02/25 21:20:53ary.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:245行がいやならメソッドに切り出せばいいし
0295デフォルトの名無しさん
05/02/26 02:16:040296デフォルトの名無しさん
05/02/26 02:20:18でもプリプロセッサの個々の機能に対応するRubyの機能はないとは限らない。
0297デフォルトの名無しさん
05/02/26 02:47:510298294
05/02/26 03:54:04array = [1, 'a', 2, 'b', 3, 'c']
result = []
while e = array.shift do
result << [e, array.shift]
end
まあ、やってることは >281 とかわらんが。
0299デフォルトの名無しさん
05/02/26 03:58:06array = [1, 'a', 2, 'b', 3, 'c']
result = []
while e = array.shift do
result << [e, array.shift]
end
0300デフォルトの名無しさん
05/02/26 10:52:59>>299
Nice post!!
トリッキーなのも
「一行書き捨て、今後もう使わんだろー」っていうスクリプトならいいけど、
プログラムとして継続的につかい、しかも他人との共同作業であればなおさら、
ちょっとわかりやすすぎるし、ちょっと長いけど、単純な記述のほうが
あとあとうれしいもんだ〜ね。
........聞いてるかっ福沢!<だれやねん。
0301デフォルトの名無しさん
05/02/26 10:54:580302デフォルトの名無しさん
05/02/26 11:09:34自分突っ込みは痛いんで、もう死んだほうがいいと思うよ?
0303デフォルトの名無しさん
05/02/26 12:01:09empty_array = []
empty_hash = {}
みたいな空データを作ってから、そのあと
<< で要素を追加していくところ。
0304デフォルトの名無しさん
05/02/26 12:16:130305デフォルトの名無しさん
05/02/26 12:31:47ary2 = ([[,]])ary
0306デフォルトの名無しさん
05/02/26 12:42:31バカが往くのひとはどこの誰に切れたんですか?
0307デフォルトの名無しさん
05/02/26 12:49:41def 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:260309デフォルトの名無しさん
05/02/26 13:44:130310デフォルトの名無しさん
05/02/26 13:53:350311デフォルトの名無しさん
05/02/26 13:58:15それはあなたの思い込みでしょう。
そもそもそんな風潮なんてないし、
そもそも詰めて書いたら汚いなんてこともないし、
そもそも勝ち負けなんてないし。
0312デフォルトの名無しさん
05/02/26 14:45:55def 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>>312
どちらも
[[[1, 'a']], [[2, 'b']], [[3, 'c']]]
こうなってしまいませんか?
0314デフォルトの名無しさん
05/02/26 16:15:01実行してみると、きちんと [[1, "a"], [2, "b"], [3, "c"]] が出てくるけど。
0315デフォルトの名無しさん
05/02/26 20:26:37祥子お姉さま、お呼びになりましたか?
0316デフォルトの名無しさん
05/02/26 21:59:35たとえば変数aを1秒間に10回監視しa=1の時、正方形の中身を赤
2の時は青、それ以外の時黒に塗るというのはどう書けばいいのでしょうか?
0317デフォルトの名無しさん
05/02/27 00:52:28ごきげんよう。
0318デフォルトの名無しさん
05/02/27 05:37:53pythonや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:49tkに限らず、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なっている(売りにしている)のかがよくわからん。
慣れれば書きやすいとは思うが読みやすいとは全然思わない。
0323デフォルトの名無しさん
05/02/27 10:52:070324デフォルトの名無しさん
05/02/27 12:27:24普通に書いてる分にはきれいで読みやすいと思うけどね。
0325デフォルトの名無しさん
05/02/27 13:31:17イテレータって問題なの?
Rubyを知らない人にはわからんだろうけど。
>>322
じゃあ例えば何なら読みやすい?
0326デフォルトの名無しさん
05/02/27 13:34:030327デフォルトの名無しさん
05/02/27 14:51:25「ん、 なんだ この識別子は・・」 ->defってるところを探す
「ふむ・・ ここか・・ なになに?・・」
ここで思考停止になるパターン多そうな気がしない?
yield、イテレータの引数、渡されるブロック、ブロックパラメータ・・・
「んん?? これが・・ こうなって・・あれれ?」
0328デフォルトの名無しさん
05/02/27 15:12:46適切な名前をつける
0329デフォルトの名無しさん
05/02/27 15:43:04例えば、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言いたいことが全然伝わってこない。
例が""じゃString.newを書き足しても冗長なだけに見える。
さらに変数名がstr_だったら普通Stringだと伝わるだろう。
これはまさに>>328の言うとおり。
多分例が悪いんだと思う。それともまた型の話か?
■ このスレッドは過去ログ倉庫に格納されています