Ruby 初心者スレッド Part 33at TECH
Ruby 初心者スレッド Part 33 - 暇つぶし2ch1:デフォルトの名無しさん
09/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つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す URLリンク(www.ruby-lang.org)
 ・FAQを一応読む URLリンク(www.ruby-lang.org)
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

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

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
㌧㌧㌧! ありがとうございます!

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`)

171:デフォルトの名無しさん
09/12/13 09:22:12
>>170
DOSのコマンドを知らないから憶測だけど、
"."と".."を含めてる含めてないとか?

172:デフォルトの名無しさん
09/12/13 09:40:23
>>170
日本語ファイル名が膨らまれているとか

173:デフォルトの名無しさん
09/12/13 11:00:49
るびまのページいま停止中?

174:デフォルトの名無しさん
09/12/13 11:22:02




175:デフォルトの名無しさん
09/12/13 11:44:38
p "あ"

とすると、

"\202\240"

8進数で返ってくるのでわかりにくいです。
16進数で帰ってきて欲しいのですが、どうすればいいのでしょうか?

176:デフォルトの名無しさん
09/12/13 12:05:56
String#inspect の定義を変更すれば良い。
class String; def inspect; "\""+ self.each_byte.map{|c| "\\x%02x" % c }.join + "\""; end; end

177:デフォルトの名無しさん
09/12/13 12:15:41
0x20...0x80はそのままにした方が目に優しそうだ
あと?\と?"は別扱いでとか考え出したら面倒くせええ

178:デフォルトの名無しさん
09/12/13 12:17:32
>>176
それ、他のオブジェクトをinspectするときに影響が出ちゃわない?

179:デフォルトの名無しさん
09/12/13 13:03:51
8進表記されてるのだけ、16進に直すのはどう?

class String
 alias _inspect inspect

 def inspect
  self._inspect.gsub(/\\(\d+)/){ "\\x{%02x}" % $1.oct }
 end
end

180:デフォルトの名無しさん
09/12/13 13:06:37
文字列を16進表記にする関数的メソッドを定義するべきだと思うなあ

181:デフォルトの名無しさん
09/12/13 13:40:29
直前の式の返り血が入ってる組み込み変数とかってないですか?
Rubyを関数電卓代わりに使いたいんですけど

182:デフォルトの名無しさん
09/12/13 13:44:29
>>181
irb でよければ _ だと思う

183:デフォルトの名無しさん
09/12/13 13:44:54
>>181
irb

irb> 1+2
3
irb> _ +4
7

まあ返り値ならなんでもいいんだけど

irb> Time.now
Sun Dec 13 13:40:19 +0900 2009
irb> _.year
2009

184:デフォルトの名無しさん
09/12/13 13:48:02
ありがとうございます
できればirbじゃなくても使いたいんですが無いですか

185:デフォルトの名無しさん
09/12/13 13:52:21
関数の戻り値は最後の参照みてるんだし
@かなにかに保持してくれるといいと祈り続けて早10年

186:デフォルトの名無しさん
09/12/13 14:08:15
>>179
俺もそれ考えたけど"\\1000"とかで困る

187:デフォルトの名無しさん
09/12/13 15:24:26
>>180
こうするのが一般的?

p "あ".unpack("H*")

188:デフォルトの名無しさん
09/12/13 18:12:58
PHPのcall_user_funcにあたる機能はRubyでも実現できますか?
実行時に呼び出すメソッドを切り替えたいのです。

189:デフォルトの名無しさん
09/12/13 18:15:34
>>188
send, evalなど

190:デフォルトの名無しさん
09/12/13 18:24:48
>>188
ありがとうございます。

191:デフォルトの名無しさん
09/12/13 18:25:33
間違えた…>>189でした

192:デフォルトの名無しさん
09/12/13 18:49:28
異なる文字コードの文字列を同時に出力するとかじゃない限り
適切に漢字コードを指定しておけばちゃんと日本語表示されるんじゃないの?
$KCODE = 'S'
p "あ"
> "あ"

文字じゃないバイナリ列とか表示させるときに16進文字列がいいのなら
そういう出力メソッドを作るなりすれば


193:デフォルトの名無しさん
09/12/13 19:07:54
1.9 なら encoding を文字列が持ってるからできるが、1.8 なら無理だね。
あと $KCODE は 1.9 じゃ廃止だ


194:デフォルトの名無しさん
09/12/14 01:00:47
module Hoge
def f1 end
def f2 end
・・・ってかんじでメソッドがたくさんあったときに
module_function :f1,:f2,...
って全部書くしか、外からアクセスする方法はないでしょうか?
end

195:デフォルトの名無しさん
09/12/14 01:05:21
include Hoge で f1 や f2 を取り込めるよ

196:デフォルトの名無しさん
09/12/14 01:12:46
名前空間は汚染したくないので
Hoge::f1
というアクセスだけ許したいのですが・・・
いちいち書くのは保守が面倒だと思ったので。

いま考えてるのは
module_function self.methods.join(' ') #未完成
みたいな怪しい方法です。

197:デフォルトの名無しさん
09/12/14 01:20:55
module M
def m1; "m1"; end
extend M
end
M.m1 #=> "m1"

198:デフォルトの名無しさん
09/12/14 01:22:36
どんぴしゃです!
ありがとうございます。

199:デフォルトの名無しさん
09/12/14 05:51:45
メイン関数は書いた方が良いのでしょうか?

200:デフォルトの名無しさん
09/12/14 06:07:46
>>198
リファレンスより
If used with no arguments,
subsequently defined methods become module functions.

モジュール定義の頭に module_function と引数なしで書いておけば
以後に定義するメソッドにはすべて module_function が適用される。

public, private とかと同じだよ。

201:デフォルトの名無しさん
09/12/14 06:28:54
>>199
メイン関数って
スクリプトを実行した時に処理系が最初に呼び出すメソッド、という意味?

そういう意味なら、書けない、でFA
そんな取り決めないし

202:デフォルトの名無しさん
09/12/14 07:36:02
>>199
def main() しとけばRubyがエントリポイントとして呼んでくれる、とかいうことはないよ
ただ if __FILE__ == $0 ... って常套句を使って少し似たようなことはできる

203:デフォルトの名無しさん
09/12/14 08:32:24
>>199
ruby -e 'p self'

204:デフォルトの名無しさん
09/12/14 08:53:07
俺最初なんとなくmainてメソッド書いて
if __FILE__ == $0
main
end
って書いてたな

205:デフォルトの名無しさん
09/12/14 11:18:57
>>200
これでもいいなぁ。
URLリンク(ruby-doc.org)
ですね。

初心者はドキュメントのどこを見ればいいかも分からないので、とても助かります。

206:デフォルトの名無しさん
09/12/14 11:43:32
>>199
いろんなソース読んだ限り、
Rubyではこんな感じで書いている人が多い。俺も習ってる

class Application
  def initialize
  end
  def run
    # ここにメイン処理
  end
end

if __FILE__ == $0
  Application.new.run
end

207:デフォルトの名無しさん
09/12/14 13:15:18
待て、$0って廃止予定じゃなかったか

208:デフォルトの名無しさん
09/12/14 13:29:31
心配なら$PROGRAM_NAMEを使っておけ。


209:デフォルトの名無しさん
09/12/14 13:30:08
あと10年は1.8使い続けるから無問題

210:デフォルトの名無しさん
09/12/14 13:33:57
まあ、$0 が動かなくなる頃にはそのスクリプト本体もどっか手入れしないと動作しないとは思う
そのときにその人に直してもらうことにして $0 は使ってもよし
$PROGRAM_NAME はバージョンによらず使えるんだっけ?

211:デフォルトの名無しさん
09/12/14 13:38:35
質問が有ります。

引数があれば引数で指定したファイルに
引数がなければ標準出力(もしくはエラー出力)に文字列を出したい場合はどのように書いたものでしょうか?

212:デフォルトの名無しさん
09/12/14 13:46:34
そのまんま if とかで書けばいいと思うよ!

213:デフォルトの名無しさん
09/12/14 13:48:20
if (ARGV[0])
$stdout = File.open ARGV[0]
end

こんな感じニカ ?

214:デフォルトの名無しさん
09/12/14 13:51:15
こんな感じか
if ARGV.length > 0
   f = open(ARGV[0], "w")
else
   f = $stdout
end
f.write "hello"


215:デフォルトの名無しさん
09/12/14 13:52:13
>>211
def output
 if filename = ARGV[0]
  File.open(filename, "w"){|f| yield f }
 else
  yield $stdout
 end
end
output{|io| io.write "a"}

closeめんどくせえ

216:デフォルトの名無しさん
09/12/14 13:55:43
> closeめんどくせえ
うむ
$stdout.close がIOError で拒否られたときは軽く眩暈がした

217:デフォルトの名無しさん
09/12/14 17:25:48
>>211
個々のプログラムでそういうことをするより
シェルのリダイレクトやパイプを使いなさいと言いたいのだが

出力先をプログラムの引数として受け取らなければならない理由はなんだろう?

218:デフォルトの名無しさん
09/12/14 18:09:37
STDOUT にログ出力をするタイプのプログラムはたいてい引数指定
たとえば wget

219:211
09/12/14 19:36:53
>>212-215
ありがとうございます、ありがとうございます
いろいろ方法ありますね。

>>217
事の発端は、最初は標準出力に出してリダイレクト(?でしたっけ)でファイルに書いていたのですが、
ファイルには出したくないBenchmarkとかで計測した結果も表示したくなってそうすると、
どうしたものかって感じになりました。

こういう時って計測結果などはエラーに出せばいいもんですかね?エラーに出していいものかどうか。

>>218
wgetは引数でファイル指定でしたっけ

220:デフォルトの名無しさん
09/12/14 20:14:48
wget -O

221:デフォルトの名無しさん
09/12/14 20:19:22
質問です。

時間の計算するにはどのクラスを使えばいいでしょうか?
具体的には時間の差分を加算したりしたいのです。

例えば、
elapsed_time += Time.local(2008,12,14,1,50,10) - Time.local(2008,12,10,1,50,10)
のような感じ(実際にはTime.localの中身は可変)

elapsed_timeをTimeにする場合だと初期化にTime.at(0)しても Thu Jan 01 09:00:00 0900 1970 になったり、
0からの時間を考えられていないようなのです。

222:デフォルトの名無しさん
09/12/14 20:24:17
>>221
基本的には「ない」
61s が 1m1s になるような、秒数のみを表すクラスというようなのは標準では存在しない

223:デフォルトの名無しさん
09/12/14 20:25:23
>>221
Time.at(0).to_i

224:デフォルトの名無しさん
09/12/14 20:26:07
>>222
そういうことか、>>223は忘れて

225:221
09/12/14 20:35:18
ありがとうです

ないですかー。
何が困るかというと、加算した差分の時間を例えば書式で出力するときにstrftimeみたいなのを自前で書かないといけないってことですよね。

誰かそういうの作ってないか探してみたんですがどうも無いようで・・・。
active_supportとかの日付の拡張あたりでなんとかならないもんですかね。

226:デフォルトの名無しさん
09/12/14 20:49:16
time = 100000
sec = time % 60
min = (time / 60) % 60
hour = (time / (60 * 60)) % 24
day = time / (24 * 60 * 60)
puts "%dday %d:%d:%d" % [day, hour, min, sec]

こんなんでいいか?

227:221
09/12/14 21:01:02
>>226
ずばりそのまま書いてくださってありがとうさんです。

使わせていだきます。
ActiveSupport使ってもこんな感じですか。かわらないやw

time = 100000
sec = time % 60
min = (time / 1.minute) % 60
hour = (time / 1.hour) % 24
day = time / 1.day
puts "%dday %d:%d:%d" % [day, hour, min, sec]

228:デフォルトの名無しさん
09/12/14 22:30:38
二年ほど前にdevでTimeSpanというクラスが提案されたことはあるみたいだねー。
立ち消えしてるのかな、これは。


229:デフォルトの名無しさん
09/12/14 22:34:40
.NETからそのままいろんなクラスパクってくりゃいいのに

230:デフォルトの名無しさん
09/12/14 22:36:53
やだあんな使いにくいAPI
.NET好きな人はIronRuby使ったらいい

231:デフォルトの名無しさん
09/12/15 00:52:12
数値積分や微分できるようなライブラリとかってないですか?
Rubyを関数電卓代わりに使いたいんですけど

232:デフォルトの名無しさん
09/12/15 00:58:10
パッチレベル上がったのにmingwでmake通らん

233:デフォルトの名無しさん
09/12/15 01:01:41
>>231
よくわからんけど「Ruby 数値積分 微分」でぐぐってみた
URLリンク(jp.rubyist.net)
こっちは結構すごそうだぞ
URLリンク(blade.nagaokaut.ac.jp)

234:デフォルトの名無しさん
09/12/15 01:01:55
GSL(GNU Scientific Library)のRubyバインドがあるようだ。
詳しくは見ていないけど、数値積分や微分はあるみたい。
ただし、最後のリリースが約2年前というのが気掛かり。
十分枯れているのだろうけれど、新しめのRubyで動くかは不明。

ところで、本格的な数式処理なら、Maximaとか使ったほうがいいんじゃない?


235:デフォルトの名無しさん
09/12/15 01:05:33
かぶりんこ。


236:デフォルトの名無しさん
09/12/15 01:43:08
ありがとうございます
導入めんどくさそうですけど頑張ってみます

237:デフォルトの名無しさん
09/12/15 02:03:40
数値積分や微分できるような関数電卓を持っていたら、それを使う。
でなければ、カシオの計算センターとか。
自前のコードからコールしたいなら、ついでにそっちも自分で書いてしまう。
てのは、いかがでしょう。

238:デフォルトの名無しさん
09/12/15 06:35:31
>>219
> ファイルには出したくないBenchmarkとかで計測した結果も表示したくなって

標準ライブラリの Logger を使ってみるというのは?
URLリンク(jp.rubyist.net)

239:デフォルトの名無しさん
09/12/15 09:20:54
いわゆる数値計算には向かないよね、Ruby

240:デフォルトの名無しさん
09/12/15 09:53:38
しかし、「5分で作って5秒で実行させる」ような、「計算機なんだから計算できてもいいんじゃね」という
カジュアルなデータ計算をさせることが期待されるプログラミング言語のトップグループにいることは間違いない
専門数値計算ソフトやC(やJava)を持ち出さなくてもいい程度の計算なら、もっと気楽にできてもいい
高校や大学1年教養の宿題をうっかり解けてしまうような、そんな用途があってもいいはず

241:デフォルトの名無しさん
09/12/15 10:06:28
そういう用途ならあるげぶらーじゃね

242:デフォルトの名無しさん
09/12/15 10:09:15
Rでもいいしますまてぃか覚えるのでもいいしいっそExcelでも充分使える範囲である可能性も高いな

243:デフォルトの名無しさん
09/12/15 10:20:55
カタカナでおk

244:デフォルトの名無しさん
09/12/15 10:28:35
アールやエクセルってなんか変だろ

245:221
09/12/15 15:52:28
>>238
ああ、その手もありました!その名のとおりログのこりますしLoggerいいですねw

246:デフォルトの名無しさん
09/12/15 15:56:00
数値計算したいんなら構文的にPython+numpyのほうがいいよ。Rubyには不向き。

247:デフォルトの名無しさん
09/12/15 18:38:35
>>221
ワンライナーで時間の計算をする時に24時間以内なら
ruby -rtime -e "a=Time.parse('09:08:20')-Time.parse('01:40:02');puts Time.at(a).utc.strftime('%H:%M:%S')"
とかしたりしますな


248:デフォルトの名無しさん
09/12/15 18:47:01
ていうか、やろうと思えば結構できるんだよ
でも自己責任の域を出れない

249:デフォルトの名無しさん
09/12/15 18:54:35
name=gets
puts "私は#{name}です"

nameに日本語を入力するとエラーが出てしまいます
C:/My Documents/g/Ruby/test.rb:4:in `<main>': incompatible character encodings: ASCII-8BIT and
Windows-31J (Encoding::CompatibilityError)
これはどういったエラーなんでしょうか?

250:デフォルトの名無しさん
09/12/15 19:03:50
>>249
初心者は Ruby1.9 使うなってこれだけ言われてるのになんでわからんのだエラー

251:デフォルトの名無しさん
09/12/15 19:08:17
それってスクリプトつーか内部文字列がWindows-31Jで標準入力がASCII-8BITってこと?
Windows-31Jがロードできたら標準入力もそっち使うようになってなかったっけ
どういうときにそんなことになりえるのか知りたい、誰か教えて

252:デフォルトの名無しさん
09/12/15 19:08:20
スレタイに【1.9】 【使うな】っていれとけよ

253:デフォルトの名無しさん
09/12/15 19:21:35
【Windows】【使うな】とか


254:デフォルトの名無しさん
09/12/15 19:36:02
順番からいって標準入力がWindows-31Jか、なんでスクリプトがASCII-8BITになったんだろう?
とりあえず>>249は1.9使い続ける気ならマジックコメントを使えるようになるべき

255:デフォルトの名無しさん
09/12/15 19:38:08
MCって一番やっちゃいけないタイプの変更だよな

256:デフォルトの名無しさん
09/12/15 19:50:04
スレチだが微積やってくれて感動した
URLリンク(www.wolframalpha.com)

257:デフォルトの名無しさん
09/12/15 19:52:31
>>252
>>1

258:デフォルトの名無しさん
09/12/15 20:10:57
>>255
じゃあファイルごとに違う文字エンコーディングをインタプリタに知らせる方法を考えてくれ

259:デフォルトの名無しさん
09/12/15 20:18:58
いいこと考えた、ファイルは全部ASCII-8BIT相当にするってのはどう

260:デフォルトの名無しさん
09/12/15 20:25:36
これでますますPythonへの移行が加速しちゃうな。
マイナー環境に媚びすぎるあまり全員が等しくLoseしちゃうなんてあまりにも悲しい。

261:デフォルトの名無しさん
09/12/15 20:27:49
>>259
それ 1.8 じゃん…

262:デフォルトの名無しさん
09/12/15 20:29:51
やっぱ今からでもせめてデフォルトUTF-8に

263:デフォルトの名無しさん
09/12/15 20:32:17
>>262
マッキン使えマッキン

264:デフォルトの名無しさん
09/12/15 20:36:27
UTF-8-MACはUTF-8じゃありませんっていうか今すぐ滅びてくださいお願いします

265:デフォルトの名無しさん
09/12/15 22:35:13
>>264
Pythonはもろそれにぶつかったな。よくそれではまったよ。

あのさ、require 'foo' したときの、foo.rb または foo.so の在処をしるにはどうしたらいいんだっけ。
よく聞かれる質問だと思うけど、だれか教えて。

266:デフォルトの名無しさん
09/12/15 22:44:32
1.8.6と1.8.7の違いってどこかにまとめられてますか?

267:デフォルトの名無しさん
09/12/15 22:47:55
>>265
前スレでみたのは
gem which foo

268:デフォルトの名無しさん
09/12/15 22:57:27
$" または $LOADED_FEATURES

269:デフォルトの名無しさん
09/12/15 23:04:43
>>267
それは求めるものじゃないなー

>>268
それはファイル名だけだよね。ディレクトリ名も含めたパスが欲しい。


270:デフォルトの名無しさん
09/12/15 23:10:31
それは提供されてない

271:デフォルトの名無しさん
09/12/15 23:10:37
>>265
結局こうしました
$ ruby -r nkf -e 'puts $:.map {|x| Dir.glob("#{x}/nkf*") }.flatten'
/usr/local/lib/ruby/1.8/i686-darwin10.0.0/nkf.bundle



272:デフォルトの名無しさん
09/12/15 23:45:36
>>266
URLリンク(svn.ruby-lang.org)

273:デフォルトの名無しさん
09/12/15 23:59:23
>>272
Thanks.

わーおEnglishじゃん!開発者は日本人が多いのに、ぷんぷん!

274:デフォルトの名無しさん
09/12/16 00:05:46
>>272
ていうか、これ読んで分かるの開発陣だけだから。
Ruby利用者がよんでもわけわからん。

275:デフォルトの名無しさん
09/12/16 00:12:20
これを元にした噛み砕いたユーザー向け解説というのを誰か第三者が作ってきちんとフォローすべきなんだ
でも、Ruby(特に日本の)ではそういうのが特にないんだよね
商売っけがないというか、目立ちたがり屋がいないというか

ちなみにオフィシャルの仕事ではないのでこれ以上は望んじゃ駄目よ
取り巻きの役目

276:デフォルトの名無しさん
09/12/16 00:15:59
user visible feature changes と書いてあるんだが…


277:デフォルトの名無しさん
09/12/16 00:18:07
これとRubyリファレンスマニュアルを併用すればきっと・・!

278:デフォルトの名無しさん
09/12/16 00:18:17
るびきち氏の日記に載ってたのはリリース当時欲紹介されてた気がする。
URLリンク(d.hatena.ne.jp)

279:デフォルトの名無しさん
09/12/16 00:31:54
>>278
神いわゆるゴッド

280:デフォルトの名無しさん
09/12/16 01:55:08
>>275
>ちなみにオフィシャルの仕事ではないのでこれ以上は望んじゃ駄目よ

なんで?

ちなみにPythonはα版でもこれだけの出来。
URLリンク(docs.python.org)

これだけの差がありながら、「Rubyはドキュメントが揃ってる」とぬかす古参上級者がほんとジャマ。



281:デフォルトの名無しさん
09/12/16 02:03:55
Andrew Kuchlingは取り巻きどころかPythonの主要開発者だな
Python3.0のWhat's newはGuido書き下ろしだし
ドキュメントは取り巻きに任せろってのはガンかもしれないね

でもこれ本スレでやったらいいよ
初心者にはいい迷惑だ

282:デフォルトの名無しさん
09/12/16 02:11:24
>>280
人材が究極的に少ないから
現状に加えて一般向けにドキュメント揃えろなんて言ったらどんどんリリースが遅くなる
当事者だからという理由だけでできない人に無理やりやらせる理由はない
得意な人に任せておけばいい

まあ初心者スレ向けでないのとドキュメント揃ってるほうだと言ってる人間が障害になってるのには同意

283:デフォルトの名無しさん
09/12/16 10:33:28
rubyの勉強をしろと言われ、perlのプログラムを渡された
雰囲気は似てるからrubyに書き換えて動作させてみろという
perlもrubyもほとんど触ったことない俺にどうしろっていうんですか…
書き換え方にコツとかあるんでしょうか?元のperlプログラムにはサブルーチンにハッシュやら配列やらが結構混ざって泣きそう

284:デフォルトの名無しさん
09/12/16 10:43:08
>>283
とりあえず元のプログラムが何をするものなのか理解しないことには
始まらないと思われ

285:221
09/12/16 11:02:32
>>247
ありがとう。24時間は超えてしまうのでTimeはやはり使わない方向でいきます

286:デフォルトの名無しさん
09/12/16 11:06:02
質問です。
Rubyで簡単なGUIアプリを作ろうとしているのですが、現在何がオススメでしょうか?
環境は、Ruby 1.8.7、Windowsです。

できれば、あくまでできればですが、実行環境では追加のリソース(ランタイム)が必要ないものがよいのですが…
例えばexeに固めれば単体で実行できる、もしくはRubyとそのライブラリがあれば動くと言ったようなものです。

下記サイトでは、shose(why氏とともにサイト死んでる?)、Ruby-GNOME2、wxRubyがよく使われているとありますが、
みなさんは何を使われてますか?
Ruby GUI調査2008
URLリンク(www.pressure.to)

287:デフォルトの名無しさん
09/12/16 11:14:52
>>286
> Rubyで簡単なGUIアプリを作ろうとしているのですが、現在何がオススメでしょうか?
RubyではGUIアプリケーションは作らない

288:デフォルトの名無しさん
09/12/16 11:15:28
Windowsで1.8でexe単体なら自分だったらvruby+Exerb+UPX
でも上の縛りがなければwxRuby+Ocra
あとやったことないけどWebアプリ+RubyStationも面白そう

289:286
09/12/16 11:24:17
shoesはgithubにありましたけど、Javaのprocessingみたいな感じなんですね。ちょっと用途が違うとおもた
samples at master from shoes's shoes - GitHub
URLリンク(github.com)


>>287
(´;ω;`)ブワッ
昔Delphi使ってたんでそっちでもいいんですが、できれば最近なれたRubyでGUI作れたらなとか思うわけですよ…

>>288
必ずしもexe単体でなくてもいいです。

webアプリは面白そうなんですが、とりあえず、vrubyとwxRuby試してみます

290:デフォルトの名無しさん
09/12/16 11:26:15
たぶん、GUIというイベントドリブンな概念とRubyの記法が合わないんだと思う

291:デフォルトの名無しさん
09/12/16 11:28:25
イベントハンドラにprocオブジェクトを登録することがごく自然に出来るわけで。


292:デフォルトの名無しさん
09/12/16 11:31:44
実装の便利度に差がありすぎるんだよな
中にはHSPからシェル経由でスクリプト呼んで引数連携させたほうがマシといゲフンゲフン

293:デフォルトの名無しさん
09/12/16 11:43:07
>>271
パスに{}[]が含まれると良くない

294:デフォルトの名無しさん
09/12/16 11:51:03
>>293
一般に使ってもらうならともかく、自分の用が果たせたならそれでいいんじゃないか?


295:デフォルトの名無しさん
09/12/16 13:56:13
wxRubyをgemで入れてみたのですが、wxruby-2.0.1-x86-mswin32-60がインストールされたのですが、
これて古くないんでしょうか?wxWidgetの0.6.0だったりしませんか?

ruby -v #=> ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32] 古いな…

296:uy ◆e6.oHu1j.o
09/12/16 17:55:27
純粋にrubyのレベルをあげたいです
小さなツールとWebアプリケーションとGUIゲームくらいならrubyで作れるようになったんですが
ルビリストと呼ばれるようになる為の次のステップ教えてください

297:デフォルトの名無しさん
09/12/16 18:05:30
いろいろな言語を使う。
とくにRubyのバックグラウンドを育んだLispやSmalltalkを。


298:デフォルトの名無しさん
09/12/16 18:09:09
Lispやれ(EmacsLisp以外ならなんでもいい)
PerlがまだならPerlも齧れ
オブジェクト指向の関係でJavaもできるといいんだが

299:デフォルトの名無しさん
09/12/16 18:12:54
>>296
もの凄い勢いでRuby初心者スレ/本スレ/ruby-list等
あらゆるサイトの質問にコテハンで答えまくる
質の高い回答が数千溜まるとGoogleに雇ってもらえる

300:デフォルトの名無しさん
09/12/16 18:14:14
ルビリストってなんですか?

301:デフォルトの名無しさん
09/12/16 18:27:26
googleって実際優秀な人材だけってわけじゃないんだよねぇ
広告塔の人間もたくさんいるし

302:デフォルトの名無しさん
09/12/16 18:47:10
>>296
>ルビリストと呼ばれるようになる為の次のステップ教えてください

るびまの添削記事を読むのがいいと思う。
URLリンク(jp.rubyist.net)
URLリンク(jp.rubyist.net)
URLリンク(jp.rubyist.net)
URLリンク(jp.rubyist.net)
URLリンク(jp.rubyist.net)


303:デフォルトの名無しさん
09/12/16 18:51:14
>>282
>人材が究極的に少ないから
>現状に加えて一般向けにドキュメント揃えろなんて言ったらどんどんリリースが遅くなる
>当事者だからという理由だけでできない人に無理やりやらせる理由はない
>得意な人に任せておけばいい

ばかをいえ、ChangeLogやNEW FEATURESなんて、開発当事者ぐらいしか詳しくは知らないんだから
開発当事者が書くべきだろ。
こんなことすらも嫌がる開発陣ってなんなの?

どうせ開発リソースが増えたところで、ドキュメントに回すつもりないんだろ。

304:283
09/12/16 19:00:12
昼間は無事だったのに規制が…
283です。
>>284
jcorrectとかいうやつだったかな
プログラムを実行して文章を入力すると、cabochaの解析結果と一緒に文章の校正を促すメッセージが出た
これを実行するためにcabochaとかいろいろ入れてた
プログラムを読んでいると、サブルーチンから値を順に渡していたり$foo->{$var}->とか見たことないのがいっぱいでなんかもうキーーーーってなったんだ…

305:デフォルトの名無しさん
09/12/16 19:06:54
>>303
言ってること自体には賛同できるけどそういうのは本スレでどうぞ

306:デフォルトの名無しさん
09/12/16 23:36:21
質問です。
実行環境:Xubuntu9.10、Ruby1.9.1
使用ライブラリ:tk、pty、expect
やりたいことは、外部プログラム(対話型のCUIプログラム)をRubyスクリプト内から実行する際に、
外部プログラムの実行結果(標準出力。エラーが発生して終了したならその時のエラー出力)
を取得したいのですが、何か方法はあるでしょうか。
ネットを見るとsshやtelnetのサンプルが転がってますが、
sshやtelnetが出力するメッセージ自体やエラー文(はあるのかな?)を処理するようなものがなく、
どうするんだーと悩んでます。

307:デフォルトの名無しさん
09/12/16 23:43:41
シェルからパイプでつなぐ
` ... ` (バッククォート)でコマンド実行して出力取る
手の込んだことがしたければ require 'open3'

308:デフォルトの名無しさん
09/12/17 00:23:55
wxRubyとかGUIアプリの話がでたついでに聞きたいんですけど、
↓みたいにマニフェストをruby/bin/において、Windows XP移行のLuna(?)風のUIにする方法があるんですが、
Ruby on Windows: Windows XP Visual Style Controls with wxRuby
URLリンク(rubyonwindows.blogspot.com)

…うまくいきません。
古いルックアンドフィールのままになります。
上記サイトのxmlをファイルをruby.exe.manifestとrubyw.exe.manifestに新規作成してコピペして、
ruby/binに放りこめばいいんですよね?

309:デフォルトの名無しさん
09/12/17 00:38:30
>>307
ありがとうございます。
標準出力と標準エラー出力に違いがあるのを知らなかったですorz
open3は標準入力・出力・エラー出力のみ対応という形だったので、
except実行→出力結果を一時ファイルに出力→実行元プログラムでopen
という形で無事結果を得られるようになりました。

PTYがttyを別個に作ってそっちで実行させるっぽいのでバッククォート使えない(のかなぁ……)

310:245
09/12/17 11:43:14
logger使ってみているのですが、
Benchmarkの出力結果が余計な改行が入るのですが、これってこんなもん?

time = Benchmark.measure do
:(略)
end
logger.debug Benchmark::CAPTION
logger.debug time.to_s

311:デフォルトの名無しさん
09/12/17 12:21:56
そんなの logger は与り知らんよ
logger は対象のオブジェクトを to_s しての末尾に改行つけて書き出してるに過ぎない
何か問題あるならそのオブジェクトの to_s 調べれ

312:245
09/12/17 13:01:09
>>311
舌足らずでごめんなさい。
puts Benchmark::CAPTION
puts time.to_s
だと改行の問題ないんです。気味が悪いんですが、何でなんでしょ

313:デフォルトの名無しさん
09/12/17 13:10:17
>>312
改行が問題になるときの検証に puts 使ったら駄目
puts は文字列末尾に改行があったら自前で改行をつけない

というかこれはそのまんまで

irb> require 'benchmark'
irb> p Benchmark::CAPTION
" user system total real\n"

そもそも改行が末尾に入ってる
気になるなら Benchmark::CAPTION.chomp を logger に渡す

314:デフォルトの名無しさん
09/12/17 18:13:47
> puts は文字列末尾に改行があったら自前で改行をつけない
漏れは大変なことを知ってしまった
近いうちに消されるかもしれない

315:デフォルトの名無しさん
09/12/17 18:18:58
xpathって難しい。もっと簡単にできるか?
id('Layer3')//td[
following-sibling::td//a[contains(@href,
'URLリンク(money.www.infoseek.co.jp)')]]/b//font[@color]

316:sage
09/12/17 21:38:37
>>228
trunk には Date::Delta ってのが入ってるよ

317:デフォルトの名無しさん
09/12/17 22:32:29
RSpecの用語について質問。
describe ... や it .... で書いたひとまとまりを、なんて呼ぶの?
たとえば Test::Unit なら
class FooTestCase < Test::Unit::TestCase ← これはテストクラス
 def test_equal       ← これはテストケース
  assert_equal(2, 1+1)
 end
end
のような呼び方をしてると思うんですけど、RSpecの場合は何と呼ぶのかわからないので、教えてください。


318:デフォルトの名無しさん
09/12/17 23:36:33
現在β版のRSpec本によれば、
We use the describe( ) method to define an example group.
The it( ) method defines a code example.

なお、
describe(および別名のcontext)メソッドが作るのは
Spec::Example::ExampleGroupのサブクラス
it(および別名のexample)メソッドが作るのは
それのインスタンスメソッド
になる


319:デフォルトの名無しさん
09/12/18 06:03:22
質問です。
001
002
のような、3桁の連番を表示したいんですが、どうやればいいんですか。
for i in 001..100
だと
1
2
になるんですが。

320:デフォルトの名無しさん
09/12/18 06:18:23
Rubyらしい書き方ではないかもだが

for i in 1..100
 p '%03d' % i
end

数字の頭に0がつくとRubyでは8進数って意味になるので注意

321:デフォルトの名無しさん
09/12/18 06:23:07
('001'..'100').each{|s| puts s}

322:デフォルトの名無しさん
09/12/18 06:25:56
>>320
見事にできました。
素早い回答どうもありがとうございました。

323:デフォルトの名無しさん
09/12/18 10:03:11
WEBrickで、
・Basic認証またはDigest認証
・IPアドレスによるアクセス制限
を実現したいのですが、サンプルとか参考になるページがあれば教えてください。
「WEBrick IPアドレス 制限」とかでぐぐったけど、それらしいのはヒットしませんでした。

324:デフォルトの名無しさん
09/12/18 10:32:21
追記。
ちなみに、今使っているサンプルはこんなのです。
require 'webrick'
server = WEBrick::HTTPServer.new({
:DocumentRoot => '.',
#:BindAddress => '127.0.0.1',
:Port => 3000,
})
Signal.trap('INT') { server.shutdown }
Signal.trap('TERM'){ server.shutdown }
server.start

325:デフォルトの名無しさん
09/12/18 11:10:43
認証
WEBrick::HTTPAuth::BasicAuth
WEBrick::HTTPAuth::DigestAuth

IPアドレスでの制御は HTTPRequest#addr あたりを見て403を返せばいいんじゃない?



326:デフォルトの名無しさん
09/12/19 12:18:34
{1=>[2]}となる事を期待したけど、この方法では駄目みたいですね。

% irb1.9.1
irb(main):001:0> h=Hash.new([])
=> {}
irb(main):002:0> h
=> {}
irb(main):003:0> h[1]
=> []
irb(main):004:0> h[3]
=> []
irb(main):005:0> h[1] << 2
=> [2]
irb(main):006:0> h
=> {}
irb(main):007:0> h[1]
=> [2]
irb(main):008:0> h[3]
=> [2]


327:デフォルトの名無しさん
09/12/19 12:29:26
>>326
URLリンク(www.ruby-lang.org)

ぶっちゃけRubyの怪しげな機能は使わないほうがいいと思う

328:デフォルトの名無しさん
09/12/19 12:32:18
>>326
そりゃArrayやHashの初期値つきnewは毎回初期値のオブジェクトを生成するからな

irb> p h[2].object_id == h[2].object_id
false

irb> h=Hash.new([])
{}
irb> h[1]=[2]
[2]
irb> h
{1=>[2]}

329:デフォルトの名無しさん
09/12/19 12:39:22
>>328
> p h[2].object_id == h[2].object_id
これうち(1.8.7cygwin)でやるとtrueになるんだが1.9で変わったとか?

330:デフォルトの名無しさん
09/12/19 12:42:53
>>326
それだとh[1]の参照先(初期値オブジェクト[])に2を入れてることにしかならない

h[1] = ほげほげ
としない限り
{1=>ほげほげ}にはならない

331:デフォルトの名無しさん
09/12/19 13:35:34
$ rvm use system
<i> Now using system ruby. </i>
$ irb --prompt simple
>> RUBY_DESCRIPTION
=> "ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]"
>> h = Hash.new([])
=> {}
>> [h.default, h[0], h[1]].map(&:object_id)
=> [2156963800, 2156963800, 2156963800]

$ rvm use 1.9.1-head
<i> Now using ruby 1.9.1 head </i>
$ irb --prompt simple
>> RUBY_DESCRIPTION
=> "ruby 1.9.2dev (2009-12-11 trunk 26067) [x86_64-darwin10.2.0]"
ruby-1.9.1-head > h = Hash.new([])
=> {}
>> [h.default, h[0], h[1]].map(&:object_id)
=> [2151892720, 2151892720, 2151892720]


332:デフォルトの名無しさん
09/12/19 15:45:53
>>331みたいな人ってソース中のコメントもほぼかかなそうだよな

333:デフォルトの名無しさん
09/12/19 16:35:24
>>332は初心者

334:デフォルトの名無しさん
09/12/19 16:59:49
まあ初心者スレだしな

335:デフォルトの名無しさん
09/12/19 17:53:52
結局>>328は間違ってるということかい?

336:デフォルトの名無しさん
09/12/19 18:26:49
new(初期値)で生成されたハッシュに存在しないキーでアクセスした場合の挙動は、
同じオブジェクトが返るというのが正しく、
毎回異なるオブジェクトが返るというのは誤り。


337:デフォルトの名無しさん
09/12/19 18:37:34
質問するならリファレンスマニュアルくらい読んでからこい

338:デフォルトの名無しさん
09/12/19 18:47:27
初心者スレ的には
「マニュアルのここ読めわかりやすくて疑問の余地無し氏ね」
と言える環境を揃えるほうが先な気もする

339:デフォルトの名無しさん
09/12/19 23:53:39
>>328
それは初期値じゃなくて初期ブロックじゃないのか?

h = Hash.new{|hash,key| [] }
p h[2].object_id == h[2].object_id # => false

未設定のキーを指定された時に、そのつどブロックを実行した結果を返す
よって同じキーでも毎回違うArrayが帰ってくる


340:デフォルトの名無しさん
09/12/20 01:14:37
>>338
ようやくたどり着いたと思ったら、

xxxx()
執筆者を募集中

おい、コードを書いたのはどこに行ったの?
採用した人は?

なので、動かないものは、自分で書き直すことにしてる。
一から一人でするより、ちょっと近道。

341:デフォルトの名無しさん
09/12/20 05:46:41
>>337
>質問するならリファレンスマニュアルくらい読んでからこい
おまえは書き込むまえに>>1を読んでこい

342:デフォルトの名無しさん
09/12/20 06:50:04
>>341
おまえは書き込むまえに>>1を読んでこい

343:デフォルトの名無しさん
09/12/20 07:39:01
そんなことより俺のIDを見てくれ。どう思う?

344:デフォルトの名無しさん
09/12/20 09:13:46
見えない

345:デフォルトの名無しさん
09/12/20 10:15:45
>>344はバカ

346:デフォルトの名無しさん
09/12/20 10:27:17
まあバカスレだしな

347:デフォルトの名無しさん
09/12/20 12:45:29
教えてください
Hpricotで日本語テキストのリンク検索が上手く動きません
どうすればNokogiriと同じ動きになるのでしょうか

#!ruby -Ku
require 'hpricot'
require 'nokogiri'

html = "<html><a>りんく1</a><a>りんく2</a><a>りんく3</a></html>"
doc = Hpricot(html)
print doc.at("a[text()*='りんく2']"); # エラー発生

doc = Nokogiri(html)
print doc.at("a[text()*='りんく2']"); # こちらは正しく動く

エラー内容
/usr/local/lib/ruby/gems/1.9.1/gems/hpricot-0.8.2/lib/hpricot/elements.rb:486:in `index':
incompatible character encodings: ASCII-8BIT and UTF-8 (Encoding::CompatibilityError)



348:デフォルトの名無しさん
09/12/20 12:48:10
>>347
初心者は Ruby1.9 使うなってこれだけ言われてるのになんでわからんのだエラー

349:デフォルトの名無しさん
09/12/20 12:54:16
>>348が FA なのだが

というか何もわからず動かしていることが原因で、
Nokogiri が動いたのはただの偶然に過ぎない
むしろ「Nokogiri が動いたのは何故ですか」という質問になるべき事象

無理しないで Ruby 1.8.7 使え
1.8.7 を理解したあとで差分学習で 1.9.1 を習得するのが一番早い

350:デフォルトの名無しさん
09/12/20 12:57:10
了承、1.8.7にする

351:デフォルトの名無しさん
09/12/20 12:59:15
hpricotはコンパイルが通る程度に1.9対応されてるだけ。
作者の _why the lucky stiff はネット上から失踪しているので、事実上塩漬け状態。


352:デフォルトの名無しさん
09/12/20 16:02:52
質問
rdoc が生成する HTML について、特定の要素(例えば <pre>タグ)のスタイルだけ
いじりたいという場合はどうしたらいいのでしょうか?

353:デフォルトの名無しさん
09/12/20 16:27:02
>>352
ちょっと見た感じでは rdoc に --template オプションで
自作のテンプレートを指定してやればいいんじゃまいか

既存のテンプレが rdoc/genarators/template/html に入ってるから
それを部分的に書き換えて使えばよさそう

354:デフォルトの名無しさん
09/12/20 19:17:36
whyさん死んじゃったからNokogiri推奨だと思うけど、
>>347がhpricot使いたいと思った理由はなんだろ

355:デフォルトの名無しさん
09/12/20 19:20:40
え、whyって死んじゃったの?
もしそうならHpricotきめえとかdisるのやめて冥福を祈る

356:352
09/12/20 19:31:28
>>353
ありがとうございます。
ベースになるテンプレートを選んで、それに改変を加えたものを使おうと思います。

357:デフォルトの名無しさん
09/12/20 20:19:30
ネットワーク的に、ね。
自分できれいさっぱり痕跡を消していった。


358:352
09/12/21 15:57:51
追記
rdoc の --style オプションにスタイルシートのパスを渡すことで
HTML生成時に自前のスタイルシートを読み込ませることができました。

テンプレから CSS の部分だけ切り出して編集して、
rdoc --style=path_to/hoge.css

でうまくいきました。
というか、manページに普通に書いてあったorz

359:デフォルトの名無しさん
09/12/21 22:18:49
hpricot でも nokogiri でもいいんですが、

doc = Hpricot(open(uri).read)
(doc/:a).each do | link |
 if link[:href] == '#'
  p "設定し忘れ => #{link[:lineno]}"
 end
end

みたいに、行番号を取得することって出来ませんか?

360:デフォルトの名無しさん
09/12/21 22:21:13
行番号というメタ情報があれば取得できるよ
ないならできない
自分で行番号だと思うものを作って数えるしかない

361:デフォルトの名無しさん
09/12/22 09:38:58
>>359
その程度なら普通に正規表現でよさそうだね。

File.open(filename) do |f|
 i = 0
 f.each_line do |line|
  i += 1
  puts "#{filename}:#{i}: 設定し忘れ" if /href=("¥#"|'¥#¥')/
 end
end

362:デフォルトの名無しさん
09/12/22 09:39:08
jrubyでmechanize使えている人います?hpricotのjava版使うしかないんでしょうか?

363:デフォルトの名無しさん
09/12/22 09:45:49
>>361みたいに例示依存の回答する人なんなの

364:デフォルトの名無しさん
09/12/22 10:39:36
>>361 欲しいのは行番号であって、例文なんかどうでもいいんだが

365:デフォルトの名無しさん
09/12/22 11:00:20
例題コードを添削するのはどうかとw

366:デフォルトの名無しさん
09/12/22 11:10:57
作業ディレクトリの変更って出来ませんか?
./data/a.rb
./data/1.txt
./main.rb
ってあったときに
main.rbからa.rbをrequireするんですけど
a.rbは
open("1.txt","r") これで読めるようにしたいです

367:デフォルトの名無しさん
09/12/22 11:21:49
save = Dir.pwd
Dir.chdir "./data"
# 作業
Dir.chdir save
とかかな

同じディレクトリにあるファイルを使うってことなら
open(File.dirname(__FILE__)+"/1.txt")
でもいいかも

368:デフォルトの名無しさん
09/12/22 11:34:12
Pythonのdirみたいに、あるオブジェクトが持ってるメソッドと変数を一覧するものってありますか?

369:デフォルトの名無しさん
09/12/22 11:36:29
>>367
それでいけそうです
ありがとうございます

370:デフォルトの名無しさん
09/12/22 11:37:30
puts Object.methods

ソートするとなおみやすい
puts Object.methods.sort

371:デフォルトの名無しさん
09/12/22 11:41:30
Object#methods
Object#instance_variables

372:デフォルトの名無しさん
09/12/22 12:00:57
>>370-371 ありがとうございます!
これが欲しかった。

373:デフォルトの名無しさん
09/12/22 12:36:02
>>359
Nokogiriの要素は #line メソッドがあるはず。


374:デフォルトの名無しさん
09/12/22 14:41:59
>>367
Dir.chdir "./data" do
# 作業
end

でもいけるよ。

375:デフォルトの名無しさん
09/12/22 14:46:45
>>374
おお知らなかった
もっかいリファレンス見直すことにしよう

376:デフォルトの名無しさん
09/12/23 10:27:52
ねー、

hoge/lib/  ← 自作ライブラリの rb ファイル
hoge/test/ ← lib のファイルに対応するテストスクリプト

という一般的なディレクトリ構成で test/test_hoge.rb を実行する場合、どうするのが「ふつう」なんだ?

:~/hoge$ ruby test/test_hoge.rb

:~/hoge/test$ ruby test_hoge.rb

:~/hoge$ testrb test/test_hoge.rb

:~/hoge/test$ testrb test_hoge.rb

377:デフォルトの名無しさん
09/12/23 11:29:21
コマンド直叩きするときは ruby -Ilib test/test_xxx.rb とする気がするが、
普段はrakeのTestTask任せだから、どうやってるか意識してないわ。

TestTaskの中をみてみたけど、testrbを使うことも使わないことも可能みたい。
(デフォルトはrakeのライブラリ内の機能を使う)

なお、rakeの場合、test/ の中で起動しても、ディレクトリを遡ってRakefileを
探して、見つかったディレクトリで動くので、hoge/Rakefileとして置いている
場合は、実質的には hoge直下でやってることになるはず。



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch