Ruby 初心者スレッド ..
2:デフォルトの名無しさん
09/12/05 14:22:09
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?
A:
プログラム作成自体の初心者なら
・「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
URLリンク(www.amazon.co.jp)
文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
・「初めてのRuby」
URLリンク(www.amazon.co.jp)
以下は外れが少ないとされている本です。必ず立ち読みした上で自分の目的とレベルに応じて購入してください。
・「Rubyレシピブック 第2版 268の技」(初心者向け)
URLリンク(www.amazon.co.jp)
・「プログラミングRuby 第2版 言語編」(初心者向け)
URLリンク(www.amazon.co.jp)
・「Ruby Way 第2版」(脱初心者向け)
URLリンク(www.amazon.co.jp)
・ 「Rubyクックブック ―エキスパートのための応用レシピ集」(脱初心者向け)
URLリンク(www.amazon.co.jp)
以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません。
・「プログラミング言語 Ruby」(言語として深く知りたい人向け)
URLリンク(www.amazon.co.jp)
3:デフォルトの名無しさん
09/12/05 14:22:49
Ruby 公式・非公式便利サイト2009
・Ruby Home Page 【公式、お役立ち度が微妙】
URLリンク(www.ruby-lang.org)
・Rubyリファレンスマニュアル 【検索機能休止中、Googleなどの併用を】
URLリンク(www.ruby-lang.org)
URLリンク(www.ruby-doc.org) 【詳しい英語版】
・HTMLヘルプ版リファレンスマニュアル配布さん 【Windowsで便利、検索も無論可能】
URLリンク(elbereth-hp.hp.infoseek.co.jp)
・Programming Ruby - The Pragmatic Programmer's Guide 【好評書籍の初版がネットで、ただし英語】
URLリンク(www.ruby-doc.org)
・Rubyist Magazine - るびま 【ライブラリ紹介などの読み物、過去のコードレビューは一読の価値あり】
URLリンク(jp.rubyist.net)
・逆引きRuby 【やりたいことから探すWiki、最近元気ないので編集者募集】
URLリンク(www.namaraii.com)
・はてなキーワード > Ruby 【うっかりどっさりまとまったリンク集、説明なし】
URLリンク(d.hatena.ne.jp)
・RubyForge 【○○をやりたい管理されたライブラリを探すならここ、英語】
URLリンク(www.rubyforge.org)
・GitHub 【○○をやりたいコードをとにかく探すならここ、英語】
URLリンク(github.com)
・日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
URLリンク(jp.rubyist.net)
4:デフォルトの名無しさん
09/12/05 14:24:09
関連スレ
・Rubyについて Part 38
スレリンク(tech板)
アンチスレ
・Rubyについて(アンチ専用) Part004
スレリンク(tech板)
Railsスレ
・【Ruby】Ruby on Rails Part8
スレリンク(php板)
Windows用スレ
・【ActiveScript】RubyをWindowsで使うスレ【GUI】
スレリンク(tech板)
Ruby 1.9 系列スレ
・魁け! Ruby 1.9.X
スレリンク(tech板)
5:デフォルトの名無しさん
09/12/05 14:24:50
前スレ
Ruby 初心者スレッド Part 32
スレリンク(tech板)
Ruby 初心者スレッド Part 31
スレリンク(tech板)
6:デフォルトの名無しさん
09/12/05 14:25:32
バージョンに関するよくある質問
・Ruby 1.8.5
レンタルサーバ等にいまだに残ってる非安定な古いバージョン
1.8.6 にすらなってない理由はたぶん管理の手抜きなので怒ってよい
・Ruby 1.8.6
過去の長期政権と数の暴力で一大勢力圏を維持中の旧安定版
公開スクリプトはこれでも動作するべきではあるんだがそろそろ 1.8.7 に譲ってくれ
・Ruby 1.8.7
1.9 シリーズの機能をいくつか足したハイブリッドなバージョン、初学者にこそお勧め
1.9 系機能は 1.8.6 では動かないが「えーマジ1.8.6!? 1.8.6が許されるのは小(AA略」と煽ってよい
・Ruby 1.9.0
不安定にして先鋭機能が超満載の開発版バージョンだったもの
1.9.x は本来全てが開発版の呼称だったのだが、事情が変わって(ここ笑うところ)1.9.1 は安定板に
・Ruby 1.9.1
満を持して登場の 1.9 系列安定板(本体は 1.8.6 程度には使えるということになっている)
本体と添付ライブラリの動作は問題がないのだが外部第三者ライブラリが全く追いついていない
初心者を脱した人が外部ライブラリの開発コミュニティに参加してくれたりすることを期待中
7:デフォルトの名無しさん
09/12/05 15:33:07
前すれ >>999
確かにこれでもいいが、メソッドチェーンできねえからな・・・
p {"a" => 1, "b" => 2, "c" => 3}.map{|x|x[1]}
SyntaxError: compile error
>999 名前:デフォルトの名無しさん[sage] 投稿日:2009/12/05(土) 14:16:08
>>>989
>中カッコを外すとかは?
>
>p "a" => 1, "b" => 2, "c" => 3
8:デフォルトの名無しさん
09/12/05 15:46:49
おまけ
・Rubygem 0.x
極悪動作をすることで有名なRuby外部ライブラリ利用サポートプログラム群のバージョン
このバージョンしかパッケージが存在しないUNIX系ディストリビューションがあって結構問題に
しかも「rubygem本体の自己更新機能は殺してるのでパッケージから入れてね」とかほざきやがる
パッケージがバージョン 1 より前のものしかない場合はソースからインストールするとよい
Rubygem は 1.0 も 1.1 も 1.2 も肝心なとこにバグ持ちなので極力 1.3 などの最新を使うこと
9:デフォルトの名無しさん
09/12/05 15:51:54
>>8
Ubuntu 9.xxでもaptで入れるとbinにパス通ってなかったり、どうしてこうなった?なことになってる
謎過ぎる。
10:デフォルトの名無しさん
09/12/05 16:02:10
>>9
URLリンク(pkg-ruby-extras.alioth.debian.org)
このへん? よく読んでないけど。
11:デフォルトの名無しさん
09/12/05 17:32:12
a = 82.30
b = 80.20
print a - b, "\n" ←こうやると誤差がでますが
printf("%.2f\n", a - b) ←修正はこれでいいですか?もっといい方法あります?
12:デフォルトの名無しさん
09/12/05 17:44:41
irb> a = 82.30
82.3
irb> b = 80.20
80.2
irb> p a-b
2.09999999999999
irb> require 'bigdecimal'
irb> a = BigDecimal.new('82.30')
irb> b = BigDecimal.new('80.20')
irb> puts a-b
0.21E1
nil
irb> puts (a-b).to_f
2.1
13:デフォルトの名無しさん
09/12/05 18:17:21
>>12
なるほど。BigDecimalですか。
そっちの方が推奨されるやり方なんでしょうか?
例えば以下の様な方法だと何か問題はありますか?
a = 82.30
b = 80.20
c = nil
c = sprintf("%.2f", a - b).to_f
14:デフォルトの名無しさん
09/12/05 19:00:05
>>13
それで問題があるかどうかはその数値の使われ方を知っている君が知ってるはず
15:デフォルトの名無しさん
09/12/05 20:02:12
>>14
という事は単純な桁数指定と切り上げ処理に限っていえば
この方法でも問題ないという事ですね?
16:デフォルトの名無しさん
09/12/06 01:38:06
character = Array.new
character << {alph => "a", hiragana => "あ"}
上記のようなコードを書いた後に、katakana => "ア" を、
配列 character の中のハッシュの末尾に追加するには、どうすればよいでしょう
character[[alph => "a", kana => "あ", ]]
^^^^^^^^^^^^^^^
ここに katakana => "ア" を追加したい。
17:デフォルトの名無しさん
09/12/06 01:46:15
>>16
alphaとかhiraganaというのはローカル変数なのか、
シンボルの記述ミスなのか
# あまり本質的ではないけど一応確認。
character[-1].update(katakana => 'ア')
character[-1]で配列の最後の要素にアクセスできる。
返ってくるのは該当要素それ自体(コピーではなく)
これに破壊的メソッドを作用させればよい。
これ、ハッシュの「最後」に追加されるかどうかはバージョンによる。
MRIの1.9ではキーの追加順になるけど、ハッシュの本義に照らせば
どこに追加されるかは仮定できない。
18:デフォルトの名無しさん
09/12/06 01:53:27
>>17
> alphaとかhiraganaというのはローカル変数なのか、
> シンボルの記述ミスなのか
記述ミスです。。。
ありがとうございます!できました。
19:デフォルトの名無しさん
09/12/06 02:19:04
なにこのキモいスレ
20:デフォルトの名無しさん
09/12/06 08:05:03
YARVの1.9からはハッシュの順番が保証されてるんだっけ?
21:デフォルトの名無しさん
09/12/06 08:12:15
なんか微妙な表現だがおおむねYESだ
それがなくなることもない
22:デフォルトの名無しさん
09/12/06 14:05:43
injectが遅いんですが何のためにあるとですか?
>> RUBY_DESCRIPTION
=> "ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]"
>> Benchmark.realtime{Array.new(1_000_000).inject(0){|r,|r+0}}
=> 1.62985396385193
>> Benchmark.realtime{sum=0; 1_000_000.times{sum+=0}}
=> 0.377360105514526
23:デフォルトの名無しさん
09/12/06 16:11:36
速くしたいなら速いほうで書けばいいじゃん
24:デフォルトの名無しさん
09/12/06 18:27:10
>>23
真理だな
25:デフォルトの名無しさん
09/12/06 18:31:49
(キリッ
26:デフォルトの名無しさん
09/12/06 19:42:32
>>22
injectは遅いし分かりにくいので、使わずに済むなら使わない方がいいと思う。
1.9にしたらけっこう速くなるけど。
27:デフォルトの名無しさん
09/12/06 21:53:15
分かりにくいんじゃなくて、慣れていないだけでは。
なれれば、すぐ読めるよ。
injectは式一個でかけるし、メソッドチェーンも作れるってのがいいんじゃないかな。
28:デフォルトの名無しさん
09/12/06 22:50:01
>>22
injectは遅いけど、比較のしかたが違ってるんじゃ?
injectを使うってことは配列とかをイテレートしたいってことだろうから
require 'benchmark'
hoge = Array.new(1_000_000)
a = Benchmark.realtime{sum = hoge.inject(0){|r,e|r+0}}
b = Benchmark.realtime{sum=0;hoge.each{|e|sum+=0}}
print "#{a} / #{b} = #{'%1.5f'%[a/b]}"
くらいが比較なんじゃないだろうか
ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mingw32]
2.03125 / 0.21875 = 9.28571
ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]
0.15625 / 0.078125 = 2.00000
1.8だと9倍おそいけど 1.9だと2倍のコスト
しかも1.9のinjectの方が 1.8のeachより速い
29:デフォルトの名無しさん
09/12/06 22:51:50
ためしに配列を5倍にしたら
ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mingw32]
34.421875 / 1.109375 = 31.02817
ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]
0.640625 / 0.359375 = 1.78261
1.8のinjectがすごく遅くなった
30:デフォルトの名無しさん
09/12/06 22:58:04
さらに1.9だと
p が引数をそっくり返り値にするので 前スレの
[1,2,3,4,5].inject(0) {|result, item| p result += item }
はそのままで動く
puts とかprintfみたいに値を返さないメソッド使いたい場合
破壊的変更が出来るのなら each_with_object も使える
[1,2,3,4,5].each_with_object('') {|item,result| printf("%10s\n",result << item.to_s) }
injectと違い最後にresultを返り値に置かなくてもいい
でも数値だと破壊的変更が出来ないので普通にinjectを使うしかないような
31:デフォルトの名無しさん
09/12/06 23:02:50
なんだかパッとしないな < each_with_object
32:デフォルトの名無しさん
09/12/07 00:00:35
hs = (0..5).map do |n| (0..5).map do |m| 0 end end
二次元配列を生成する方法にこんなものを知ったんですが
もっと短くかけないんでしょうか?
33:デフォルトの名無しさん
09/12/07 00:04:21
多次元配列というものは Ruby にはそもそもない
つまり、ネストした配列で代用するしかない
map でもいいんじゃね
34:デフォルトの名無しさん
09/12/07 01:29:14
hs = Array.new(6){Array.new(6){0}}
hs = (0..5).map{|n|(0..5).map{|m|0}}
hs = (0..5).map{(0..5).map{0}}
35:デフォルトの名無しさん
09/12/07 02:33:01
理解困難
>> a1=Array.new(2)
=> [nil, nil]
>> a1.map{|e|e.object_id}
=> [4, 4]
>> a1[0]=:test
=> :test
>> a1
=> [:test, nil]
>> a2=Array.new(2,Array.new(2))
=> [[nil, nil], [nil, nil]]
>> a2.map{|e|e.map{e.object_id}}
=> [[2983450, 2983450], [2983450, 2983450]]
>> a2[0][0]=:test
=> :test
>> a2.map{|e|e.map{e.object_id}}
=> [[2983450, 2983450], [2983450, 2983450]]
>> a2
=> [[:test, nil], [:test, nil]]
36:デフォルトの名無しさん
09/12/07 02:49:23
>>33-34
そうですかぁ
残念です
37:デフォルトの名無しさん
09/12/07 02:53:32
>>35
× a2.map{|e|e.map{e.object_id}}
○ a2.map{|e| e.map{|e| e.object_id}}
38:デフォルトの名無しさん
09/12/07 03:01:59
把握
39:デフォルトの名無しさん
09/12/07 03:52:50
s = "aaa bbb ccc:ddd eee"
if s =~ /ccc:(\S+)/
t = $1
s.gsub!(/ccc:(\S+)/, "") # この二度手間な記述をもっと簡潔に書くやり方はないですか?
end
p s # "aaa bbb eee"
p t # "ddd"
40:デフォルトの名無しさん
09/12/07 05:06:06
こう?
s = "aaa bbb ccc:ddd eee"
t = s.gsub!(/ccc:(\S+)/, '') ? $~[1] : ''
41:デフォルトの名無しさん
09/12/07 05:10:30
>>39
これくらいしか思い付かん
s = "aaa bbb ccc:ddd eee"
t = s[/ccc:(\S+)/,1]
s.gsub!(/ccc:(\S+)/,"")
又は
s,t = "aaa bbb ccc:ddd eee"
s.gsub!(/ccc:(\S+)/) { t = $1 ; "" }
もしくは
s = "aaa bbb ccc:ddd eee"
s,t = $`+$',$1 if s =~ /ccc:(\S+)/
42:デフォルトの名無しさん
09/12/07 05:12:15
>>40
ここで $1 ではなく $~[1] を使う理由はある?
43:デフォルトの名無しさん
09/12/07 10:18:05
というか特段二度手間でもない
簡潔でわかりやすくていいじゃん
44:デフォルトの名無しさん
09/12/07 11:08:35
attr_* をそのままライブラリ外に公開する理由ってたいていの場合薄いよね?
45:デフォルトの名無しさん
09/12/07 11:16:10
>>44
そういう考え方もある
内部変数名と同じ名前のpublicなメソッドを外部提供する理由は本来無い
ユーザーに提供されるべきは、もっと一段上の名称&機能なメソッドであるべき
attr_writer :username, :password
ではなく
def user_info(h={})
@username, @password = h[:username], h[:password]
end
とかのほうがいいんじゃね、みたいな考え
オープンクラスだし堅いこと言うなJava使えJavaって感じではあるが
46:デフォルトの名無しさん
09/12/07 16:30:36
>>39
gsub!を使うということは複数回の置換が想定されるのか?
tの値は置換が起こらなければ保存しておきたいのか?
置換でも$1は得られるので
複数回の置換がおこなわれるうちの最後の$1が取れればいいだけなら
>>40 でいい
置換が起こらなければtを変更したくないのならば
t = $1 if s.gsub!(/ccc:(\S+)/, '')
とか、置換が起こらなければt=nilになってもいいのなら
t = s.gsub!(/ccc:(\S+)/, '') && $1
複数回置換のうちの最初の $1 が得たいのなら
置換が起こらなければt=nilになりますが >>41 の二番目をちょっと変えた
t = nil
s.gsub!(/ccc:(\S+)/) { t ||= $1 ; "" }
とか
t = nil
t ||= $1 while s.sub!(/ccc:(\S+)/,'') #gsub!と違って置換した結果をさらに置換していくので結果が変わることもある
とかですかね
でも、巨大文字列内の大量置換を一気にやり、なおかつ最初の$1を得たいのなら>>39が一番速いかな
>>41の最初のでもいいけど tが変更されるし>>39の方がわかりやすい
47:デフォルトの名無しさん
09/12/07 19:14:47
URLリンク(itpro.nikkeibp.co.jp)
今年はじめのこんな記事を見つけたんだけど、仕様書草案ってもうどこかで見られる?
48:デフォルトの名無しさん
09/12/07 19:19:46
RubySpecかな
49:デフォルトの名無しさん
09/12/07 19:31:48
>>47
Rubyについて Part 38
スレリンク(tech板)
261 名前: デフォルトの名無しさん Mail: sage 投稿日: 2009/12/01(火) 19:36:45
URLリンク(ruby-std.netlab.jp)
50:デフォルトの名無しさん
09/12/07 19:39:59
ddd! ありがとうございます!
51:デフォルトの名無しさん
09/12/07 21:34:59
Rubyのテスト用フレームワークっていくつかあるみたいですが何がいいでしょうか?
場合による、という結論かもしれませんが
みなさんは何を使ってますか?
52:デフォルトの名無しさん
09/12/07 21:45:45
目的によるし、おおむね目的ごとに分かれてると思う
自分で使ってテストの方向性に合うものを選択するといい
テストフレームワークを1種類しか使えない、という人は少ない
よーわからんがテストってあると便利そうじゃね、というのなら RSpec から始めるといいんじゃね
53:デフォルトの名無しさん
09/12/07 22:19:44
よーわからんがテストってあると便利そうじゃね、というレベルなら、
標準添付のtest/unitがいいんじゃね
54:デフォルトの名無しさん
09/12/07 22:34:53
テストっちゃ、「ファイルに保存されたかどうか」のテストってどうやるん
55:デフォルトの名無しさん
09/12/07 22:44:51
>>52-53
アドバイスありがとうございます
そうですね、もう少し調べたりいろいろ使ってみて決めたいと思います
56:デフォルトの名無しさん
09/12/07 22:47:08
・ 書き出し先ファイルがあれば削除
・ ファイル保存を含んだメソッドを実行
・ 例外が起こらないことをテスト
・ ファイルの中身が期待通りであることをテスト
・ 書き出し先ファイルがあれば削除
書き出すファイルを削除できないという場合は知らん
「きっと保存されるはず」みたいなテストするしかなくね
57:デフォルトの名無しさん
09/12/08 03:20:32
最終手段的には、事前にFile.openやFile#writeをフックとか・・・
58:デフォルトの名無しさん
09/12/08 11:45:06
FTPでディレクトリの更新日時が知りたいのですが取れません
一般的に、FTPではLSコマンドの結果を解釈するしかないのでしょうか?
(net/ftpを利用してます)
59:デフォルトの名無しさん
09/12/08 11:55:44
MLSDとか送ればいいんじゃないの
60:デフォルトの名無しさん
09/12/08 13:17:10
>>58
一般には自力で解析するしかない。
MDTMというコマンドもあるがすべてのftpサーバが実装しているわけではない。
61:デフォルトの名無しさん
09/12/08 14:02:01
>>54
class Publisher
def initialize(p)
@text, @from, @to, @path = p[:text], p[:from], p[:to], p[:path]
end
def publish
output = replace(@text, @from, @to)
save(output, @path)
end
def replace(text, from, to); text.gsub(/#{from}/){to}; end
def save(str, path); File.open(path, 'wb'){|f| f.print(str)}; end
end
# Publisher.new(:text => 'ruby大好き!', :from => 'ruby', :to => 'オブジェクト指向スクリプト言語Ruby',
# :path=> 'ruby_love.txt').publish #=> "オブジェクト指向スクリプト言語Ruby大好き!"
これの Publisher#save をテストしたいとかそんなの?
62:デフォルトの名無しさん
09/12/08 14:29:56
>>61
こう囁く
「なー、そのsaveするときの文字列がクラス本体にpとか追記せずに画面に表示できたら便利だと思わね?」
そしてこうする
class Publisher
def initialize(p)
@text, @from, @to, @path = p[:text], p[:from], p[:to], p[:path]
end
def publish
output = replace(@text, @from, @to)
save(io, output)
end
def io
case @path
when IO, File then @path
when "$stdout", nil then $stdout
when "$stderr" then $stderr
else File.open(@path, 'wb')
end
end
def replace(text, from, to); text.gsub(/#{from}/){to}; end
def save(io, str); io.print(str); io.close if io.kind_of?(File); end
end
Publisher.new(:text => 'ruby大好き!', :from => 'ruby', :to => 'オブジェクト指向スクリプト言語Ruby', :path=> $stdout).publish
これなら Publisher#save に StringIO を渡せばテストできるはず
保存時ファイル操作のエラーのときに独自処理したい場合はこれでは駄目だけど
63:デフォルトの名無しさん
09/12/08 16:17:20
JRubyとRubyの違いについて調べてみたのですが、
いまいちわからなかったのでここで質問してみます。
JRubyはコーディングの仕方が、Rubyと同じなだけであり、
それ以外の部分は全く別なものという解釈でいいのかな?
根本は全く違うものではあるが、コードレベルでは
同じ内容で動くものなので、移植する場合は、
コードのコピペでおk・・・かな?
64:デフォルトの名無しさん
09/12/08 17:29:49
>>59, 60
ありがとうございました
65:デフォルトの名無しさん
09/12/08 19:03:00
>>63
普通のRubyはCで書いてある
Cで書いてあるので拡張ライブラリはCで作るとよく動く
現在のCのバイナリはだいたい同じように動作することが期待できるのでRubyスクリプトを一度書けばどこでも動く
JRubyはJavaで書いてあるというかJavaで動くというかJava仮想マシンJVM上で動作する
Javaで書いてあるので拡張ライブラリはJavaで作ると普通に動く
おまけにJavaプログラムの一部として埋め込むことも実行することもJavaのライブラリを呼ぶこともできる
通常のRuby(Cで書かれているので区別のためにCRubyと呼ぶ)と同じように動作するように作ってあるものの
たまーに動作が違う部分が混じってることもないわけではないんだが
いちいちスクリプトレベルで対処するのも面倒だしそれこそ煩雑なので無視
本質的にはJVMのぶんだけJRubyのほうが遅い
ただ、JVMを常に起動してる場合は遜色ないか、JRubyのほうが処理が速いこともある
66:デフォルトの名無しさん
09/12/09 06:11:28
,―ヽ____、―
,/ ノ ヽ ~\
/ ノ IPA ヽ ~\
/ ノ ヽ、 `ヽ
| ノ / ̄\ / ̄~ヽ ヽ i
| ノ | ノ
\ | <●> <●> ( )
\ | | | i /
| / ヽ レ
i (●_●) /
i、 ,-―-、 ・ /
i、 <(EEEEE)> ∵/ まピョーん☆ IPA Rubyをこれからもよろしく
i、 \___/ _/
\ ,ノ
,,.....イ.ヽヽ、ー-―一ノ゙-、.
: | '; \_____ ノ.| ヽ i
| \/゙(__)\,| i |
> ヽ. ハ | ||
67:デフォルトの名無しさん
09/12/09 10:43:59
おまえら1.9.1更新しろー
URLリンク(sourceforge.jp)
と思ったがインストーラつきを公開してる人はまだいないのね
68:デフォルトの名無しさん
09/12/09 10:47:19
みんなに広まってからアップグレードする
どうせチェックにしか使ってないし、自分だけ「みんなと違って最新」だと意味ないし
69:デフォルトの名無しさん
09/12/09 11:01:47
>>68
安心しろ
1.9.1を普段使ってる奴は普通にアップグレードするし、
1.9.1を自分のスクリプト用のチェックにしか使ってない奴は
「この人のスクリプト俺の1.9.1-p0(しかもmswin32)だと動かないんすけどー」とか言ってきたりはしない
とっととアップグレードすれ
70:デフォルトの名無しさん
09/12/09 11:14:16
head使いには関係ないしな。
71:デフォルトの名無しさん
09/12/09 11:19:29
というか、パッチレベル0を鬱陶しいと思ってる人にこそ、
「1.9.1は最新版でしかチェックしてません」と公言するのをお勧め
そうしないといつまでたってもだらだら残るぞ
自分のサイトに最新版へのリンクでも張っとけ
72:デフォルトの名無しさん
09/12/09 11:25:34
~/work/source/ruby-1.9.1-p243$ make uninstall
make: *** ターゲット `uninstall' を make するルールがありません. 中止.
ぬう
てか前回のconfigureにどんなオプションつけたか忘れたしどこにインストールされたか調べるのめどい
73:デフォルトの名無しさん
09/12/09 11:45:58
「引数はHashの入ったArrayにしろ」って英語の警告でどう言えばいい?
74:デフォルトの名無しさん
09/12/09 11:54:23
raise ArgumentError, "invalid argument, RTFM"
75:デフォルトの名無しさん
09/12/09 12:12:55
ArgumentError を出したなら「引数が不正です」は言う必要なくね
76:デフォルトの名無しさん
09/12/09 12:35:33
>>73
スレ違い。 このへんで聞け。
スレリンク(tech板)
77:デフォルトの名無しさん
09/12/09 12:37:03
URLを間違えた。こっちだ。
スレリンク(tech板)
78:デフォルトの名無しさん
09/12/09 12:44:01
>>73
Hashを要素にしたArrayって英語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど
79:デフォルトの名無しさん
09/12/09 12:45:27
>>78
Hashを要素にしたArrayって日本語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど
80:デフォルトの名無しさん
09/12/09 12:55:43
>>78
Hashed Array
81:デフォルトの名無しさん
09/12/09 13:25:14
初心者以前の入門者の質問で申し訳ないのですが
Rubyの絵本で勉強を始めましたところ
「配列要素の代入と参照」の項のサンプルコードで躓きました。
n cats = [] = 1
cats[0] = "Kuro"
cats[1] = "Tama"
cats[2] = "Mike"
cats[3] = "Tora"
puts cats[n]
cats[0] = "Shiro"
このサンプルの1行目で以下のようなエラーが出てしまいます
hello.rb:1: syntax error
n cats = [] = 1
^
ググりまして「syntax error」が文法だということは分かりましたが
文法はまだ「文字列表示」と「変数」と「文字列」しか学習出来ていません
本の通りに入力しただけで、この1行目について本には一切説明がないので
どのように文法が違うのかも分からない状態です
この1行目がどのような意味なのか教えていただけないでしょうか
よろしくお願いいたします
環境
CentOS 5.3
ruby 1.8.5 (2006-08-25) [x86_64-linux]
82:81
09/12/09 13:28:11
>n cats = [] = 1
>^
スペースが省略されて「^」の位置がずれてしまいました
「^」は=と1の間にあるスペース部分を指しています
83:デフォルトの名無しさん
09/12/09 13:31:59
本書くとき間違えたんだろうな
売れてないのか何なのか正誤表にはとくに載ってない
おそらくこれが正しい
n = 1
cats = []
cats[0] = "Kuro"
cats[1] = "Tama"
cats[2] = "Mike"
cats[3] = "Tora"
puts cats[n]
cats[0] = "Shiro"
putsでは cats[1] の Tama が表示されるはず
84:デフォルトの名無しさん
09/12/09 13:38:25
質問
メソッドの中から、そのメソッドを呼び出しているメソッドの名前を知りたいのですが、
Kernel#caller以外の方法はありますか?
現在、caller が返す配列の中身に大してパターンマッチングを行って
メソッド名を切り出しているのですが、もっとよい方法がありそうな気がしまして
85:デフォルトの名無しさん
09/12/09 13:42:44
個人的には、空の配列に添え字代入のサンプルを書く本はあんまし好きじゃない
せっかくのRubyなんだからもっとコレクションとしての扱い方から見せたほうがいいと思うなあ
cats = []
cats << "Kuro"
cats << "Tama"
cats << "Mike"
cats << "Tora"
p cats
puts cats[1]
cats[1] = "Shiro"
p cats
こっちのほうがきっと驚いてもらえるぞ
「配列ってなんかざくざく入るんだね!」みたいな
86:81
09/12/09 13:43:10
>>83
ありがとうございます
無事Tamaを表示することができました。
87:デフォルトの名無しさん
09/12/09 13:58:35
>>80
うそをいうな。
88:デフォルトの名無しさん
09/12/09 14:02:07
>>87
では真実を
89:デフォルトの名無しさん
09/12/09 14:20:00
Hashed Array = Associative Array = rubyのHash
90:デフォルトの名無しさん
09/12/09 14:20:08
array of hashes じゃないの?
91:デフォルトの名無しさん
09/12/09 14:57:30
array containing hash
92:デフォルトの名無しさん
09/12/09 14:59:57
泣きながらF5連打してたらこまるので
>>84
それが普通の手段
93:デフォルトの名無しさん
09/12/09 15:03:04
>>84,92
1.8.7以降を使ってるなら、__method__で。
94:93
09/12/09 15:04:07
あ、ごめん、見間違えた。
呼び出し元を知るには、当然callerですね。
95:デフォルトの名無しさん
09/12/10 05:12:13
独習Rubyってどうよ?
96:デフォルトの名無しさん
09/12/10 08:41:52
Googったんですけどわかんなかったんで教えてくださいおながいします。
「AはBクラスのインスタンスである」ってのは A === B って書きますが、「AはBクラスの
インスタンスでない」ってのはどう書けばいいでしょうか?
97:デフォルトの名無しさん
09/12/10 09:16:33
=== の否定はないから全体を !
98:デフォルトの名無しさん
09/12/10 09:20:24
> 「AはBクラスのインスタンスである」ってのは A === B って書きますが
いいえ
a.kind_of?(B)
とでも書いてください
特定クラスのインスタンスでないということをチェックしたい場合は
unless a.kind_of?(B)
と書くか、または
if !a.kind_of?(B)
と書きます
99:デフォルトの名無しさん
09/12/10 09:22:57
>>96
A === B というのはA(レシーバ)の持つ===というメソッドに引数としてBを渡すということ(A.===(B)と同じ)
メソッド===はレシーバのクラスによって意味が違う
URLリンク(www.ruby-lang.org)
Classクラス(の親クラスであるModuleクラス)の===メソッドは以下の意味
URLリンク(www.ruby-lang.org)
だから「AはBクラスのインスタンスである」を書くとするならBのメソッドなので B === A としなければならない
目的のはinstance_of?の否定かkind_of?の否定か
URLリンク(www.ruby-lang.org)
100:デフォルトの名無しさん
09/12/10 09:37:35
>>99
初心者に instance_of? を勧めるのは正直あまりお勧めしない
irb> p 12.instance_of?(Integer)
false
irb> p 12.instance_of?(Fixnum)
true
irb> p 10000000000.instance_of?(Fixnum)
false
irb> p 10000000000.instance_of?(Bignum)
true
irb> require 'uri'
irb> p URI.parse("URLリンク(example.com)").instance_of?(URI)
false
irb> p URI.parse("URLリンク(example.com)").instance_of?(URI::HTTP)
true
間違ってないけどー
動作合ってるけどー
でもー
101:96
09/12/10 09:50:45
みなさんありがとう。Googり方が悪いんだよカス!とか言われると思ってました。
102:デフォルトの名無しさん
09/12/10 09:52:57
=== が検索できるようになってたら罵倒されたと思う
103:デフォルトの名無しさん
09/12/10 09:53:39
>>101
いちいちスレあげんなカス!
104:デフォルトの名無しさん
09/12/10 09:57:37
>>65
分かりやすい解説ありがとうございました。
イメージがつきました。
105:デフォルトの名無しさん
09/12/10 14:00:10
>>103
うるせーバカ
106:デフォルトの名無しさん
09/12/10 16:30:19
2chブラウザ使っている人で、スレッドの位置を気にしている人はいるの?
俺は履歴とかブックマークからスレッドにたどり着いているので、板一覧とか
見ていないし、スレッドの位置も特に気にしていない。
そもそも、こういう掲示板のage/sageって自由であるべきで
他人が強制するものではないと思う。
107:デフォルトの名無しさん
09/12/10 19:27:14
aというハッシュのキーにclassがあったらその値に " button"を追加して、なかったら"button"だけ、という記述を
下記のように書いたのですが、
もうちょっといい書き方ないもんでしょうか?
[{}, {:class => "hoge"}].each do |a|
a[:class] = (a[:class] ? a[:class] + " ": "") + "button" #←ここをなんとかしたい
p a
end
108:デフォルトの名無しさん
09/12/10 19:48:10
マジレス
if a[:class]
a[:class] += ": button"
else
a[:class] = "button"
end
ネタレス
a[:class] = [a[:class], "button"].compact.join(": ")
109:デフォルトの名無しさん
09/12/10 21:16:51
デフォルト値が設定されてるとおかしなことになりそうな気が…
110:デフォルトの名無しさん
09/12/10 21:19:23
デフォルト値を設定すること自体がおかしいだろ
111:デフォルトの名無しさん
09/12/10 21:27:35
二時間近く>>108に突っ込む奴がいないわけだが
年末でいつもの人は忙しいのかw
112:デフォルトの名無しさん
09/12/10 21:53:53
デフォルト値は設定しちゃダメなの?
113:デフォルトの名無しさん
09/12/10 23:00:34
配列aとbが対等な関係にある場合に、
a.zip(b)
とするのは対称でなくて見た目が悪いと思うのですが、どう思いますか?
114:デフォルトの名無しさん
09/12/10 23:03:00
それ感じたことがある。けれど代替案が見つからない。
115:デフォルトの名無しさん
09/12/10 23:03:18
別にどうも思いませんが
まあ気になるならArrayクラスのクラスメソッドにでもしてしまうとよろし
Array.zip(a, b) みたいなのなら問題あんめえ
116:デフォルトの名無しさん
09/12/10 23:04:58
>>115
それいいね。それなら、3項間以上でもすっきりかけるね。
117:デフォルトの名無しさん
09/12/10 23:05:20
Array.zip(a, b)
みたいな形だとどう?
118:デフォルトの名無しさん
09/12/10 23:05:42
ついでにEnumeratorを返すようにしてほしいと思いませんか?
119:デフォルトの名無しさん
09/12/10 23:08:22
つーとむしろ
Enumerator.zip(a,b)
なんか変か?
120:デフォルトの名無しさん
09/12/10 23:34:04
>>107
[{}, {:class => "hoge"}].each do |a|
a[:class] &&= a[:class]+" button"
a[:class] ||= "button"
p a
end
[{}, {:class => "hoge"}].each do |a|
begin
a[:class] += " button"
rescue
a[:class] = "button"
end
p a
end
def space_add h,s
return nil if h.nil?
h.replace( h+" "+s )
end
[{}, {:class => "hoge"}].each do |a|
space_add(a[:class],"buttom") || a[:class] = "button"
p a
end
121:デフォルトの名無しさん
09/12/10 23:53:39
>>113
ですが、新しいメソッド付加するほどでもないと思っていたら困ったことに・・・
ちなみに本当にほしいものは、長いほうに合わせて
[[3, 1], [4, 2], [5, 2], [6, 2]]
です。メソッド追加しないと無理ですかね?
################################
irb(main):005:0> a = [1,2]
=> [1, 2]
irb(main):006:0> b = [3,4,5,6]
=> [3, 4, 5, 6]
irb(main):007:0> a.zip(b)
=> [[1, 3], [2, 4]]
irb(main):008:0> b.zip(a)
=> [[3, 1], [4, 2], [5, nil], [6, nil]]
122:デフォルトの名無しさん
09/12/11 00:02:14
追伸:
しかも欲しいものは配列じゃなくてEnumeratorです。
> zip(a,b).each{|e| p e}
[1,3]
[2,4]
[2,5]
[2,6]
みたいに。
123:デフォルトの名無しさん
09/12/11 00:08:32
twitterとかで、投稿時刻を HH:MM:SS ではなく、「約15分前」「約2時間前」というふうに表示してますけど、
これをやってくれるRubyのライブラリはありますか。
ついでにJavaScriptのライブラリもあるとうれしいです。
124:デフォルトの名無しさん
09/12/11 00:35:15
ありません。自分で書いてください。
(Time.now.to_i - time.to_i) を適当に加工したらできるし。
125:デフォルトの名無しさん
09/12/11 00:45:02
railsならdistance_of_time_in_words
126:デフォルトの名無しさん
09/12/11 01:57:30
>>125
>distance_of_time_in_words
Thank you very much!
>>124
F***!
127:デフォルトの名無しさん
09/12/11 06:25:36
RubyはLispの替わりで使えるのか?
128:デフォルトの名無しさん
09/12/11 07:49:58
文法が全然違うからLispのソースはまず動かないよ
129:デフォルトの名無しさん
09/12/11 08:25:43
>>126
Railsならそう言えよ。
130:デフォルトの名無しさん
09/12/11 12:04:28
>>125-126
RailsのActionPackのActionViewっぽいね。これだけ使えないのかな
131:デフォルトの名無しさん
09/12/11 12:27:45
RailsはRailsで
132:デフォルトの名無しさん
09/12/11 13:40:27
>>130
require 'active_support'
require 'action_view/helpers/date_helper'
include ActionView::Helpers::DateHelper
あー、あとI18n関係の設定がいるかな。以外と面倒かも。
133:デフォルトの名無しさん
09/12/11 13:57:40
そもそも単独で使うようにできてないからな
たった一つの処理のために本質でないファイルをウンコのごとく読まなきゃならんし割に合わん
134:デフォルトの名無しさん
09/12/11 14:46:29
>>133
「ウンコのごとく読む」っていう比喩がわかんない。
どんな風に読むことを「ウンコのごとく」って言うの?
135:デフォルトの名無しさん
09/12/11 17:58:38
>>129
Railsだと分かっていたら答えられたとでもいうのかよwwww
136:デフォルトの名無しさん
09/12/11 18:23:13
たぶんYESなんじゃないかな
137:デフォルトの名無しさん
09/12/11 19:21:02
,―ヽ____、―
,/ ノ ヽ ~\
/ ノ Ruby ヽ ~\
/ ノ ヽ、 `ヽ
| ノ / ̄\ / ̄~ヽ ヽ i
| ノ | ノ
\ | <●> <●> ( )
\ | | | i /
| / ヽ レ
i (●_●) /
i、 ,-―-、 ・ /
i、 <(EEEEE)> ∵/ 楽しいプログラミング言語はIPA Rubyだけ
i、 \___/ _/
\ ,ノ
,,.....イ.ヽヽ、ー-―一ノ゙-、.
: | '; \_____ ノ.| ヽ i
| \/゙(__)\,| i |
> ヽ. ハ | ||
138:デフォルトの名無しさん
09/12/11 21:48:40
モジュールの定義の有無を確認する方法ってありますか?
method_defined?のモジュール版みたいなのを探しているのですが・・・
139:デフォルトの名無しさん
09/12/11 21:57:29
>>138
require 'net/http'
Object.const_defined?(:Net) #=> true
Net.const_defined?(:HTTP) #=> true
140:デフォルトの名無しさん
09/12/12 23:46:17
メソッド中で変数を書き換えられる場合と書き換えられない場合の区別がいまだに分からないのですが、
X=[1,2,3]
def f X[1]=4 end
大文字(const配列?)のくせにこれは書き換え成功する。
x = 1
def g x=2 end
これはスコープ内で局所変数と解釈されて、書き換えられない。
Y=1
def h Y=2 end
これは定数書き換えが不正と解釈されて通らない。
h()は仕方ないとしても、g()と同じ動作は欲しいので、どう実現すればいいか教えてください。
ポインタっぽいのがあると一番いいのですが・・・。
141:デフォルトの名無しさん
09/12/12 23:49:33
>>140
>X=[1,2,3]
>def f X[1]=4 end
>大文字(const配列?)のくせにこれは書き換え成功する。
前後にX.object_idを表示してみると、「同じオブジェクト」を
指したままであることが確認できるはず。
配列のような内部に状態を持つオブジェクトの状態を変更することは
定数という観点でいうと「書き換え」ではない。
>x = 1
>def g x=2 end
>これはスコープ内で局所変数と解釈されて、書き換えられない。
>h()は仕方ないとしても、g()と同じ動作は欲しいので、どう実現すればいいか教えてください。
>ポインタっぽいのがあると一番いいのですが・・・。
オブジェクトと変数の区別を理解してから出直しておいで。
142:デフォルトの名無しさん
09/12/13 00:07:05
返信ありがとうございます。
オブジェクトと変数の区別があるのは分かりますが、
X = Integer(1)
と
Y = [1,2,3]
はどちらも
定数=「オブジェクトのインスタンス」
に見えるのですが。
143:デフォルトの名無しさん
09/12/13 00:12:11
irb(main):001:0> CONS = [0, 1, 2]
=> [0, 1, 2]
irb(main):002:0> CONS = ["A", "B", "C"]
(irb):2: warning: already initialized constant CONS
=> ["A", "B", "C"]
144:デフォルトの名無しさん
09/12/13 00:12:28
定数は参照の付け替えが出来ないだけで
参照先のオブジェクトが内部状態を変えることには関知しない
145:デフォルトの名無しさん
09/12/13 00:18:59
では
class Integer
def f
self = 8
end
end
X = Integer(3)
X.f()
p X
みたいな感じで内部状態を変えることは原理的には可能でしょうか?
146:デフォルトの名無しさん
09/12/13 00:23:02
>>145
オブジェクトと変数の区別を理解してから出直しておいで。
147:デフォルトの名無しさん
09/12/13 00:25:02
いや、もちろん
@なんとか=8
でしょうけど。
148:デフォルトの名無しさん
09/12/13 00:29:09
オブジェクトと変数の区別を理解したいので
質問を続けます。
149:デフォルトの名無しさん
09/12/13 00:29:25
>>145
Integerのような組み込みのクラスだとそれできないから、i++とかインクリメンタル演算子が実装できないんだよね・・・
150:デフォルトの名無しさん
09/12/13 00:31:32
>>149
selfを変更できるクラスはRubyにはないぞ
データ格納領域がRuby的に保護されてて触れない
151:デフォルトの名無しさん
09/12/13 00:36:43
selfはたんに気分で書いてしまったので気にしないでください。
(私のミスです)
自分で定義したクラスなら
class MyInt
def initialize(i)
@i=i
end
def ++() # 前置演算子の定義の仕方はしらないですが・・・
@i+=1
end
end
でいいわけですよね。
152:デフォルトの名無しさん
09/12/13 00:36:49
もとのxの件はオブジェクトと変数の違いではなく
ローカル変数のスコープの問題だねえ。
153:デフォルトの名無しさん
09/12/13 00:38:42
>>152
そうですね。本当はそれが知りたかったわけですが・・・。
グローバル変数にすればいいんだけど、なんか気持ち悪い。
154:デフォルトの名無しさん
09/12/13 00:41:31
なんか引数で参照渡して、それを書き換えればいいんだよ〜
みたいなのはないんでしょうか?
・・・たぶんないんでしょうね
155:デフォルトの名無しさん
09/12/13 00:44:42
引数で渡していいならArrayみたいな内部状態を持つオブジェクトに包んで
渡すくらいかね。
156:デフォルトの名無しさん
09/12/13 00:48:32
初心者なんで間違っているかもだけど、参照渡しだから引数に渡された
オブジェクト自体を書き換えることはできるよね?
def method(str) {str.gsub! /a/, '!'}
x = "katakana"
puts x #=> "katakana"
method x
puts x #=> "k!t!k!n!"
157:デフォルトの名無しさん
09/12/13 00:48:47
やっぱそれですか。
議論によって問題の所在がはっきりしてきました。
おつきあいありがとうございます。
158:デフォルトの名無しさん
09/12/13 00:51:40
>>156
それはたぶん文字の配列わたしてるですね。
159:デフォルトの名無しさん
09/12/13 00:53:10
えっ?
160:デフォルトの名無しさん
09/12/13 00:53:23
そうだ、eval使おうか(笑)!
161:156
09/12/13 00:54:39
>>158
Ruby のStringオブジェクトの内部ってArrayで表現されていたんですか?
知りませんでした。><
C言語みたいですね。
162:デフォルトの名無しさん
09/12/13 00:56:25
158ですが、私も初心者なので、フォローお願いします。
普通の言語なら文字列の扱いはそうなってるんじゃないかなぁ?
163:デフォルトの名無しさん
09/12/13 01:06:12
何の意味があるか分からない思いつきだけど通りました。
X='12'
def f
X.gsub!('12','2')
end
f()
p eval(X)
164:デフォルトの名無しさん
09/12/13 01:22:35
>>162
文字列がイミュータブル(変更不可)な言語は普通にあるよ
Pythonなんかもそう
>>> s = 'abc'
>>> s[0] = 'A'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
上のごちゃっとしたところをまとめると
* 変数はオブジェクトに付けられた矢印(あるいはラベル)。例: a = [1,2,3]
* 変数を通じてオブジェクトを操作することが出来る。例: a[0], a[1]
* Rubyの文字列はミュータブル(変更可能)なので
変数が指すオブジェクトの中身を書き換えることができる。例: a[1] = 20 # [1,20,3]
165:156
09/12/13 01:24:26
>>162
自分なりに調べてみました。
def method(obj)
obj.object_id
end
str = "katakana"
p str.object_id #=> 69877275538400
p method str #=> 69877275538400
この結果から分かりますが、上記の変数 str と obj は同一のオブジェクトを指しています。
したがって、変数 obj に対して破壊的なメソッド(オブジェクト自体を変更するメソッド)を使うと
str が指しているオブジェクトも同一ですから、objに対して行った操作が反映されている、というわけですね。
あってますか?
あと、Stringオブジェクトの内部表現については詳しくしりません。
Rubyのソースを読んでみればわかると思うのですが、まだそこまでのレベルではないので...
スレ汚し失礼しましたです。
166:164
09/12/13 01:27:10
例が文字列じゃなく配列になってた。それぞれ以下に読み替えて
例: s = '123' # sは文字列 '123' を指す
例: s[0], s[1] # sの一文字(バイト)目と二文字目を取得
例: s[1] = '5' # sの一文字目を '5' に変更
>>165
あってるお
内部表現なんて実装次第なんだから
出来ることを正確に把握するほうが大切
167:デフォルトの名無しさん
09/12/13 01:32:12
カビの生えた例だけどこんなのも貼っとく
a = [0, 1, 2]
b = a
b[1] = 10
これでaが何になるのかわからなかった人は横着しないで入門書嫁
168:140
09/12/13 08:24:28
昨日の者ですが、
結局クラスでラップする感じになるのかなぁ。
下は意図した通りに動きます。
def State(val)
Monad.new(val)
end
class Monad
def initialize(val)
@val=val
end
attr_accessor :val
end
def f(st)
st.val += 1
end
X = State 1
f(X)
p X.val
169:140
09/12/13 08:30:00
なるほどRubyって関数型言語だったのか!
170:デフォルトの名無しさん
09/12/13 08:33:09
Dir.globが探索するファイル/ディレクトリの条件って何ですか?
i=0
Dir.chdir("C:\\"){Dir.glob('**/*'){i+=1}}
p i
=>150660
dir c:\ /s /b /a|find /c /v ""
=>154483
C:\の全ファイルを選択→プロパティのファイル数+フォルダ数
=>153390
1〜2違うどころではないんだが・・・('A`)
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5387日前に更新/233 KB
担当:undef