[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 23:56 / Filesize : 233 KB / Number-of Response : 880
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 33



1 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:21:25 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
   (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に完全対応していないためです。)
 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 を習得すれば将来スムーズに 1.9 系に移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/
 ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

8 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 15:46:49 ]
おまけ

・Rubygem 0.x
 極悪動作をすることで有名なRuby外部ライブラリ利用サポートプログラム群のバージョン
 このバージョンしかパッケージが存在しないUNIX系ディストリビューションがあって結構問題に
 しかも「rubygem本体の自己更新機能は殺してるのでパッケージから入れてね」とかほざきやがる
 パッケージがバージョン 1 より前のものしかない場合はソースからインストールするとよい
 Rubygem は 1.0 も 1.1 も 1.2 も肝心なとこにバグ持ちなので極力 1.3 などの最新を使うこと

9 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 15:51:54 ]
>>8
Ubuntu 9.xxでもaptで入れるとbinにパス通ってなかったり、どうしてこうなった?なことになってる
謎過ぎる。

10 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 16:02:10 ]
>>9
pkg-ruby-extras.alioth.debian.org/index.html
このへん? よく読んでないけど。


11 名前:デフォルトの名無しさん [2009/12/05(土) 17:32:12 ]
a = 82.30
b = 80.20

print a - b, "\n" ←こうやると誤差がでますが

printf("%.2f\n", a - b) ←修正はこれでいいですか?もっといい方法あります?

12 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 18:17:21 ]
>>12
なるほど。BigDecimalですか。
そっちの方が推奨されるやり方なんでしょうか?

例えば以下の様な方法だと何か問題はありますか?

a = 82.30
b = 80.20
c = nil

c = sprintf("%.2f", a - b).to_f

14 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 19:00:05 ]
>>13
それで問題があるかどうかはその数値の使われ方を知っている君が知ってるはず

15 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 20:02:12 ]
>>14
という事は単純な桁数指定と切り上げ処理に限っていえば
この方法でも問題ないという事ですね?

16 名前:デフォルトの名無しさん [2009/12/06(日) 01:38:06 ]
character = Array.new
character << {alph => "a", hiragana => "あ"}

上記のようなコードを書いた後に、katakana => "ア" を、
配列 character の中のハッシュの末尾に追加するには、どうすればよいでしょう
character[[alph => "a", kana => "あ",        ]]
                   ^^^^^^^^^^^^^^^
                   ここに katakana => "ア" を追加したい。



17 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 01:46:15 ]
>>16
alphaとかhiraganaというのはローカル変数なのか、
シンボルの記述ミスなのか
# あまり本質的ではないけど一応確認。

character[-1].update(katakana => 'ア')

character[-1]で配列の最後の要素にアクセスできる。
返ってくるのは該当要素それ自体(コピーではなく)
これに破壊的メソッドを作用させればよい。

これ、ハッシュの「最後」に追加されるかどうかはバージョンによる。
MRIの1.9ではキーの追加順になるけど、ハッシュの本義に照らせば
どこに追加されるかは仮定できない。


18 名前:デフォルトの名無しさん [2009/12/06(日) 01:53:27 ]
>>17
> alphaとかhiraganaというのはローカル変数なのか、
> シンボルの記述ミスなのか

記述ミスです。。。

ありがとうございます!できました。

19 名前:デフォルトの名無しさん [2009/12/06(日) 02:19:04 ]
なにこのキモいスレ

20 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 08:05:03 ]
YARVの1.9からはハッシュの順番が保証されてるんだっけ?

21 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 08:12:15 ]
なんか微妙な表現だがおおむねYESだ
それがなくなることもない

22 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 16:11:36 ]
速くしたいなら速いほうで書けばいいじゃん

24 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 18:27:10 ]
>>23
真理だな

25 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 18:31:49 ]
(キリッ

26 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 19:42:32 ]
>>22
injectは遅いし分かりにくいので、使わずに済むなら使わない方がいいと思う。
1.9にしたらけっこう速くなるけど。



27 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 21:53:15 ]
分かりにくいんじゃなくて、慣れていないだけでは。
なれれば、すぐ読めるよ。

injectは式一個でかけるし、メソッドチェーンも作れるってのがいいんじゃないかな。

28 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 23:02:50 ]
なんだかパッとしないな < each_with_object

32 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 00:00:35 ]
hs = (0..5).map do |n| (0..5).map do |m| 0 end end
二次元配列を生成する方法にこんなものを知ったんですが
もっと短くかけないんでしょうか?

33 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 00:04:21 ]
多次元配列というものは Ruby にはそもそもない
つまり、ネストした配列で代用するしかない

map でもいいんじゃね

34 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 02:49:23 ]
>>33-34
そうですかぁ
残念です



37 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 02:53:32 ]
>>35
× a2.map{|e|e.map{e.object_id}}
○ a2.map{|e| e.map{|e| e.object_id}}

38 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 03:01:59 ]
把握

39 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 05:06:06 ]
こう?

s = "aaa bbb ccc:ddd eee"
t = s.gsub!(/ccc:(\S+)/, '') ? $~[1] : ''


41 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 05:12:15 ]
>>40
ここで $1 ではなく $~[1] を使う理由はある?

43 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 10:18:05 ]
というか特段二度手間でもない
簡潔でわかりやすくていいじゃん

44 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 11:08:35 ]
attr_* をそのままライブラリ外に公開する理由ってたいていの場合薄いよね?

45 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 19:14:47 ]
ttp://itpro.nikkeibp.co.jp/article/Interview/20090106/322300/
今年はじめのこんな記事を見つけたんだけど、仕様書草案ってもうどこかで見られる?

48 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 19:19:46 ]
RubySpecかな

49 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 19:31:48 ]
>>47

Rubyについて Part 38
pc12.2ch.net/test/read.cgi/tech/1257079004/

261 名前: デフォルトの名無しさん Mail: sage 投稿日: 2009/12/01(火) 19:36:45
ruby-std.netlab.jp/


50 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 19:39:59 ]
ddd! ありがとうございます!

51 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 21:34:59 ]
Rubyのテスト用フレームワークっていくつかあるみたいですが何がいいでしょうか?
場合による、という結論かもしれませんが
みなさんは何を使ってますか?

52 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 21:45:45 ]
目的によるし、おおむね目的ごとに分かれてると思う
自分で使ってテストの方向性に合うものを選択するといい
テストフレームワークを1種類しか使えない、という人は少ない

よーわからんがテストってあると便利そうじゃね、というのなら RSpec から始めるといいんじゃね

53 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:19:44 ]
よーわからんがテストってあると便利そうじゃね、というレベルなら、
標準添付のtest/unitがいいんじゃね

54 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:34:53 ]
テストっちゃ、「ファイルに保存されたかどうか」のテストってどうやるん

55 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:44:51 ]
>>52-53
アドバイスありがとうございます
そうですね、もう少し調べたりいろいろ使ってみて決めたいと思います

56 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:47:08 ]
・ 書き出し先ファイルがあれば削除
・ ファイル保存を含んだメソッドを実行
・ 例外が起こらないことをテスト
・ ファイルの中身が期待通りであることをテスト
・ 書き出し先ファイルがあれば削除

書き出すファイルを削除できないという場合は知らん
「きっと保存されるはず」みたいなテストするしかなくね



57 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 03:20:32 ]
最終手段的には、事前にFile.openやFile#writeをフックとか・・・

58 名前:デフォルトの名無しさん [2009/12/08(火) 11:45:06 ]
FTPでディレクトリの更新日時が知りたいのですが取れません
一般的に、FTPではLSコマンドの結果を解釈するしかないのでしょうか?
(net/ftpを利用してます)

59 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 11:55:44 ]
MLSDとか送ればいいんじゃないの

60 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 13:17:10 ]
>>58
一般には自力で解析するしかない。
MDTMというコマンドもあるがすべてのftpサーバが実装しているわけではない。


61 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 16:17:20 ]
JRubyとRubyの違いについて調べてみたのですが、
いまいちわからなかったのでここで質問してみます。
JRubyはコーディングの仕方が、Rubyと同じなだけであり、
それ以外の部分は全く別なものという解釈でいいのかな?

根本は全く違うものではあるが、コードレベルでは
同じ内容で動くものなので、移植する場合は、
コードのコピペでおk・・・かな?

64 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 17:29:49 ]
>>59, 60
ありがとうございました

65 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 06:11:28 ]
      ,―ヽ____、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/    まピョーん☆ IPA Rubyをこれからもよろしく
      i、   \___/  _/
       \       ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
      >   ヽ. ハ  |   ||



67 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 10:43:59 ]
おまえら1.9.1更新しろー
ttp://sourceforge.jp/magazine/09/12/08/1011230
と思ったがインストーラつきを公開してる人はまだいないのね

68 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 10:47:19 ]
みんなに広まってからアップグレードする
どうせチェックにしか使ってないし、自分だけ「みんなと違って最新」だと意味ないし

69 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:01:47 ]
>>68
安心しろ
1.9.1を普段使ってる奴は普通にアップグレードするし、
1.9.1を自分のスクリプト用のチェックにしか使ってない奴は
「この人のスクリプト俺の1.9.1-p0(しかもmswin32)だと動かないんすけどー」とか言ってきたりはしない
とっととアップグレードすれ

70 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:14:16 ]
head使いには関係ないしな。


71 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:19:29 ]
というか、パッチレベル0を鬱陶しいと思ってる人にこそ、
「1.9.1は最新版でしかチェックしてません」と公言するのをお勧め
そうしないといつまでたってもだらだら残るぞ
自分のサイトに最新版へのリンクでも張っとけ

72 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:25:34 ]
~/work/source/ruby-1.9.1-p243$ make uninstall
make: *** ターゲット `uninstall' を make するルールがありません. 中止.

ぬう
てか前回のconfigureにどんなオプションつけたか忘れたしどこにインストールされたか調べるのめどい

73 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:45:58 ]
「引数はHashの入ったArrayにしろ」って英語の警告でどう言えばいい?

74 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:54:23 ]
raise ArgumentError, "invalid argument, RTFM"

75 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:12:55 ]
ArgumentError を出したなら「引数が不正です」は言う必要なくね

76 名前:デフォルトの名無しさん [2009/12/09(水) 12:35:33 ]
>>73
スレ違い。 このへんで聞け。
pc12.2ch.net/test/read.cgi/tech/1193554741/



77 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:37:03 ]
URLを間違えた。こっちだ。
pc12.2ch.net/test/read.cgi/tech/1224696505/

78 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:44:01 ]
>>73
Hashを要素にしたArrayって英語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど

79 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:45:27 ]
>>78
Hashを要素にしたArrayって日本語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど


80 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:55:43 ]
>>78
Hashed Array

81 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/12/09(水) 13:28:11 ]
>n cats = [] = 1
>^
スペースが省略されて「^」の位置がずれてしまいました
「^」は=と1の間にあるスペース部分を指しています

83 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/12/09(水) 13:38:25 ]
質問
メソッドの中から、そのメソッドを呼び出しているメソッドの名前を知りたいのですが、
Kernel#caller以外の方法はありますか?

現在、caller が返す配列の中身に大してパターンマッチングを行って
メソッド名を切り出しているのですが、もっとよい方法がありそうな気がしまして

85 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/12/09(水) 13:43:10 ]
>>83
ありがとうございます
無事Tamaを表示することができました。



87 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 13:58:35 ]
>>80
うそをいうな。

88 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:02:07 ]
>>87
では真実を

89 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:20:00 ]
Hashed Array = Associative Array = rubyのHash

90 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:20:08 ]
array of hashes じゃないの?

91 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:57:30 ]
array containing hash

92 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:59:57 ]
泣きながらF5連打してたらこまるので

>>84
それが普通の手段

93 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 15:03:04 ]
>>84,92
1.8.7以降を使ってるなら、__method__で。

94 名前:93 mailto:sage [2009/12/09(水) 15:04:07 ]
あ、ごめん、見間違えた。
呼び出し元を知るには、当然callerですね。

95 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 05:12:13 ]
独習Rubyってどうよ?

96 名前:デフォルトの名無しさん [2009/12/10(木) 08:41:52 ]
Googったんですけどわかんなかったんで教えてくださいおながいします。

「AはBクラスのインスタンスである」ってのは A === B って書きますが、「AはBクラスの
インスタンスでない」ってのはどう書けばいいでしょうか?



97 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:16:33 ]
=== の否定はないから全体を !

98 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:20:24 ]
> 「AはBクラスのインスタンスである」ってのは A === B って書きますが
いいえ

a.kind_of?(B)

とでも書いてください
特定クラスのインスタンスでないということをチェックしたい場合は

unless a.kind_of?(B)

と書くか、または

if !a.kind_of?(B)

と書きます

99 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:22:57 ]
>>96
A === B というのはA(レシーバ)の持つ===というメソッドに引数としてBを渡すということ(A.===(B)と同じ)
メソッド===はレシーバのクラスによって意味が違う
ttp://www.ruby-lang.org/ja/man/html/Object.html#self.3d.3d.3d

Classクラス(の親クラスであるModuleクラス)の===メソッドは以下の意味
ttp://www.ruby-lang.org/ja/man/html/Module.html#self.20.3d.3d.3d.20obj

だから「AはBクラスのインスタンスである」を書くとするならBのメソッドなので B === A としなければならない

目的のはinstance_of?の否定かkind_of?の否定か
ttp://www.ruby-lang.org/ja/man/html/Object.html#instance_of.3f



100 名前:デフォルトの名無しさん mailto:sage [2009/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("example.com/").instance_of?(URI)
false
irb> p URI.parse("example.com/").instance_of?(URI::HTTP)
true

間違ってないけどー
動作合ってるけどー
でもー

101 名前:96 [2009/12/10(木) 09:50:45 ]
みなさんありがとう。Googり方が悪いんだよカス!とか言われると思ってました。

102 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:52:57 ]
=== が検索できるようになってたら罵倒されたと思う

103 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:53:39 ]
>>101
いちいちスレあげんなカス!

104 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:57:37 ]
>>65
分かりやすい解説ありがとうございました。
イメージがつきました。

105 名前:デフォルトの名無しさん [2009/12/10(木) 14:00:10 ]
>>103
うるせーバカ

106 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 16:30:19 ]
2chブラウザ使っている人で、スレッドの位置を気にしている人はいるの?
俺は履歴とかブックマークからスレッドにたどり着いているので、板一覧とか
見ていないし、スレッドの位置も特に気にしていない。

そもそも、こういう掲示板のage/sageって自由であるべきで
他人が強制するものではないと思う。



107 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 19:48:10 ]
マジレス
if a[:class]
 a[:class] += ": button"
else
 a[:class] = "button"
end

ネタレス
a[:class] = [a[:class], "button"].compact.join(": ")






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<233KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef