Ruby 初心者スレッド Part 33

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

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2デフォルトの名無しさん:2009/12/05(土) 14:22:09
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

A:
プログラム作成自体の初心者なら
 ・「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
  http://www.amazon.co.jp/dp/4797336617/
文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
 ・「初めてのRuby」
  http://www.amazon.co.jp/dp/4873113679/

以下は外れが少ないとされている本です。必ず立ち読みした上で自分の目的とレベルに応じて購入してください。
 ・「Rubyレシピブック 第2版 268の技」(初心者向け)
  http://www.amazon.co.jp/dp/4797340045/
 ・「プログラミングRuby 第2版 言語編」(初心者向け)
  http://www.amazon.co.jp/dp/4274066428/
 ・「Ruby Way 第2版」(脱初心者向け)
  http://www.amazon.co.jp/dp/4798115339/
 ・ 「Rubyクックブック ―エキスパートのための応用レシピ集」(脱初心者向け)
  http://www.amazon.co.jp/dp/4873113245/

以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません。
 ・「プログラミング言語 Ruby」(言語として深く知りたい人向け)
  http://www.amazon.co.jp/dp/4873113946/
3デフォルトの名無しさん:2009/12/05(土) 14:22:49
Ruby 公式・非公式便利サイト2009

・Ruby Home Page 【公式、お役立ち度が微妙】
 http://www.ruby-lang.org/ja/
・Rubyリファレンスマニュアル 【検索機能休止中、Googleなどの併用を】
 http://www.ruby-lang.org/ja/man/
 http://www.ruby-doc.org/ 【詳しい英語版】
・HTMLヘルプ版リファレンスマニュアル配布さん 【Windowsで便利、検索も無論可能】
 http://elbereth-hp.hp.infoseek.co.jp/ruby.html
・Programming Ruby - The Pragmatic Programmer's Guide 【好評書籍の初版がネットで、ただし英語】
 http://www.ruby-doc.org/docs/ProgrammingRuby/
・Rubyist Magazine - るびま 【ライブラリ紹介などの読み物、過去のコードレビューは一読の価値あり】
 http://jp.rubyist.net/magazine/

・逆引きRuby 【やりたいことから探すWiki、最近元気ないので編集者募集】
 http://www.namaraii.com/rubytips/
・はてなキーワード > Ruby 【うっかりどっさりまとまったリンク集、説明なし】
 http://d.hatena.ne.jp/keyword/Ruby

・RubyForge 【○○をやりたい管理されたライブラリを探すならここ、英語】
 http://www.rubyforge.org/
・GitHub 【○○をやりたいコードをとにかく探すならここ、英語】
 http://github.com/

・日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
 http://jp.rubyist.net/
4デフォルトの名無しさん:2009/12/05(土) 14:24:09
関連スレ
・Rubyについて Part 38
 http://pc12.2ch.net/test/read.cgi/tech/1257079004/

アンチスレ
・Rubyについて(アンチ専用) Part004
 http://pc12.2ch.net/test/read.cgi/tech/1249737531/

Railsスレ
・【Ruby】Ruby on Rails Part8
 http://pc11.2ch.net/test/read.cgi/php/1252842574/

Windows用スレ
・【ActiveScript】RubyをWindowsで使うスレ【GUI】
 http://pc11.2ch.net/test/read.cgi/tech/1155031689/

Ruby 1.9 系列スレ
・魁け! Ruby 1.9.X
 http://pc11.2ch.net/test/read.cgi/tech/1201603546/
5デフォルトの名無しさん:2009/12/05(土) 14:24:50
前スレ

Ruby 初心者スレッド Part 32
http://pc12.2ch.net/test/read.cgi/tech/1256332692/

Ruby 初心者スレッド Part 31
http://pc12.2ch.net/test/read.cgi/tech/1253176267/
6デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/05(土) 15:46:49
おまけ

・Rubygem 0.x
 極悪動作をすることで有名なRuby外部ライブラリ利用サポートプログラム群のバージョン
 このバージョンしかパッケージが存在しないUNIX系ディストリビューションがあって結構問題に
 しかも「rubygem本体の自己更新機能は殺してるのでパッケージから入れてね」とかほざきやがる
 パッケージがバージョン 1 より前のものしかない場合はソースからインストールするとよい
 Rubygem は 1.0 も 1.1 も 1.2 も肝心なとこにバグ持ちなので極力 1.3 などの最新を使うこと
9デフォルトの名無しさん:2009/12/05(土) 15:51:54
>>8
Ubuntu 9.xxでもaptで入れるとbinにパス通ってなかったり、どうしてこうなった?なことになってる
謎過ぎる。
10デフォルトの名無しさん:2009/12/05(土) 16:02:10
>>9
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/12/05(土) 18:17:21
>>12
なるほど。BigDecimalですか。
そっちの方が推奨されるやり方なんでしょうか?

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

a = 82.30
b = 80.20
c = nil

c = sprintf("%.2f", a - b).to_f
14デフォルトの名無しさん:2009/12/05(土) 19:00:05
>>13
それで問題があるかどうかはその数値の使われ方を知っている君が知ってるはず
15デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/12/06(日) 08:05:03
YARVの1.9からはハッシュの順番が保証されてるんだっけ?
21デフォルトの名無しさん:2009/12/06(日) 08:12:15
なんか微妙な表現だがおおむねYESだ
それがなくなることもない
22デフォルトの名無しさん: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デフォルトの名無しさん:2009/12/06(日) 16:11:36
速くしたいなら速いほうで書けばいいじゃん
24デフォルトの名無しさん:2009/12/06(日) 18:27:10
>>23
真理だな
25デフォルトの名無しさん:2009/12/06(日) 18:31:49
(キリッ
26デフォルトの名無しさん:2009/12/06(日) 19:42:32
>>22
injectは遅いし分かりにくいので、使わずに済むなら使わない方がいいと思う。
1.9にしたらけっこう速くなるけど。
27デフォルトの名無しさん:2009/12/06(日) 21:53:15
分かりにくいんじゃなくて、慣れていないだけでは。
なれれば、すぐ読めるよ。

injectは式一個でかけるし、メソッドチェーンも作れるってのがいいんじゃないかな。
28デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/12/06(日) 23:02:50
なんだかパッとしないな < each_with_object
32デフォルトの名無しさん:2009/12/07(月) 00:00:35
hs = (0..5).map do |n| (0..5).map do |m| 0 end end
二次元配列を生成する方法にこんなものを知ったんですが
もっと短くかけないんでしょうか?
33デフォルトの名無しさん:2009/12/07(月) 00:04:21
多次元配列というものは Ruby にはそもそもない
つまり、ネストした配列で代用するしかない

map でもいいんじゃね
34デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/12/07(月) 02:49:23
>>33-34
そうですかぁ
残念です
37デフォルトの名無しさん: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デフォルトの名無しさん:2009/12/07(月) 03:01:59
把握
39デフォルトの名無しさん: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デフォルトの名無しさん:2009/12/07(月) 05:06:06
こう?

s = "aaa bbb ccc:ddd eee"
t = s.gsub!(/ccc:(\S+)/, '') ? $~[1] : ''
41デフォルトの名無しさん: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デフォルトの名無しさん:2009/12/07(月) 05:12:15
>>40
ここで $1 ではなく $~[1] を使う理由はある?
43デフォルトの名無しさん:2009/12/07(月) 10:18:05
というか特段二度手間でもない
簡潔でわかりやすくていいじゃん
44デフォルトの名無しさん:2009/12/07(月) 11:08:35
attr_* をそのままライブラリ外に公開する理由ってたいていの場合薄いよね?
45デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/12/07(月) 19:14:47
ttp://itpro.nikkeibp.co.jp/article/Interview/20090106/322300/
今年はじめのこんな記事を見つけたんだけど、仕様書草案ってもうどこかで見られる?
48デフォルトの名無しさん:2009/12/07(月) 19:19:46
RubySpecかな
49デフォルトの名無しさん:2009/12/07(月) 19:31:48
>>47

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

261 名前: デフォルトの名無しさん Mail: sage 投稿日: 2009/12/01(火) 19:36:45
http://ruby-std.netlab.jp/
50デフォルトの名無しさん:2009/12/07(月) 19:39:59
ddd! ありがとうございます!
51デフォルトの名無しさん:2009/12/07(月) 21:34:59
Rubyのテスト用フレームワークっていくつかあるみたいですが何がいいでしょうか?
場合による、という結論かもしれませんが
みなさんは何を使ってますか?
52デフォルトの名無しさん:2009/12/07(月) 21:45:45
目的によるし、おおむね目的ごとに分かれてると思う
自分で使ってテストの方向性に合うものを選択するといい
テストフレームワークを1種類しか使えない、という人は少ない

よーわからんがテストってあると便利そうじゃね、というのなら RSpec から始めるといいんじゃね
53デフォルトの名無しさん:2009/12/07(月) 22:19:44
よーわからんがテストってあると便利そうじゃね、というレベルなら、
標準添付のtest/unitがいいんじゃね
54デフォルトの名無しさん:2009/12/07(月) 22:34:53
テストっちゃ、「ファイルに保存されたかどうか」のテストってどうやるん
55デフォルトの名無しさん:2009/12/07(月) 22:44:51
>>52-53
アドバイスありがとうございます
そうですね、もう少し調べたりいろいろ使ってみて決めたいと思います
56デフォルトの名無しさん:2009/12/07(月) 22:47:08
・ 書き出し先ファイルがあれば削除
・ ファイル保存を含んだメソッドを実行
・ 例外が起こらないことをテスト
・ ファイルの中身が期待通りであることをテスト
・ 書き出し先ファイルがあれば削除

書き出すファイルを削除できないという場合は知らん
「きっと保存されるはず」みたいなテストするしかなくね
57デフォルトの名無しさん:2009/12/08(火) 03:20:32
最終手段的には、事前にFile.openやFile#writeをフックとか・・・
58デフォルトの名無しさん:2009/12/08(火) 11:45:06
FTPでディレクトリの更新日時が知りたいのですが取れません
一般的に、FTPではLSコマンドの結果を解釈するしかないのでしょうか?
(net/ftpを利用してます)
59デフォルトの名無しさん:2009/12/08(火) 11:55:44
MLSDとか送ればいいんじゃないの
60デフォルトの名無しさん:2009/12/08(火) 13:17:10
>>58
一般には自力で解析するしかない。
MDTMというコマンドもあるがすべてのftpサーバが実装しているわけではない。
61デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/12/08(火) 16:17:20
JRubyとRubyの違いについて調べてみたのですが、
いまいちわからなかったのでここで質問してみます。
JRubyはコーディングの仕方が、Rubyと同じなだけであり、
それ以外の部分は全く別なものという解釈でいいのかな?

根本は全く違うものではあるが、コードレベルでは
同じ内容で動くものなので、移植する場合は、
コードのコピペでおk・・・かな?
64デフォルトの名無しさん:2009/12/08(火) 17:29:49
>>59, 60
ありがとうございました
65デフォルトの名無しさん: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デフォルトの名無しさん:2009/12/09(水) 06:11:28
      ,―ヽ____、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/    まピョーん☆ IPA Rubyをこれからもよろしく
      i、   \___/  _/
       \       ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
      >   ヽ. ハ  |   ||
67デフォルトの名無しさん:2009/12/09(水) 10:43:59
おまえら1.9.1更新しろー
ttp://sourceforge.jp/magazine/09/12/08/1011230
と思ったがインストーラつきを公開してる人はまだいないのね
68デフォルトの名無しさん:2009/12/09(水) 10:47:19
みんなに広まってからアップグレードする
どうせチェックにしか使ってないし、自分だけ「みんなと違って最新」だと意味ないし
69デフォルトの名無しさん:2009/12/09(水) 11:01:47
>>68
安心しろ
1.9.1を普段使ってる奴は普通にアップグレードするし、
1.9.1を自分のスクリプト用のチェックにしか使ってない奴は
「この人のスクリプト俺の1.9.1-p0(しかもmswin32)だと動かないんすけどー」とか言ってきたりはしない
とっととアップグレードすれ
70デフォルトの名無しさん:2009/12/09(水) 11:14:16
head使いには関係ないしな。
71デフォルトの名無しさん:2009/12/09(水) 11:19:29
というか、パッチレベル0を鬱陶しいと思ってる人にこそ、
「1.9.1は最新版でしかチェックしてません」と公言するのをお勧め
そうしないといつまでたってもだらだら残るぞ
自分のサイトに最新版へのリンクでも張っとけ
72デフォルトの名無しさん:2009/12/09(水) 11:25:34
~/work/source/ruby-1.9.1-p243$ make uninstall
make: *** ターゲット `uninstall' を make するルールがありません. 中止.

ぬう
てか前回のconfigureにどんなオプションつけたか忘れたしどこにインストールされたか調べるのめどい
73デフォルトの名無しさん:2009/12/09(水) 11:45:58
「引数はHashの入ったArrayにしろ」って英語の警告でどう言えばいい?
74デフォルトの名無しさん:2009/12/09(水) 11:54:23
raise ArgumentError, "invalid argument, RTFM"
75デフォルトの名無しさん:2009/12/09(水) 12:12:55
ArgumentError を出したなら「引数が不正です」は言う必要なくね
76デフォルトの名無しさん:2009/12/09(水) 12:35:33
>>73
スレ違い。 このへんで聞け。
http://pc12.2ch.net/test/read.cgi/tech/1193554741/
77デフォルトの名無しさん:2009/12/09(水) 12:37:03
URLを間違えた。こっちだ。
http://pc12.2ch.net/test/read.cgi/tech/1224696505/
78デフォルトの名無しさん:2009/12/09(水) 12:44:01
>>73
Hashを要素にしたArrayって英語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど
79デフォルトの名無しさん:2009/12/09(水) 12:45:27
>>78
Hashを要素にしたArrayって日本語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど
80デフォルトの名無しさん:2009/12/09(水) 12:55:43
>>78
Hashed Array
81デフォルトの名無しさん: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]
8281:2009/12/09(水) 13:28:11
>n cats = [] = 1
>^
スペースが省略されて「^」の位置がずれてしまいました
「^」は=と1の間にあるスペース部分を指しています
83デフォルトの名無しさん: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デフォルトの名無しさん: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

こっちのほうがきっと驚いてもらえるぞ
「配列ってなんかざくざく入るんだね!」みたいな
8681:2009/12/09(水) 13:43:10
>>83
ありがとうございます
無事Tamaを表示することができました。
87デフォルトの名無しさん:2009/12/09(水) 13:58:35
>>80
うそをいうな。
88デフォルトの名無しさん:2009/12/09(水) 14:02:07
>>87
では真実を
89デフォルトの名無しさん:2009/12/09(水) 14:20:00
Hashed Array = Associative Array = rubyのHash
90デフォルトの名無しさん:2009/12/09(水) 14:20:08
array of hashes じゃないの?
91デフォルトの名無しさん:2009/12/09(水) 14:57:30
array containing hash
92デフォルトの名無しさん:2009/12/09(水) 14:59:57
泣きながらF5連打してたらこまるので

>>84
それが普通の手段
93デフォルトの名無しさん:2009/12/09(水) 15:03:04
>>84,92
1.8.7以降を使ってるなら、__method__で。
9493:2009/12/09(水) 15:04:07
あ、ごめん、見間違えた。
呼び出し元を知るには、当然callerですね。
95デフォルトの名無しさん:2009/12/10(木) 05:12:13
独習Rubyってどうよ?
96デフォルトの名無しさん:2009/12/10(木) 08:41:52
Googったんですけどわかんなかったんで教えてくださいおながいします。

「AはBクラスのインスタンスである」ってのは A === B って書きますが、「AはBクラスの
インスタンスでない」ってのはどう書けばいいでしょうか?
97デフォルトの名無しさん:2009/12/10(木) 09:16:33
=== の否定はないから全体を !
98デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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("http://example.com/").instance_of?(URI)
false
irb> p URI.parse("http://example.com/").instance_of?(URI::HTTP)
true

間違ってないけどー
動作合ってるけどー
でもー
10196:2009/12/10(木) 09:50:45
みなさんありがとう。Googり方が悪いんだよカス!とか言われると思ってました。
102デフォルトの名無しさん:2009/12/10(木) 09:52:57
=== が検索できるようになってたら罵倒されたと思う
103デフォルトの名無しさん:2009/12/10(木) 09:53:39
>>101
いちいちスレあげんなカス!
104デフォルトの名無しさん:2009/12/10(木) 09:57:37
>>65
分かりやすい解説ありがとうございました。
イメージがつきました。
105デフォルトの名無しさん:2009/12/10(木) 14:00:10
>>103
うるせーバカ
106デフォルトの名無しさん: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デフォルトの名無しさん:2009/12/10(木) 19:48:10
マジレス
if a[:class]
 a[:class] += ": button"
else
 a[:class] = "button"
end

ネタレス
a[:class] = [a[:class], "button"].compact.join(": ")
109デフォルトの名無しさん:2009/12/10(木) 21:16:51
デフォルト値が設定されてるとおかしなことになりそうな気が…
110デフォルトの名無しさん:2009/12/10(木) 21:19:23
デフォルト値を設定すること自体がおかしいだろ
111デフォルトの名無しさん:2009/12/10(木) 21:27:35
二時間近く>>108に突っ込む奴がいないわけだが
年末でいつもの人は忙しいのかw
112デフォルトの名無しさん:2009/12/10(木) 21:53:53
デフォルト値は設定しちゃダメなの?
113デフォルトの名無しさん:2009/12/10(木) 23:00:34
配列aとbが対等な関係にある場合に、
a.zip(b)
とするのは対称でなくて見た目が悪いと思うのですが、どう思いますか?
114デフォルトの名無しさん:2009/12/10(木) 23:03:00
それ感じたことがある。けれど代替案が見つからない。
115デフォルトの名無しさん:2009/12/10(木) 23:03:18
別にどうも思いませんが
まあ気になるならArrayクラスのクラスメソッドにでもしてしまうとよろし
Array.zip(a, b) みたいなのなら問題あんめえ
116デフォルトの名無しさん:2009/12/10(木) 23:04:58
>>115
それいいね。それなら、3項間以上でもすっきりかけるね。
117デフォルトの名無しさん:2009/12/10(木) 23:05:20
Array.zip(a, b)
みたいな形だとどう?
118デフォルトの名無しさん:2009/12/10(木) 23:05:42
ついでにEnumeratorを返すようにしてほしいと思いませんか?
119デフォルトの名無しさん:2009/12/10(木) 23:08:22
つーとむしろ
Enumerator.zip(a,b)
なんか変か?
120デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/11(金) 00:02:14
追伸:
しかも欲しいものは配列じゃなくてEnumeratorです。
> zip(a,b).each{|e| p e}
[1,3]
[2,4]
[2,5]
[2,6]

みたいに。
123デフォルトの名無しさん:2009/12/11(金) 00:08:32
twitterとかで、投稿時刻を HH:MM:SS ではなく、「約15分前」「約2時間前」というふうに表示してますけど、
これをやってくれるRubyのライブラリはありますか。
ついでにJavaScriptのライブラリもあるとうれしいです。
124デフォルトの名無しさん:2009/12/11(金) 00:35:15
ありません。自分で書いてください。

(Time.now.to_i - time.to_i) を適当に加工したらできるし。
125デフォルトの名無しさん:2009/12/11(金) 00:45:02
railsならdistance_of_time_in_words
126デフォルトの名無しさん:2009/12/11(金) 01:57:30
>>125
>distance_of_time_in_words

Thank you very much!

>>124
F***!
127デフォルトの名無しさん:2009/12/11(金) 06:25:36
RubyはLispの替わりで使えるのか?
128デフォルトの名無しさん:2009/12/11(金) 07:49:58
文法が全然違うからLispのソースはまず動かないよ
129デフォルトの名無しさん:2009/12/11(金) 08:25:43
>>126
Railsならそう言えよ。
130デフォルトの名無しさん:2009/12/11(金) 12:04:28
>>125-126
RailsのActionPackのActionViewっぽいね。これだけ使えないのかな
131デフォルトの名無しさん:2009/12/11(金) 12:27:45
RailsはRailsで
132デフォルトの名無しさん:2009/12/11(金) 13:40:27
>>130
require 'active_support'
require 'action_view/helpers/date_helper'
include ActionView::Helpers::DateHelper

あー、あとI18n関係の設定がいるかな。以外と面倒かも。

133デフォルトの名無しさん:2009/12/11(金) 13:57:40
そもそも単独で使うようにできてないからな
たった一つの処理のために本質でないファイルをウンコのごとく読まなきゃならんし割に合わん
134デフォルトの名無しさん:2009/12/11(金) 14:46:29
>>133
「ウンコのごとく読む」っていう比喩がわかんない。
どんな風に読むことを「ウンコのごとく」って言うの?
135デフォルトの名無しさん:2009/12/11(金) 17:58:38
>>129
Railsだと分かっていたら答えられたとでもいうのかよwwww
136デフォルトの名無しさん:2009/12/11(金) 18:23:13
たぶんYESなんじゃないかな
137デフォルトの名無しさん:2009/12/11(金) 19:21:02
      ,―ヽ____、―
   ,/  ノ       ヽ  ~\
  /   ノ   Ruby    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/    楽しいプログラミング言語はIPA Rubyだけ
      i、   \___/  _/
       \       ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
      >   ヽ. ハ  |   ||
138デフォルトの名無しさん:2009/12/11(金) 21:48:40
モジュールの定義の有無を確認する方法ってありますか?
method_defined?のモジュール版みたいなのを探しているのですが・・・
139デフォルトの名無しさん:2009/12/11(金) 21:57:29
>>138
require 'net/http'
Object.const_defined?(:Net) #=> true
Net.const_defined?(:HTTP) #=> true
140デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/13(日) 00:07:05
返信ありがとうございます。
オブジェクトと変数の区別があるのは分かりますが、
X = Integer(1)

Y = [1,2,3]
はどちらも
定数=「オブジェクトのインスタンス」
に見えるのですが。
143デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/13(日) 00:12:28
定数は参照の付け替えが出来ないだけで
参照先のオブジェクトが内部状態を変えることには関知しない
145デフォルトの名無しさん:2009/12/13(日) 00:18:59
では
class Integer
def f
self = 8
end
end
X = Integer(3)
X.f()
p X
みたいな感じで内部状態を変えることは原理的には可能でしょうか?
146デフォルトの名無しさん:2009/12/13(日) 00:23:02
>>145
オブジェクトと変数の区別を理解してから出直しておいで。
147デフォルトの名無しさん:2009/12/13(日) 00:25:02
いや、もちろん
@なんとか=8
でしょうけど。
148デフォルトの名無しさん:2009/12/13(日) 00:29:09
オブジェクトと変数の区別を理解したいので
質問を続けます。
149デフォルトの名無しさん:2009/12/13(日) 00:29:25
>>145
Integerのような組み込みのクラスだとそれできないから、i++とかインクリメンタル演算子が実装できないんだよね・・・
150デフォルトの名無しさん:2009/12/13(日) 00:31:32
>>149
selfを変更できるクラスはRubyにはないぞ
データ格納領域がRuby的に保護されてて触れない
151デフォルトの名無しさん:2009/12/13(日) 00:36:43
selfはたんに気分で書いてしまったので気にしないでください。
(私のミスです)

自分で定義したクラスなら
class MyInt
def initialize(i)
@i=i
end
def ++() # 前置演算子の定義の仕方はしらないですが・・・
@i+=1
end
end
でいいわけですよね。
152デフォルトの名無しさん:2009/12/13(日) 00:36:49
もとのxの件はオブジェクトと変数の違いではなく
ローカル変数のスコープの問題だねえ。
153デフォルトの名無しさん:2009/12/13(日) 00:38:42
>>152
そうですね。本当はそれが知りたかったわけですが・・・。
グローバル変数にすればいいんだけど、なんか気持ち悪い。
154デフォルトの名無しさん:2009/12/13(日) 00:41:31
なんか引数で参照渡して、それを書き換えればいいんだよ〜
みたいなのはないんでしょうか?

・・・たぶんないんでしょうね
155デフォルトの名無しさん:2009/12/13(日) 00:44:42
引数で渡していいならArrayみたいな内部状態を持つオブジェクトに包んで
渡すくらいかね。
156デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/13(日) 00:48:47
やっぱそれですか。
議論によって問題の所在がはっきりしてきました。
おつきあいありがとうございます。
158デフォルトの名無しさん:2009/12/13(日) 00:51:40
>>156
それはたぶん文字の配列わたしてるですね。
159デフォルトの名無しさん:2009/12/13(日) 00:53:10
えっ?
160デフォルトの名無しさん:2009/12/13(日) 00:53:23
そうだ、eval使おうか(笑)!
161156:2009/12/13(日) 00:54:39
>>158
Ruby のStringオブジェクトの内部ってArrayで表現されていたんですか?
知りませんでした。><
C言語みたいですね。
162デフォルトの名無しさん:2009/12/13(日) 00:56:25
158ですが、私も初心者なので、フォローお願いします。
普通の言語なら文字列の扱いはそうなってるんじゃないかなぁ?
163デフォルトの名無しさん:2009/12/13(日) 01:06:12
何の意味があるか分からない思いつきだけど通りました。
X='12'
def f
X.gsub!('12','2')
end
f()
p eval(X)
164デフォルトの名無しさん:2009/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]
165156:2009/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のソースを読んでみればわかると思うのですが、まだそこまでのレベルではないので...
スレ汚し失礼しましたです。
166164:2009/12/13(日) 01:27:10
例が文字列じゃなく配列になってた。それぞれ以下に読み替えて

例: s = '123' # sは文字列 '123' を指す
例: s[0], s[1] # sの一文字(バイト)目と二文字目を取得
例: s[1] = '5' # sの一文字目を '5' に変更

>>165
あってるお
内部表現なんて実装次第なんだから
出来ることを正確に把握するほうが大切
167デフォルトの名無しさん:2009/12/13(日) 01:32:12
カビの生えた例だけどこんなのも貼っとく

a = [0, 1, 2]
b = a
b[1] = 10

これでaが何になるのかわからなかった人は横着しないで入門書嫁
168140:2009/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
169140:2009/12/13(日) 08:30:00
なるほどRubyって関数型言語だったのか!
170デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/13(日) 09:22:12
>>170
DOSのコマンドを知らないから憶測だけど、
"."と".."を含めてる含めてないとか?
172デフォルトの名無しさん:2009/12/13(日) 09:40:23
>>170
日本語ファイル名が膨らまれているとか
173デフォルトの名無しさん:2009/12/13(日) 11:00:49
るびまのページいま停止中?
174デフォルトの名無しさん:2009/12/13(日) 11:22:02


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

とすると、

"\202\240"

8進数で返ってくるのでわかりにくいです。
16進数で帰ってきて欲しいのですが、どうすればいいのでしょうか?
176デフォルトの名無しさん:2009/12/13(日) 12:05:56
String#inspect の定義を変更すれば良い。
class String; def inspect; "\""+ self.each_byte.map{|c| "\\x%02x" % c }.join + "\""; end; end
177デフォルトの名無しさん:2009/12/13(日) 12:15:41
0x20...0x80はそのままにした方が目に優しそうだ
あと?\と?"は別扱いでとか考え出したら面倒くせええ
178デフォルトの名無しさん:2009/12/13(日) 12:17:32
>>176
それ、他のオブジェクトをinspectするときに影響が出ちゃわない?
179デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/13(日) 13:06:37
文字列を16進表記にする関数的メソッドを定義するべきだと思うなあ
181デフォルトの名無しさん:2009/12/13(日) 13:40:29
直前の式の返り血が入ってる組み込み変数とかってないですか?
Rubyを関数電卓代わりに使いたいんですけど
182デフォルトの名無しさん:2009/12/13(日) 13:44:29
>>181
irb でよければ _ だと思う
183デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/13(日) 13:48:02
ありがとうございます
できればirbじゃなくても使いたいんですが無いですか
185デフォルトの名無しさん:2009/12/13(日) 13:52:21
関数の戻り値は最後の参照みてるんだし
@かなにかに保持してくれるといいと祈り続けて早10年
186デフォルトの名無しさん:2009/12/13(日) 14:08:15
>>179
俺もそれ考えたけど"\\1000"とかで困る
187デフォルトの名無しさん:2009/12/13(日) 15:24:26
>>180
こうするのが一般的?

p "あ".unpack("H*")
188デフォルトの名無しさん:2009/12/13(日) 18:12:58
PHPのcall_user_funcにあたる機能はRubyでも実現できますか?
実行時に呼び出すメソッドを切り替えたいのです。
189デフォルトの名無しさん:2009/12/13(日) 18:15:34
>>188
send, evalなど
190デフォルトの名無しさん:2009/12/13(日) 18:24:48
>>188
ありがとうございます。
191デフォルトの名無しさん:2009/12/13(日) 18:25:33
間違えた…>>189でした
192デフォルトの名無しさん:2009/12/13(日) 18:49:28
異なる文字コードの文字列を同時に出力するとかじゃない限り
適切に漢字コードを指定しておけばちゃんと日本語表示されるんじゃないの?
$KCODE = 'S'
p "あ"
> "あ"

文字じゃないバイナリ列とか表示させるときに16進文字列がいいのなら
そういう出力メソッドを作るなりすれば
193デフォルトの名無しさん:2009/12/13(日) 19:07:54
1.9 なら encoding を文字列が持ってるからできるが、1.8 なら無理だね。
あと $KCODE は 1.9 じゃ廃止だ
194デフォルトの名無しさん:2009/12/14(月) 01:00:47
module Hoge
def f1 end
def f2 end
・・・ってかんじでメソッドがたくさんあったときに
module_function :f1,:f2,...
って全部書くしか、外からアクセスする方法はないでしょうか?
end
195デフォルトの名無しさん:2009/12/14(月) 01:05:21
include Hoge で f1 や f2 を取り込めるよ
196デフォルトの名無しさん:2009/12/14(月) 01:12:46
名前空間は汚染したくないので
Hoge::f1
というアクセスだけ許したいのですが・・・
いちいち書くのは保守が面倒だと思ったので。

いま考えてるのは
module_function self.methods.join(' ') #未完成
みたいな怪しい方法です。
197デフォルトの名無しさん:2009/12/14(月) 01:20:55
module M
def m1; "m1"; end
extend M
end
M.m1 #=> "m1"
198デフォルトの名無しさん:2009/12/14(月) 01:22:36
どんぴしゃです!
ありがとうございます。
199デフォルトの名無しさん:2009/12/14(月) 05:51:45
メイン関数は書いた方が良いのでしょうか?
200デフォルトの名無しさん:2009/12/14(月) 06:07:46
>>198
リファレンスより
If used with no arguments,
subsequently defined methods become module functions.

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

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

そういう意味なら、書けない、でFA
そんな取り決めないし
202デフォルトの名無しさん:2009/12/14(月) 07:36:02
>>199
def main() しとけばRubyがエントリポイントとして呼んでくれる、とかいうことはないよ
ただ if __FILE__ == $0 ... って常套句を使って少し似たようなことはできる
203デフォルトの名無しさん:2009/12/14(月) 08:32:24
>>199
ruby -e 'p self'
204デフォルトの名無しさん:2009/12/14(月) 08:53:07
俺最初なんとなくmainてメソッド書いて
if __FILE__ == $0
main
end
って書いてたな
205デフォルトの名無しさん:2009/12/14(月) 11:18:57
>>200
これでもいいなぁ。
ttp://ruby-doc.org/core/classes/Module.html#M001642
ですね。

初心者はドキュメントのどこを見ればいいかも分からないので、とても助かります。
206デフォルトの名無しさん:2009/12/14(月) 11:43:32
>>199
いろんなソース読んだ限り、
Rubyではこんな感じで書いている人が多い。俺も習ってる

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

if __FILE__ == $0
  Application.new.run
end
207デフォルトの名無しさん:2009/12/14(月) 13:15:18
待て、$0って廃止予定じゃなかったか
208デフォルトの名無しさん:2009/12/14(月) 13:29:31
心配なら$PROGRAM_NAMEを使っておけ。
209デフォルトの名無しさん:2009/12/14(月) 13:30:08
あと10年は1.8使い続けるから無問題
210デフォルトの名無しさん:2009/12/14(月) 13:33:57
まあ、$0 が動かなくなる頃にはそのスクリプト本体もどっか手入れしないと動作しないとは思う
そのときにその人に直してもらうことにして $0 は使ってもよし
$PROGRAM_NAME はバージョンによらず使えるんだっけ?
211デフォルトの名無しさん:2009/12/14(月) 13:38:35
質問が有ります。

引数があれば引数で指定したファイルに
引数がなければ標準出力(もしくはエラー出力)に文字列を出したい場合はどのように書いたものでしょうか?
212デフォルトの名無しさん:2009/12/14(月) 13:46:34
そのまんま if とかで書けばいいと思うよ!
213デフォルトの名無しさん:2009/12/14(月) 13:48:20
if (ARGV[0])
$stdout = File.open ARGV[0]
end

こんな感じニカ ?
214デフォルトの名無しさん:2009/12/14(月) 13:51:15
こんな感じか
if ARGV.length > 0
   f = open(ARGV[0], "w")
else
   f = $stdout
end
f.write "hello"
215デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/14(月) 13:55:43
> closeめんどくせえ
うむ
$stdout.close がIOError で拒否られたときは軽く眩暈がした
217デフォルトの名無しさん:2009/12/14(月) 17:25:48
>>211
個々のプログラムでそういうことをするより
シェルのリダイレクトやパイプを使いなさいと言いたいのだが

出力先をプログラムの引数として受け取らなければならない理由はなんだろう?
218デフォルトの名無しさん:2009/12/14(月) 18:09:37
STDOUT にログ出力をするタイプのプログラムはたいてい引数指定
たとえば wget
219211:2009/12/14(月) 19:36:53
>>212-215
ありがとうございます、ありがとうございます
いろいろ方法ありますね。

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

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

>>218
wgetは引数でファイル指定でしたっけ
220デフォルトの名無しさん:2009/12/14(月) 20:14:48
wget -O
221デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/14(月) 20:24:17
>>221
基本的には「ない」
61s が 1m1s になるような、秒数のみを表すクラスというようなのは標準では存在しない
223デフォルトの名無しさん:2009/12/14(月) 20:25:23
>>221
Time.at(0).to_i
224デフォルトの名無しさん:2009/12/14(月) 20:26:07
>>222
そういうことか、>>223は忘れて
225221:2009/12/14(月) 20:35:18
ありがとうです

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

誰かそういうの作ってないか探してみたんですがどうも無いようで・・・。
active_supportとかの日付の拡張あたりでなんとかならないもんですかね。
226デフォルトの名無しさん:2009/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]

こんなんでいいか?
227221:2009/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デフォルトの名無しさん:2009/12/14(月) 22:30:38
二年ほど前にdevでTimeSpanというクラスが提案されたことはあるみたいだねー。
立ち消えしてるのかな、これは。
229デフォルトの名無しさん:2009/12/14(月) 22:34:40
.NETからそのままいろんなクラスパクってくりゃいいのに
230デフォルトの名無しさん:2009/12/14(月) 22:36:53
やだあんな使いにくいAPI
.NET好きな人はIronRuby使ったらいい
231デフォルトの名無しさん:2009/12/15(火) 00:52:12
数値積分や微分できるようなライブラリとかってないですか?
Rubyを関数電卓代わりに使いたいんですけど
232デフォルトの名無しさん:2009/12/15(火) 00:58:10
パッチレベル上がったのにmingwでmake通らん
233デフォルトの名無しさん:2009/12/15(火) 01:01:41
>>231
よくわからんけど「Ruby 数値積分 微分」でぐぐってみた
ttp://jp.rubyist.net/magazine/?0006-RLR
こっちは結構すごそうだぞ
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/39950
234デフォルトの名無しさん:2009/12/15(火) 01:01:55
GSL(GNU Scientific Library)のRubyバインドがあるようだ。
詳しくは見ていないけど、数値積分や微分はあるみたい。
ただし、最後のリリースが約2年前というのが気掛かり。
十分枯れているのだろうけれど、新しめのRubyで動くかは不明。

ところで、本格的な数式処理なら、Maximaとか使ったほうがいいんじゃない?
235デフォルトの名無しさん:2009/12/15(火) 01:05:33
かぶりんこ。
236デフォルトの名無しさん:2009/12/15(火) 01:43:08
ありがとうございます
導入めんどくさそうですけど頑張ってみます
237デフォルトの名無しさん:2009/12/15(火) 02:03:40
数値積分や微分できるような関数電卓を持っていたら、それを使う。
でなければ、カシオの計算センターとか。
自前のコードからコールしたいなら、ついでにそっちも自分で書いてしまう。
てのは、いかがでしょう。
238デフォルトの名無しさん:2009/12/15(火) 06:35:31
>>219
> ファイルには出したくないBenchmarkとかで計測した結果も表示したくなって

標準ライブラリの Logger を使ってみるというのは?
http://jp.rubyist.net/magazine/?0008-BundledLibraries
239デフォルトの名無しさん:2009/12/15(火) 09:20:54
いわゆる数値計算には向かないよね、Ruby
240デフォルトの名無しさん:2009/12/15(火) 09:53:38
しかし、「5分で作って5秒で実行させる」ような、「計算機なんだから計算できてもいいんじゃね」という
カジュアルなデータ計算をさせることが期待されるプログラミング言語のトップグループにいることは間違いない
専門数値計算ソフトやC(やJava)を持ち出さなくてもいい程度の計算なら、もっと気楽にできてもいい
高校や大学1年教養の宿題をうっかり解けてしまうような、そんな用途があってもいいはず
241デフォルトの名無しさん:2009/12/15(火) 10:06:28
そういう用途ならあるげぶらーじゃね
242デフォルトの名無しさん:2009/12/15(火) 10:09:15
Rでもいいしますまてぃか覚えるのでもいいしいっそExcelでも充分使える範囲である可能性も高いな
243デフォルトの名無しさん:2009/12/15(火) 10:20:55
カタカナでおk
244デフォルトの名無しさん:2009/12/15(火) 10:28:35
アールやエクセルってなんか変だろ
245221:2009/12/15(火) 15:52:28
>>238
ああ、その手もありました!その名のとおりログのこりますしLoggerいいですねw
246デフォルトの名無しさん:2009/12/15(火) 15:56:00
数値計算したいんなら構文的にPython+numpyのほうがいいよ。Rubyには不向き。
247デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/15(火) 18:47:01
ていうか、やろうと思えば結構できるんだよ
でも自己責任の域を出れない
249デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/15(火) 19:03:50
>>249
初心者は Ruby1.9 使うなってこれだけ言われてるのになんでわからんのだエラー
251デフォルトの名無しさん:2009/12/15(火) 19:08:17
それってスクリプトつーか内部文字列がWindows-31Jで標準入力がASCII-8BITってこと?
Windows-31Jがロードできたら標準入力もそっち使うようになってなかったっけ
どういうときにそんなことになりえるのか知りたい、誰か教えて
252デフォルトの名無しさん:2009/12/15(火) 19:08:20
スレタイに【1.9】 【使うな】っていれとけよ
253デフォルトの名無しさん:2009/12/15(火) 19:21:35
【Windows】【使うな】とか
254デフォルトの名無しさん:2009/12/15(火) 19:36:02
順番からいって標準入力がWindows-31Jか、なんでスクリプトがASCII-8BITになったんだろう?
とりあえず>>249は1.9使い続ける気ならマジックコメントを使えるようになるべき
255デフォルトの名無しさん:2009/12/15(火) 19:38:08
MCって一番やっちゃいけないタイプの変更だよな
256デフォルトの名無しさん:2009/12/15(火) 19:50:04
スレチだが微積やってくれて感動した
http://www.wolframalpha.com/
257デフォルトの名無しさん:2009/12/15(火) 19:52:31
258デフォルトの名無しさん:2009/12/15(火) 20:10:57
>>255
じゃあファイルごとに違う文字エンコーディングをインタプリタに知らせる方法を考えてくれ
259デフォルトの名無しさん:2009/12/15(火) 20:18:58
いいこと考えた、ファイルは全部ASCII-8BIT相当にするってのはどう
260デフォルトの名無しさん:2009/12/15(火) 20:25:36
これでますますPythonへの移行が加速しちゃうな。
マイナー環境に媚びすぎるあまり全員が等しくLoseしちゃうなんてあまりにも悲しい。
261デフォルトの名無しさん:2009/12/15(火) 20:27:49
>>259
それ 1.8 じゃん…
262デフォルトの名無しさん:2009/12/15(火) 20:29:51
やっぱ今からでもせめてデフォルトUTF-8に
263デフォルトの名無しさん:2009/12/15(火) 20:32:17
>>262
マッキン使えマッキン
264デフォルトの名無しさん:2009/12/15(火) 20:36:27
UTF-8-MACはUTF-8じゃありませんっていうか今すぐ滅びてくださいお願いします
265デフォルトの名無しさん:2009/12/15(火) 22:35:13
>>264
Pythonはもろそれにぶつかったな。よくそれではまったよ。

あのさ、require 'foo' したときの、foo.rb または foo.so の在処をしるにはどうしたらいいんだっけ。
よく聞かれる質問だと思うけど、だれか教えて。
266デフォルトの名無しさん:2009/12/15(火) 22:44:32
1.8.6と1.8.7の違いってどこかにまとめられてますか?
267デフォルトの名無しさん:2009/12/15(火) 22:47:55
>>265
前スレでみたのは
gem which foo
268デフォルトの名無しさん:2009/12/15(火) 22:57:27
$" または $LOADED_FEATURES
269デフォルトの名無しさん:2009/12/15(火) 23:04:43
>>267
それは求めるものじゃないなー

>>268
それはファイル名だけだよね。ディレクトリ名も含めたパスが欲しい。
270デフォルトの名無しさん:2009/12/15(火) 23:10:31
それは提供されてない
271デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/15(火) 23:45:36
273デフォルトの名無しさん:2009/12/15(火) 23:59:23
>>272
Thanks.

わーおEnglishじゃん!開発者は日本人が多いのに、ぷんぷん!
274デフォルトの名無しさん:2009/12/16(水) 00:05:46
>>272
ていうか、これ読んで分かるの開発陣だけだから。
Ruby利用者がよんでもわけわからん。
275デフォルトの名無しさん:2009/12/16(水) 00:12:20
これを元にした噛み砕いたユーザー向け解説というのを誰か第三者が作ってきちんとフォローすべきなんだ
でも、Ruby(特に日本の)ではそういうのが特にないんだよね
商売っけがないというか、目立ちたがり屋がいないというか

ちなみにオフィシャルの仕事ではないのでこれ以上は望んじゃ駄目よ
取り巻きの役目
276デフォルトの名無しさん:2009/12/16(水) 00:15:59
user visible feature changes と書いてあるんだが…
277デフォルトの名無しさん:2009/12/16(水) 00:18:07
これとRubyリファレンスマニュアルを併用すればきっと・・!
278デフォルトの名無しさん:2009/12/16(水) 00:18:17
るびきち氏の日記に載ってたのはリリース当時欲紹介されてた気がする。
ttp://d.hatena.ne.jp/rubikitch/20080508/ruby187
279デフォルトの名無しさん:2009/12/16(水) 00:31:54
>>278
神いわゆるゴッド
280デフォルトの名無しさん:2009/12/16(水) 01:55:08
>>275
>ちなみにオフィシャルの仕事ではないのでこれ以上は望んじゃ駄目よ

なんで?

ちなみにPythonはα版でもこれだけの出来。
ttp://docs.python.org/dev/whatsnew/2.7.html

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

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

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

まあ初心者スレ向けでないのとドキュメント揃ってるほうだと言ってる人間が障害になってるのには同意
283デフォルトの名無しさん:2009/12/16(水) 10:33:28
rubyの勉強をしろと言われ、perlのプログラムを渡された
雰囲気は似てるからrubyに書き換えて動作させてみろという
perlもrubyもほとんど触ったことない俺にどうしろっていうんですか…
書き換え方にコツとかあるんでしょうか?元のperlプログラムにはサブルーチンにハッシュやら配列やらが結構混ざって泣きそう
284デフォルトの名無しさん:2009/12/16(水) 10:43:08
>>283
とりあえず元のプログラムが何をするものなのか理解しないことには
始まらないと思われ
285221:2009/12/16(水) 11:02:32
>>247
ありがとう。24時間は超えてしまうのでTimeはやはり使わない方向でいきます
286デフォルトの名無しさん:2009/12/16(水) 11:06:02
質問です。
Rubyで簡単なGUIアプリを作ろうとしているのですが、現在何がオススメでしょうか?
環境は、Ruby 1.8.7、Windowsです。

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

下記サイトでは、shose(why氏とともにサイト死んでる?)、Ruby-GNOME2、wxRubyがよく使われているとありますが、
みなさんは何を使われてますか?
Ruby GUI調査2008
http://www.pressure.to/ruby_gui_survey/index-ja.html
287デフォルトの名無しさん:2009/12/16(水) 11:14:52
>>286
> Rubyで簡単なGUIアプリを作ろうとしているのですが、現在何がオススメでしょうか?
RubyではGUIアプリケーションは作らない
288デフォルトの名無しさん:2009/12/16(水) 11:15:28
Windowsで1.8でexe単体なら自分だったらvruby+Exerb+UPX
でも上の縛りがなければwxRuby+Ocra
あとやったことないけどWebアプリ+RubyStationも面白そう
289286:2009/12/16(水) 11:24:17
shoesはgithubにありましたけど、Javaのprocessingみたいな感じなんですね。ちょっと用途が違うとおもた
samples at master from shoes's shoes - GitHub
http://github.com/shoes/shoes/tree/master/samples/


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

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

webアプリは面白そうなんですが、とりあえず、vrubyとwxRuby試してみます
290デフォルトの名無しさん:2009/12/16(水) 11:26:15
たぶん、GUIというイベントドリブンな概念とRubyの記法が合わないんだと思う
291デフォルトの名無しさん:2009/12/16(水) 11:28:25
イベントハンドラにprocオブジェクトを登録することがごく自然に出来るわけで。
292デフォルトの名無しさん:2009/12/16(水) 11:31:44
実装の便利度に差がありすぎるんだよな
中にはHSPからシェル経由でスクリプト呼んで引数連携させたほうがマシといゲフンゲフン
293デフォルトの名無しさん:2009/12/16(水) 11:43:07
>>271
パスに{}[]が含まれると良くない
294デフォルトの名無しさん:2009/12/16(水) 11:51:03
>>293
一般に使ってもらうならともかく、自分の用が果たせたならそれでいいんじゃないか?
295デフォルトの名無しさん:2009/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] 古いな…
296uy ◆e6.oHu1j.o :2009/12/16(水) 17:55:27
純粋にrubyのレベルをあげたいです
小さなツールとWebアプリケーションとGUIゲームくらいならrubyで作れるようになったんですが
ルビリストと呼ばれるようになる為の次のステップ教えてください
297デフォルトの名無しさん:2009/12/16(水) 18:05:30
いろいろな言語を使う。
とくにRubyのバックグラウンドを育んだLispやSmalltalkを。
298デフォルトの名無しさん:2009/12/16(水) 18:09:09
Lispやれ(EmacsLisp以外ならなんでもいい)
PerlがまだならPerlも齧れ
オブジェクト指向の関係でJavaもできるといいんだが
299デフォルトの名無しさん:2009/12/16(水) 18:12:54
>>296
もの凄い勢いでRuby初心者スレ/本スレ/ruby-list等
あらゆるサイトの質問にコテハンで答えまくる
質の高い回答が数千溜まるとGoogleに雇ってもらえる
300デフォルトの名無しさん:2009/12/16(水) 18:14:14
ルビリストってなんですか?
301デフォルトの名無しさん:2009/12/16(水) 18:27:26
googleって実際優秀な人材だけってわけじゃないんだよねぇ
広告塔の人間もたくさんいるし
302デフォルトの名無しさん:2009/12/16(水) 18:47:10
>>296
>ルビリストと呼ばれるようになる為の次のステップ教えてください

るびまの添削記事を読むのがいいと思う。
ttp://jp.rubyist.net/magazine/?0010-CodeReview
ttp://jp.rubyist.net/magazine/?0011-CodeReview
ttp://jp.rubyist.net/magazine/?0013-CodeReview
ttp://jp.rubyist.net/magazine/?0015-CodeReview
ttp://jp.rubyist.net/magazine/?0017-CodeReview
303デフォルトの名無しさん:2009/12/16(水) 18:51:14
>>282
>人材が究極的に少ないから
>現状に加えて一般向けにドキュメント揃えろなんて言ったらどんどんリリースが遅くなる
>当事者だからという理由だけでできない人に無理やりやらせる理由はない
>得意な人に任せておけばいい

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

どうせ開発リソースが増えたところで、ドキュメントに回すつもりないんだろ。
304283:2009/12/16(水) 19:00:12
昼間は無事だったのに規制が…
283です。
>>284
jcorrectとかいうやつだったかな
プログラムを実行して文章を入力すると、cabochaの解析結果と一緒に文章の校正を促すメッセージが出た
これを実行するためにcabochaとかいろいろ入れてた
プログラムを読んでいると、サブルーチンから値を順に渡していたり$foo->{$var}->とか見たことないのがいっぱいでなんかもうキーーーーってなったんだ…
305デフォルトの名無しさん:2009/12/16(水) 19:06:54
>>303
言ってること自体には賛同できるけどそういうのは本スレでどうぞ
306デフォルトの名無しさん:2009/12/16(水) 23:36:21
質問です。
実行環境:Xubuntu9.10、Ruby1.9.1
使用ライブラリ:tk、pty、expect
やりたいことは、外部プログラム(対話型のCUIプログラム)をRubyスクリプト内から実行する際に、
外部プログラムの実行結果(標準出力。エラーが発生して終了したならその時のエラー出力)
を取得したいのですが、何か方法はあるでしょうか。
ネットを見るとsshやtelnetのサンプルが転がってますが、
sshやtelnetが出力するメッセージ自体やエラー文(はあるのかな?)を処理するようなものがなく、
どうするんだーと悩んでます。
307デフォルトの名無しさん:2009/12/16(水) 23:43:41
シェルからパイプでつなぐ
` ... ` (バッククォート)でコマンド実行して出力取る
手の込んだことがしたければ require 'open3'
308デフォルトの名無しさん:2009/12/17(木) 00:23:55
wxRubyとかGUIアプリの話がでたついでに聞きたいんですけど、
↓みたいにマニフェストをruby/bin/において、Windows XP移行のLuna(?)風のUIにする方法があるんですが、
Ruby on Windows: Windows XP Visual Style Controls with wxRuby
http://rubyonwindows.blogspot.com/2007/10/windows-xp-visual-style-controls-with.html

…うまくいきません。
古いルックアンドフィールのままになります。
上記サイトのxmlをファイルをruby.exe.manifestとrubyw.exe.manifestに新規作成してコピペして、
ruby/binに放りこめばいいんですよね?
309デフォルトの名無しさん:2009/12/17(木) 00:38:30
>>307
ありがとうございます。
標準出力と標準エラー出力に違いがあるのを知らなかったですorz
open3は標準入力・出力・エラー出力のみ対応という形だったので、
except実行→出力結果を一時ファイルに出力→実行元プログラムでopen
という形で無事結果を得られるようになりました。

PTYがttyを別個に作ってそっちで実行させるっぽいのでバッククォート使えない(のかなぁ……)
310245:2009/12/17(木) 11:43:14
logger使ってみているのですが、
Benchmarkの出力結果が余計な改行が入るのですが、これってこんなもん?

time = Benchmark.measure do
:(略)
end
logger.debug Benchmark::CAPTION
logger.debug time.to_s
311デフォルトの名無しさん:2009/12/17(木) 12:21:56
そんなの logger は与り知らんよ
logger は対象のオブジェクトを to_s しての末尾に改行つけて書き出してるに過ぎない
何か問題あるならそのオブジェクトの to_s 調べれ
312245:2009/12/17(木) 13:01:09
>>311
舌足らずでごめんなさい。
puts Benchmark::CAPTION
puts time.to_s
だと改行の問題ないんです。気味が悪いんですが、何でなんでしょ
313デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/17(木) 18:13:47
> puts は文字列末尾に改行があったら自前で改行をつけない
漏れは大変なことを知ってしまった
近いうちに消されるかもしれない
315デフォルトの名無しさん:2009/12/17(木) 18:18:58
xpathって難しい。もっと簡単にできるか?
id('Layer3')//td[
following-sibling::td//a[contains(@href,
'http://money.www.infoseek.co.jp/MnStock')]]/b//font[@color]
316sage:2009/12/17(木) 21:38:37
>>228
trunk には Date::Delta ってのが入ってるよ
317デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/18(金) 06:03:22
質問です。
001
002
のような、3桁の連番を表示したいんですが、どうやればいいんですか。
for i in 001..100
だと
1
2
になるんですが。
320デフォルトの名無しさん:2009/12/18(金) 06:18:23
Rubyらしい書き方ではないかもだが

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

数字の頭に0がつくとRubyでは8進数って意味になるので注意
321デフォルトの名無しさん:2009/12/18(金) 06:23:07
('001'..'100').each{|s| puts s}
322デフォルトの名無しさん:2009/12/18(金) 06:25:56
>>320
見事にできました。
素早い回答どうもありがとうございました。
323デフォルトの名無しさん:2009/12/18(金) 10:03:11
WEBrickで、
・Basic認証またはDigest認証
・IPアドレスによるアクセス制限
を実現したいのですが、サンプルとか参考になるページがあれば教えてください。
「WEBrick IPアドレス 制限」とかでぐぐったけど、それらしいのはヒットしませんでした。
324デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/18(金) 11:10:43
認証
WEBrick::HTTPAuth::BasicAuth
WEBrick::HTTPAuth::DigestAuth

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

326デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/19(土) 12:29:26
>>326
http://www.ruby-lang.org/ja/man/html/trap_Hash.html

ぶっちゃけRubyの怪しげな機能は使わないほうがいいと思う
328デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/19(土) 12:39:22
>>328
> p h[2].object_id == h[2].object_id
これうち(1.8.7cygwin)でやるとtrueになるんだが1.9で変わったとか?
330デフォルトの名無しさん:2009/12/19(土) 12:42:53
>>326
それだとh[1]の参照先(初期値オブジェクト[])に2を入れてることにしかならない

h[1] = ほげほげ
としない限り
{1=>ほげほげ}にはならない
331デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/19(土) 15:45:53
>>331みたいな人ってソース中のコメントもほぼかかなそうだよな
333デフォルトの名無しさん:2009/12/19(土) 16:35:24
>>332は初心者
334デフォルトの名無しさん:2009/12/19(土) 16:59:49
まあ初心者スレだしな
335デフォルトの名無しさん:2009/12/19(土) 17:53:52
結局>>328は間違ってるということかい?
336デフォルトの名無しさん:2009/12/19(土) 18:26:49
new(初期値)で生成されたハッシュに存在しないキーでアクセスした場合の挙動は、
同じオブジェクトが返るというのが正しく、
毎回異なるオブジェクトが返るというのは誤り。
337デフォルトの名無しさん:2009/12/19(土) 18:37:34
質問するならリファレンスマニュアルくらい読んでからこい
338デフォルトの名無しさん:2009/12/19(土) 18:47:27
初心者スレ的には
「マニュアルのここ読めわかりやすくて疑問の余地無し氏ね」
と言える環境を揃えるほうが先な気もする
339デフォルトの名無しさん:2009/12/19(土) 23:53:39
>>328
それは初期値じゃなくて初期ブロックじゃないのか?

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

未設定のキーを指定された時に、そのつどブロックを実行した結果を返す
よって同じキーでも毎回違うArrayが帰ってくる
340デフォルトの名無しさん:2009/12/20(日) 01:14:37
>>338
ようやくたどり着いたと思ったら、

xxxx()
執筆者を募集中

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

なので、動かないものは、自分で書き直すことにしてる。
一から一人でするより、ちょっと近道。
341デフォルトの名無しさん:2009/12/20(日) 05:46:41
>>337
>質問するならリファレンスマニュアルくらい読んでからこい
おまえは書き込むまえに>>1を読んでこい
342デフォルトの名無しさん:2009/12/20(日) 06:50:04
>>341
おまえは書き込むまえに>>1を読んでこい
343デフォルトの名無しさん:2009/12/20(日) 07:39:01
そんなことより俺のIDを見てくれ。どう思う?
344デフォルトの名無しさん:2009/12/20(日) 09:13:46
見えない
345デフォルトの名無しさん:2009/12/20(日) 10:15:45
>>344はバカ
346デフォルトの名無しさん:2009/12/20(日) 10:27:17
まあバカスレだしな
347デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/20(日) 12:48:10
>>347
初心者は Ruby1.9 使うなってこれだけ言われてるのになんでわからんのだエラー
349デフォルトの名無しさん:2009/12/20(日) 12:54:16
>>348が FA なのだが

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

無理しないで Ruby 1.8.7 使え
1.8.7 を理解したあとで差分学習で 1.9.1 を習得するのが一番早い
350デフォルトの名無しさん:2009/12/20(日) 12:57:10
了承、1.8.7にする
351デフォルトの名無しさん:2009/12/20(日) 12:59:15
hpricotはコンパイルが通る程度に1.9対応されてるだけ。
作者の _why the lucky stiff はネット上から失踪しているので、事実上塩漬け状態。
352デフォルトの名無しさん:2009/12/20(日) 16:02:52
質問
rdoc が生成する HTML について、特定の要素(例えば <pre>タグ)のスタイルだけ
いじりたいという場合はどうしたらいいのでしょうか?
353デフォルトの名無しさん:2009/12/20(日) 16:27:02
>>352
ちょっと見た感じでは rdoc に --template オプションで
自作のテンプレートを指定してやればいいんじゃまいか

既存のテンプレが rdoc/genarators/template/html に入ってるから
それを部分的に書き換えて使えばよさそう
354デフォルトの名無しさん:2009/12/20(日) 19:17:36
whyさん死んじゃったからNokogiri推奨だと思うけど、
>>347がhpricot使いたいと思った理由はなんだろ
355デフォルトの名無しさん:2009/12/20(日) 19:20:40
え、whyって死んじゃったの?
もしそうならHpricotきめえとかdisるのやめて冥福を祈る
356352:2009/12/20(日) 19:31:28
>>353
ありがとうございます。
ベースになるテンプレートを選んで、それに改変を加えたものを使おうと思います。
357デフォルトの名無しさん:2009/12/20(日) 20:19:30
ネットワーク的に、ね。
自分できれいさっぱり痕跡を消していった。
358352:2009/12/21(月) 15:57:51
追記
rdoc の --style オプションにスタイルシートのパスを渡すことで
HTML生成時に自前のスタイルシートを読み込ませることができました。

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

でうまくいきました。
というか、manページに普通に書いてあったorz
359デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/21(月) 22:21:13
行番号というメタ情報があれば取得できるよ
ないならできない
自分で行番号だと思うものを作って数えるしかない
361デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/22(火) 09:39:08
jrubyでmechanize使えている人います?hpricotのjava版使うしかないんでしょうか?
363デフォルトの名無しさん:2009/12/22(火) 09:45:49
>>361みたいに例示依存の回答する人なんなの
364デフォルトの名無しさん:2009/12/22(火) 10:39:36
>>361 欲しいのは行番号であって、例文なんかどうでもいいんだが
365デフォルトの名無しさん:2009/12/22(火) 11:00:20
例題コードを添削するのはどうかとw
366デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/22(火) 11:21:49
save = Dir.pwd
Dir.chdir "./data"
# 作業
Dir.chdir save
とかかな

同じディレクトリにあるファイルを使うってことなら
open(File.dirname(__FILE__)+"/1.txt")
でもいいかも
368デフォルトの名無しさん:2009/12/22(火) 11:34:12
Pythonのdirみたいに、あるオブジェクトが持ってるメソッドと変数を一覧するものってありますか?
369デフォルトの名無しさん:2009/12/22(火) 11:36:29
>>367
それでいけそうです
ありがとうございます
370デフォルトの名無しさん:2009/12/22(火) 11:37:30
puts Object.methods

ソートするとなおみやすい
puts Object.methods.sort
371デフォルトの名無しさん:2009/12/22(火) 11:41:30
Object#methods
Object#instance_variables
372デフォルトの名無しさん:2009/12/22(火) 12:00:57
>>370-371 ありがとうございます!
これが欲しかった。
373デフォルトの名無しさん:2009/12/22(火) 12:36:02
>>359
Nokogiriの要素は #line メソッドがあるはず。
374デフォルトの名無しさん:2009/12/22(火) 14:41:59
>>367
Dir.chdir "./data" do
# 作業
end

でもいけるよ。
375デフォルトの名無しさん:2009/12/22(火) 14:46:45
>>374
おお知らなかった
もっかいリファレンス見直すことにしよう
376デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/12/23(水) 11:29:21
コマンド直叩きするときは ruby -Ilib test/test_xxx.rb とする気がするが、
普段はrakeのTestTask任せだから、どうやってるか意識してないわ。

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

なお、rakeの場合、test/ の中で起動しても、ディレクトリを遡ってRakefileを
探して、見つかったディレクトリで動くので、hoge/Rakefileとして置いている
場合は、実質的には hoge直下でやってることになるはず。
378デフォルトの名無しさん:2009/12/23(水) 11:52:34
ruby test/test_hoge.rb とかやりたいなあ
テストするためだけに test/ に降りてしまうのは、どうも…
379デフォルトの名無しさん:2009/12/23(水) 11:54:14
そのへんは、helper.rb をどうやって読むかの一点にかかってる気がしてならない
380デフォルトの名無しさん:2009/12/23(水) 11:55:55
ファイルいっこテストするだけなのにrakeはないわー
381デフォルトの名無しさん:2009/12/23(水) 12:04:42
rake test TEST=test/test_hoge.rb でファイル一個か。
382デフォルトの名無しさん:2009/12/23(水) 13:39:33
テスト実行するのにコマンド売ってるのかよ。
autotestでファイル保存と同時に自動でテスト実行だろJK
383362:2009/12/23(水) 13:40:52
JRuby 1.4でNokogiri対応になったみたいですね。失礼しました。
384デフォルトの名無しさん:2009/12/23(水) 13:52:22
>>382
テストが通らないタイミングでファイルを保存したりしないの?
というか編集途中で保存し辛くなりじゃん
385デフォルトの名無しさん:2009/12/23(水) 13:54:01
なるじゃん
386デフォルトの名無しさん:2009/12/23(水) 14:12:02
ファイルいっこのテスト方法がないわけじゃなかろう
autotestを使うかどうかとはまた別の議論だと思う
387デフォルトの名無しさん:2009/12/23(水) 15:17:10
>>382
コードを保存したいタイミングと、テストを走らせたいタイミングは別じゃね?
エディタからテストを実行させられればそれでいいけどなあ。
わざわざ保存したときに勝手にテストが走ってほしくないよ。
388デフォルトの名無しさん:2009/12/23(水) 18:03:22
かりに毎回毎回コマンドラインからテストするとしても
シェルの履歴ぐらい使うだろう。
389デフォルトの名無しさん:2009/12/23(水) 18:27:27
秀丸とかサクラエディタとか外部コマンドを
実行できるテキストエディタを使うがよろし。
俺はVim使ってるけど。
390デフォルトの名無しさん:2009/12/23(水) 18:36:19
俺はタブ機能付きの端末エミュレータ使って
右端のタブをテスト用に使ってる
タブ切り替えにキーを割り当ててやるとかなり快適だ

同じ用途で GNU Screen とか使ってる人もいるのでは?
391デフォルトの名無しさん:2009/12/23(水) 19:41:16
auto-save-buffersつかってるとautotestは使えない
392デフォルトの名無しさん:2009/12/23(水) 21:51:25
>>387
そうかー、その品は人それぞれだな。

autotest連携で結果をSnarl(今ならGrawlか?)で通知出したり、サウンド出したりしてるけど
けっこう快適よ?
ただ、coLinuxで動かすとその辺の連携がしにくくて困る

さらに、AutoHotKeyで保存キー入力と同時にブラウザリロードとかもやってる。
393デフォルトの名無しさん:2009/12/24(木) 01:40:48
自動保存+すきあらば無意識で手動保存してるから、
保存とか意識したことがないなー。
394デフォルトの名無しさん:2009/12/24(木) 09:39:55
warning: Insecure world writable dir /home in PATH, mode 040777
という警告がでて困ってます。
この警告だけを出さないようにする方法があれば教えてください。

home のパーミッションが 777 なのがおかしい!といわれればそうなんですけど、
下請けにはそんなことすら変更する権限がないんです。

395デフォルトの名無しさん:2009/12/24(木) 09:47:09
>>394
知らんよ
RailsはRailsスレで
396デフォルトの名無しさん:2009/12/24(木) 10:47:41
>>394
環境を詳しく

もしRailsなら権限くれっていえ。まともに開発できんから
397デフォルトの名無しさん:2009/12/24(木) 11:31:38
>>394
ENV['PATH']から /home を抜け。
398デフォルトの名無しさん:2009/12/24(木) 11:33:56
ENV['PATH']つーか、rubyを実行する前だからシェルの環境変数PATHね。
399デフォルトの名無しさん:2009/12/24(木) 11:52:12
>>395
なぜRails?

>>396
環境はlinux 2.6.9-89.EL, ruby 1.8.7-p174です

>>397
$PATHには/homeがないけど、/home/username/binがあります。
これを除くことはできないので、どうしたもんか困ってます。

400デフォルトの名無しさん:2009/12/24(木) 12:28:44
フルパスで実行するようにすれば除けるんじゃないの?
401デフォルトの名無しさん:2009/12/24(木) 12:32:16
あくまでrubyに伝わるPATHだけ変わればいいので、

* コマンドの環境だけ変える。
PATH=/usr/bin:/bin(などなど) ruby 引数
とか

* 一度変えて戻す
OLD_PATH=$PATH
PATH=/usr/bin:/bin(などなど)
ruby 引数
PATH=$OLD_PATH
とか

* サブシェル内で変える
(
PATH=....
ruby
)

とかでもいい。
402デフォルトの名無しさん:2009/12/24(木) 16:39:54
RubyGemsで依存関係を調べる方法ないですか?
gem dependency を使ってみているんですがうまくいきません。

$ gem dependency mechanize -v "0.9.3" --remote
Gem mechanize-0.9.3
nokogiri (>= 1.2.1, runtime)
hoe (>= 1.12.2, development)

$ gem dependency mechanize -v "0.9.0" --remote
No gems found matching mechanize (= 0.9.0)

$ gem dependency mechanize -v "<0.9.0" --remote
Gem mechanized_session-0.0.2
mechanize (>= 0.9.3, runtime)
hoe (>= 2.3.3, development)

何がやりたいかというとmechanizeでnokogiri非依存のバージョンを探したいのです。
403デフォルトの名無しさん:2009/12/24(木) 16:56:21
>>402
WWW::Mechanize.html_parser = Hpricot
404デフォルトの名無しさん:2009/12/24(木) 17:04:10
>>402
libxml2 に依存したくないというのなら>>403
Nokogiri のインストール自体を dependency 経由で行って欲しくないというのなら、Mechanize 0.8.4 かそれ以前が必要
405402:2009/12/24(木) 17:13:20
即レスありがとうございます。

>>403
あー、いや、Bundlerで利用しようとしておりまして、
実行環境ではNokogiriが動かないため依存段階そのものから外したいのです。

# 実際はappengine-jrubyでmechanizeを使いたいという難儀なアレなのです
# jruby版Nokogiriはffi依存のせいでappengineでは動かんのですわ・・・
appengine-jruby - Project Hosting on Google Code
http://code.google.com/p/appengine-jruby/

>>404
ありがたい
0.8.4ですね、試してみます。

後学のために聞きたいのですが、こういうのってどうやって調べられるもんなんでしょうか?
以前はgemコマンドでgemのパッケージ時の設定を見る方法があったような気がしたのですが、どこいったんでしょう?
406402:2009/12/24(木) 17:16:34
>>405 の前半の説明が足りないので補足。
mechanize 0.9.3では >>403したいところなんですが、
require 'mechanize'
するだけでffiねーぞゴラァ(appengine版のjrubyでは含まれてないためらしいです。pure java版Nokogiriが望まれます)
のエラーがでてしまうのです。
407デフォルトの名無しさん:2009/12/24(木) 17:20:09
>>405
何もしてない
賞味3分の力技
add_dependency から Nokogiri が消えるまで mechanize.gemspec の github 履歴を直接調べて遡った
408デフォルトの名無しさん:2009/12/24(木) 18:55:35
参考までに聞きたいのですが、
長くなり過ぎたメソッドチェーンの途中に改行を入れる場合、
皆さんはどこで改行するのが適切だと思いますか?

1) ピリオドの後に \
value = this.is.a.\
very.long.method.chain

2) ピリオドの前に \
value = this.is.a\
.very.long.method.chain

3) そもそも途中で改行しない

value = this.is.a
value = value.very.long.method.chain
409デフォルトの名無しさん:2009/12/24(木) 19:03:30
>>408
長くなりすぎたと感じる時点で「よくないコードの匂い」なので、リファクタリング開始
410デフォルトの名無しさん:2009/12/24(木) 19:13:53
>>408
メソッドチェーンでは改行は入れない
今更80文字制限などとは言わないが、メソッドチェーンで長い場合は途中変数で分ける
該当するとすれば3
411408:2009/12/24(木) 19:16:52
>>409
長くなり過ぎた場合という表現にちょっと語弊があったかも知れません。
実際にはメソッドのブロック付き呼び出しが2〜3続くような場合で
どうしても1行には収まらない場合、です。例をあげると

files = Dir.glob("**/*.rb").select {|file| ... }.reject {|file| ... }.map {|file| ... }

のようなパターンです。
412402:2009/12/24(木) 19:18:31
>>407
ΩΩΩな、なんだってー。恐れ入りました。そんな手がw

gem dependencyやgem specコマンドは--remoteのときには最新版からしかとれないんですね。
一旦gemをインスコしたらOK見られるようですが・・・
413デフォルトの名無しさん:2009/12/24(木) 19:19:43
>>408 >>411
files = Dir.glob("**/*.rb").select {|file| ... }.
    reject {|file| ... }.map {|file| ... }

って俺はやってるな
414デフォルトの名無しさん:2009/12/24(木) 19:20:46
>>410
> メソッドチェーンでは改行は入れない

>>411 であげたようなパターンでもそうなのですか?
自分はああいうパターンだとピリオドの後で改行しちゃうのですが、
一般的には推奨されない(マナーの悪い)書き方なのでしょうか
415408:2009/12/24(木) 19:24:34
>>413
ピリオドの後は \ なくてもいいんですよね。
自分の場合意図的な改行であることを明示するために \ を付けてます。

というか、>>411 の例は最後の map が意味的におかしいですね、しまったorz
416デフォルトの名無しさん:2009/12/24(木) 19:29:58
files = Dir.glob("**/*.rb").select{|file|
      ...
    }.reject{|file|
      ...
    }.map{|file|
      ...
    }
417デフォルトの名無しさん:2009/12/24(木) 21:32:51
ワンライナー書いてるならともかく、どっかで区切れよと
なぜそんなにつなぎまくるのかと
418デフォルトの名無しさん:2009/12/24(木) 22:41:13
>>417
自分の場合はつなぐというより、
つながっていくという感じでついつい長くなってしまうw
返値を無駄にしたくないというか

変数の名前を processed_values とかにした場合も名前に引きずられて
途中の状態を入れたくないという雑念が生じ、無理してでも一連のチェーンで書いちゃう
419デフォルトの名無しさん:2009/12/25(金) 01:09:13
Ping打ちたいんだけどどう書くの?
420デフォルトの名無しさん:2009/12/25(金) 01:25:21
421デフォルトの名無しさん:2009/12/25(金) 01:35:21
俺もそれ出そうかと思ったけど、ICMP使わないんだよな
422デフォルトの名無しさん:2009/12/25(金) 01:38:51
わかりやすくていいじゃん
423デフォルトの名無しさん:2009/12/25(金) 05:59:43
files = Dir.glob("**/*.rb")
files.reject! {|file| ... }
files.map! {|file| ... }
424デフォルトの名無しさん:2009/12/25(金) 09:08:05
>>423みたいに例示依存の回答する人なんなの
425デフォルトの名無しさん:2009/12/25(金) 09:21:57
実際には存在しないメソッドを使って質問したほうがいいな
426デフォルトの名無しさん:2009/12/25(金) 09:54:59
別にいいんじゃない?
破壊的メソッドが使える状況なのに気づかなかった初心者がいてもおかしくないし
役に立たないならスルーすればいい
回答者にエスパーを要求するっていうのはそういうことだと思う
427デフォルトの名無しさん:2009/12/25(金) 12:03:27
1.9 だと メソッドのピリオド前でも改行できるようになった
複数行のメソッドチェーンのピリオド位置をそろえられるらしい

if とか class とか直後に識別子や式が必須のところは改行しても行が継続するとか
そういう行継続のルールってマニュアルあるの?
428デフォルトの名無しさん:2009/12/25(金) 12:16:41
従来のルール
「改行までの箇所を読んで完結していると見なされる(パースできる)ことがないなら改行OK」
に追加されたのは「メソッド呼び出しのピリオドの前もOK」だけのはず。

429デフォルトの名無しさん:2009/12/25(金) 12:18:40
あれ、>>428 のルールだけでは
class Hoge
で改行が許されるのは説明できないのか。
430デフォルトの名無しさん:2009/12/25(金) 15:44:18
>>429
ん? 説明できてるように思うけど
class Hoge って end で閉じるまで完結しないでしょ
431デフォルトの名無しさん:2009/12/25(金) 16:16:30
1.8.7p174

puts 1+
2
これは3と出る。+がまだ完結していないから2までがまとまって解釈される。

puts(1+
+2)
同じく3。

puts 1
+2
これは1までで完結しているから1と出て、+2は単項演算して捨てられる。

puts(1
+2)
これは unexpected tINTEGER, expecting ')'
次の行まで見て完結させてくれないのはどうして?


432デフォルトの名無しさん:2009/12/25(金) 16:22:47
パーサをそんなにいじめるなよ
433デフォルトの名無しさん:2009/12/25(金) 16:57:33
>>431
パーサには puts (1 2) と見えてる(+ は単項演算子と解釈されてる)

puts (1
+ 2)
だといけるかなと思ったが syntax error, unexpected '+', expecting ')' だった
ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]
434デフォルトの名無しさん:2009/12/25(金) 19:49:28
> puts 1
> +2
> これは1までで完結しているから1と出て、+2は単項演算して捨てられる。

↑ここまできたら

> puts(1
> +2)

これは駄目ってわかりそうなもんだろw
435デフォルトの名無しさん:2009/12/25(金) 20:00:39
>>434
kwsk
436デフォルトの名無しさん:2009/12/25(金) 20:05:56
puts(1\
+2)
437デフォルトの名無しさん:2009/12/25(金) 20:08:58
>>434
どうして?
>>436
解決法を求めてるわけじゃないぜ。
438デフォルトの名無しさん:2009/12/25(金) 20:30:44
()の構文は(式)。
(1 と書くと1は完結した式と解釈され、次の行には残りの)しか書けない
ってことでok?
439デフォルトの名無しさん:2009/12/25(金) 20:42:13
ずいぶんしみったれてるな。
'('が出て来たら')'の直前までを式と解釈してくれても良さそうなもんだが
440デフォルトの名無しさん:2009/12/25(金) 21:15:20
Rubyのパーサは(人間にすると)曖昧な解釈だからなw

>>437
puts 1
+2
が駄目なので、演算子を行末におかない場合は次行と連結されないため、式として認識しない、までは認識できるだろう。

なので、次の
puts (1
の時点で次行とは連結されないでその行までで解釈される、と考えられるので、
閉じ括弧がその行にないのでエラーとなる、と

そういうふうに頭がさっと回らない、ということならばあなたがRubyに慣れていないか、
もしくは俺が長い行を複数行に分割するのに慣れすぎているのでそう感じてしまうだけかw
441デフォルトの名無しさん:2009/12/25(金) 21:24:09
puts((3
+ 4)) # => 4
とかRubyって面白いね
442デフォルトの名無しさん:2009/12/25(金) 21:29:45
もろくも崩れ去った俺(=>>438)の推理orz
>>441はどういうことなの?
443デフォルトの名無しさん:2009/12/25(金) 21:42:32
えっ?
ここ初心者スレなんですけど
444デフォルトの名無しさん:2009/12/25(金) 23:05:02
>>443
初心者にも有益な話題じゃない?
式が完結してしまうところで不用意に改行して構文エラーも出なくて
なんでうまく動かないんだみたいな落とし穴を回避するにはこういう知識も必要
445デフォルトの名無しさん:2009/12/25(金) 23:06:30
バッドノウハウに近いと思う
改行が有効な個々の場合を記憶する理由はない
446デフォルトの名無しさん:2009/12/25(金) 23:08:31
初心者は構文解析何それおいしいのだし
妙なところで改行打つような真似もしないだろう
447デフォルトの名無しさん:2009/12/25(金) 23:12:13
結論 とても長い式文でもない限り途中で改行すると見づらいし誤作動の原因になりかねないからやめれ。
448デフォルトの名無しさん:2009/12/25(金) 23:14:12
メソッドチェーンはとても長い式文に入りますか?
449デフォルトの名無しさん:2009/12/25(金) 23:54:41
>>441
puts((3;+4))
と同じ
450デフォルトの名無しさん:2009/12/26(土) 00:29:37
>>444
>>443>>440に対して
初心者スレで何で
>そういうふうに頭がさっと回らない、ということならばあなたがRubyに慣れていないか、
なこと言うのってことだ
451デフォルトの名無しさん:2009/12/26(土) 00:34:38
puts (3;+4) はエラーで
puts((3;+4))は通るのは何で?
452デフォルトの名無しさん:2009/12/26(土) 02:20:30
前者、おそらく”(”がメソッド引数の括弧だと読まれている
引数部に”;”があるのはおかしいからエラー

後者、(3;+4)は4に等しいから、
puts(4)と同じ。もちろん文法的に正しい
453デフォルトの名無しさん:2009/12/26(土) 02:43:20
なぜこんな仕様にしたし
454デフォルトの名無しさん:2009/12/26(土) 04:56:34
括弧の省略を可能にするため、とマジレス
455デフォルトの名無しさん:2009/12/26(土) 07:52:07
>>451
引数を括る括弧と、式としての括弧は別
456デフォルトの名無しさん:2009/12/26(土) 21:00:18
質問です。
include して使われることが想定されているモジュールを書いているのですが
非公開の下請けメソッドの扱いについて悩んでいます。
include先で名前の衝突が起こらないようにするため、以下の方法を考えたのですが……

1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw
2、モジュールメソッドにしちゃう → 非公開じゃなくなるw
3、モジュール内部に Privateモジュールを作り、Private.method でアクセス
→ Privateモジュール自体は非公開にできないけど、includeする側からアクセス
されることはまずないだろう

他にもっとよい方法というか、こういう場合のイディオム、定石のようなものが
あったら教えて欲しいです。
457デフォルトの名無しさん:2009/12/26(土) 22:19:29
>>456
実用上は
>1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw
で十分。それでも心配なら接尾辞もつけるといい。
(もちろん衝突しやすい接頭辞は避けてね)
458456:2009/12/27(日) 08:57:11
>>457
わかりました。接頭辞をつけておくことにします。
あまり長すぎるとうるさくなるんで、
アンダースコア+モジュール名を3文字くらいに圧縮したもの ぐらいでいいかな。
459デフォルトの名無しさん:2009/12/27(日) 09:43:27
インスタンスメソッドである必要がないなら非公開にする必要もないと思うんだけど
個人的には3かな、Hoge::Utilsとか
460デフォルトの名無しさん:2009/12/27(日) 11:37:54
>>456
>1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw

スクリプト言語は変数の型についてはいいかげんだし、カプセル化についてだけ厳密性を求めてもしょうがないと思う。
もともとそういう言語じゃないんだよ、スクリプト言語は。
接頭辞や接尾辞をつけるだけでは衝突する可能性はゼロにできないけど、実用上は問題ないから、それでよしとしてください。
461456:2009/12/27(日) 17:37:52
>>459
> インスタンスメソッドである必要がないなら非公開にする必要もないと思うんだけど
> 個人的には3かな、Hoge::Utilsとか

Helpers とかもそうですね。
外部から利用しても役に立ちそうなメソッドなら積極的にそうすべきかも

>>460
> カプセル化についてだけ厳密性を求めてもしょうがないと思う。
> もともとそういう言語じゃないんだよ、スクリプト言語は。

そういうもんですか。
サブクラスに対して閉じるアクセス制御って今後もできないんですかね
462デフォルトの名無しさん:2009/12/28(月) 01:40:43
>>461
たぶんRubyでのprivateを勘違いしている。
Javaと違うから、マニュアルを読むことをお勧めする。
463デフォルトの名無しさん:2009/12/28(月) 04:42:17
464デフォルトの名無しさん:2009/12/28(月) 06:26:05
>>462
名前の衝突を懸念している時点で勘違いはしてないと思うのだが
465デフォルトの名無しさん:2009/12/28(月) 12:17:10
>>464
「サブクラスに対して閉じるアクセス制御」と言ってる時点で勘違いしてると思う。
466デフォルトの名無しさん:2009/12/28(月) 12:41:29
あればいいのにって話だろ
467デフォルトの名無しさん:2009/12/28(月) 12:45:35
Rubyではアクセス制御はそもそもできない
可視性を決めるだけ
468デフォルトの名無しさん:2009/12/28(月) 16:09:11
>>466
不要です。
以上。
↓はい次の方。
469デフォルトの名無しさん:2009/12/28(月) 16:12:49
↓    本質的にはオープンクラスを諦めないといけない
↓    再オープンできる時点で制御も何もねえよ
470デフォルトの名無しさん:2009/12/28(月) 18:21:24
本質的にはMatzの設計次第
471デフォルトの名無しさん:2009/12/28(月) 20:04:43
サブクラスに上書きされない為にどうしたらいいかって質問なのに
勘違いしてるとか不要とか諦めろとかどーゆー事よ
質問者の方がよっぽどrubyの事を理解してると思うわ
472デフォルトの名無しさん:2009/12/28(月) 20:07:14
Matzに聞いたら、
サブクラスで気をつけれ
っていうに決まってそう
473デフォルトの名無しさん:2009/12/28(月) 20:15:49
>>471
だからシステム的にできねえって
新しいRuby実装を自分で作れば無論可能だが、そういう回答を求めているわけではあるまい
474デフォルトの名無しさん:2009/12/28(月) 20:18:15
>>471
じゃあ、おまいが答えれ
475デフォルトの名無しさん:2009/12/28(月) 20:57:46

set_position x, y, z
get_positionX

みたいなget,set関数を作りました。
setはともかくgetはつけずに

positionX

の方が良いですか。どちらがよりRubyっぽいか教えてください
476デフォルトの名無しさん:2009/12/28(月) 21:00:26
x メソッドや y= メソッドだと都合が悪い?
477デフォルトの名無しさん:2009/12/28(月) 21:06:09
ziki.position = [x,y,z]
puts ziki.position_x

ですか???
そっちの方がRubyっぽいならそれでも良いです
478デフォルトの名無しさん:2009/12/28(月) 21:20:17
混乱してきたので質問を変えます。
AとBについてどちらが良いですか?

A:
(1) my.position = [1,2,3]
(2) my.set_position 1, 2, 3

B:
(1) puts my.position // 配列
(2) puts my.position_x
479デフォルトの名無しさん:2009/12/28(月) 21:39:37
>>478
[x, y, z] の組が頻出なら Struct を使ってもいいかも
Point = Struct.new(:x, :y, :z)
my.position = Point.new(x, y, z)
my.position.x
480デフォルトの名無しさん:2009/12/28(月) 21:48:58
>>478
attr_accessor, attr_writer, attr_reader とかは知ってる?
481デフォルトの名無しさん:2009/12/28(月) 22:07:20
>>479のPointを使って
class My
 attr_reader :position
 def initialize ; @position = Point.new ; end
 def position=(xyz)
  @position.x,@position.y,@position.z = xyz # 要引数チェック
 end
end

my = My.new
my.position = [0,0,0]
pos = my.position
my.position.x = pos.x + 1
482デフォルトの名無しさん:2009/12/28(月) 22:09:56
初心者スレでStruct使うアホは即爆発していいよ
483478:2009/12/28(月) 22:11:56
そんな難しい文法使わないでください。
初心者には理解できません。
484デフォルトの名無しさん:2009/12/28(月) 22:15:23
>>482
お前は永遠に配列の添字アクセスでもやってろ
485デフォルトの名無しさん:2009/12/28(月) 22:23:19
ハッシュで複雑なデータ構造を表現するのは悪らしい。。
486デフォルトの名無しさん:2009/12/28(月) 22:27:43
>>483
>>481 を見て具体的に何が理解できないか書いた方がよいと思われ
487デフォルトの名無しさん:2009/12/29(火) 08:24:31
>>485
Javaの人は引数にハッシュを使うことを理解できません
Struct使う人間の95%がRubyをJavaと勘違いして使っています
488デフォルトの名無しさん:2009/12/29(火) 08:53:28
質問です
[1,2,3] * [2,2,2] = [2,4,6] と書ける裏技無いですか。
ようは2つの配列を要素毎掛け合わせて欲しい
489デフォルトの名無しさん:2009/12/29(火) 09:02:39
>>488
とくにないです

require 'enumerator'
a1 = [1, 2, 3]
a2 = [10, 20, 30]
p a1.enum_with_index.map{|e,i| e*a2[i]} #=> [10, 40, 90]
490デフォルトの名無しさん:2009/12/29(火) 09:04:25
>>488
class Array
 def * other
  m = []
  each_index{|i| m << self[i] * other[i]}
  m
 end
end

裏技だからね。既存の Array#* を使ってるコードがどっかにあって
何が起きても知らないよ。
491デフォルトの名無しさん:2009/12/29(火) 09:36:10
>>487 は x, y, z の組をどう扱うの?
492488:2009/12/29(火) 09:38:30
>>490
いやそれはちょっと……

>>489
うーん、やっぱり無理そうですね。
C++みたいに Array& operator* (const Array& a1, const Array& a2) が定義できると便利なのに
493デフォルトの名無しさん:2009/12/29(火) 12:49:27
a1 = [1, 2, 3]
a2 = [10, 20, 30]

p a1.zip(a2).inject([]){|r,(x,y)| r << x*y}
とか
494デフォルトの名無しさん:2009/12/29(火) 12:53:15
>>491
配列とかでいいんじゃねえの

組として外部に持ち出さなければならないなら
クラスか何か作って名前付けることをそのときに考える
495デフォルトの名無しさん:2009/12/29(火) 16:42:10
eclipseで開発できますか?
496デフォルトの名無しさん:2009/12/29(火) 16:44:38
>>495
そらできる。
497デフォルトの名無しさん:2009/12/29(火) 16:45:55
def foo=
end

と同様に

def foo<<
end

を定義するとコンパイルエラーになるのですが、もしかしてこれはダメなんでしょうか。
その場合はどうすれば???
498デフォルトの名無しさん:2009/12/29(火) 17:07:16
foo= のようなメソッド名は、
obj.foo = ...
のような式のために特別に許されている。
(foo に代入するためには、obj.foo ではなく obj そのものを呼び出す必要があるため)

obj.foo << のような式は、obj.foo の << の呼び出しと解釈されるので、
そういうようなメソッド名はない。

ていうかどういうことがしたいわけ?
499デフォルトの名無しさん:2009/12/29(火) 18:15:34
obj.foo = # 代入
obj.foo << # 追加
がやりたいです。
fooは仮想的な配列でメンバー変数ではありません。
500デフォルトの名無しさん:2009/12/29(火) 18:22:31
Ruby ではオブジェクトの外からインスタンス変数を直接参照したりはできません。
obj.foo は obj.foo() というメソッド呼び出し(が返す値の参照)です。

obj.foo() を定義して、それが返すオブジェクトの << メソッドでなんとかするしかないと思います。
501デフォルトの名無しさん:2009/12/29(火) 18:41:19
あーなるほどそういうふうに見えるのか
502デフォルトの名無しさん:2009/12/29(火) 19:17:45
この場合は変数操作でこの場合変数に偽装したメソッド呼び出し
みたいな使い分けで引っかかるのは理解する

>>495
あまり楽しくない
503デフォルトの名無しさん:2009/12/29(火) 19:22:20
eclipseで開発したとして、実行はどうするんだろうね
Runとかやって、スクリプトが動いても
なんかな、って感じになりそう
504デフォルトの名無しさん:2009/12/30(水) 02:54:55
>>495
もしかして: Aptana
505デフォルトの名無しさん:2009/12/30(水) 11:17:47
<<を定義して配列のように見せかけている例としてはRailsの
ActiveRecordのhas_many関連がありますな。
.classですらArrayと返ってくる徹底ぶり。
506デフォルトの名無しさん:2009/12/30(水) 15:20:41
def foo= x, y, z
end
を定義して
bar.foo = 1,2,3
と呼び出すと
./main.rb:25:in `foo=': wrong number of arguments (1 for 3) (ArgumentError)
というエラーが出るのですが、なぜ引数3つで呼び出しているのに引数の数が間違えている(1?)とか
うちのRuby様はふざけた事を言い出すのでしょうか
507デフォルトの名無しさん:2009/12/30(水) 17:09:05
bar.foo = a, b, c は bar.foo=([a, b, c]) だからです。
bar.foo=(a, b, c) で呼び出してください。
508デフォルトの名無しさん:2009/12/30(水) 17:12:48
syntax error, unexpected ',', expecting ')'
bar.foo=(1, 2, 3)

末尾= の場合は引数1つに限定かしらね?

bar.foo=[1, 2, 3]は
wrong number of arguments (1 for 3) (ArgumentError)
509デフォルトの名無しさん:2009/12/30(水) 17:49:08
>507 それウソ

たぶん>>508が言うように末尾=の場合は引数1個限定だと思う
けど自信ない
510デフォルトの名無しさん:2009/12/30(水) 21:46:36
puts RUBY_DESCRIPTION #=> ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mingw32]
plus = "a".method(:+) #=> #<Method: String#+>
p plus.("b") #=> "ab"

この3行目のシンタックスについてparse.y以外でどこかにドキュメントありませんか?
Method.instance_methodsにそれらしきメソッドが見当たらないのですが,Methodオブジェクトに特有なものなのでしょうか?
511デフォルトの名無しさん:2009/12/30(水) 22:47:00
foo.(arg) とすると foo.call(arg) の意味ということになった。

ttp://jp.rubyist.net/?NEWS-1.9.1.ja の「言語の中核部分」→「新しい文法と意味論」
「.()で#callや#[]を使わずにProcなどを呼べる」
512デフォルトの名無しさん:2009/12/30(水) 22:47:50
メソッドじゃなく、文法(構文)の範囲だから instance_methods では出てこないよ。
Procでも使える。
513デフォルトの名無しさん:2009/12/31(木) 01:32:23
>>509
やはり、呼び出すときには引数が一つしか取れないのだろうか?
でも、定義では3つの引数が必要なので、引数の数が合わないと怒られる

bar.send( :foo=, 1,2,3 )
で、引数三つ与えて呼び出せないこともないけど
なんだか、無意味な感じ
514デフォルトの名無しさん:2009/12/31(木) 06:56:22
dhh

@37signals is already running a few minor apps on Rails 3. We've just started playing w/ porting Basecamp. Exciting times!
http://twitter.com/dhh/status/7208264678

Very tentative target date for Rails 3 beta is end of January. But core is staffed with volunteers, so very much subject to change.
http://twitter.com/dhh/status/7107817801
515デフォルトの名無しさん:2009/12/31(木) 08:32:35
Very tentative target date for Rails 3 beta is end of January. But core is staffed with volunteers, so very much subject to change.
http://twitter.com/dhh/status/7208225785
dhh
516デフォルトの名無しさん:2009/12/31(木) 09:12:32
>>511 >>512
なるほど。
指摘していただいたドキュメントも拝見いたしました。
#callをできるだけ通常のメソッド呼び出しの記法に近づけるため
#[]をオーバーライドするといった努力をしているというのは
耳にしたことがあったのですが,.()もその一環のようですね。

ありがとうございました。
517デフォルトの名無しさん:2009/12/31(木) 22:42:29
Ruby1.9で正規表現のエンコーディングにShift_jisを指定するには
どうすればいいんでしたっけ?

オプションでsを指定すればよかったような気がしたのですが、
p /hogehoge/s.encoding
で#<Encoding:Windows-31J>が帰ってきます。

WindowsXPで
ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mswin32]
です。
よろしくお願いします。
518デフォルトの名無しさん:2009/12/31(木) 23:39:43
Regexp.new('あ.い.う.え.お’.encode('Shift_JIS')) かなあ。
519デフォルトの名無しさん:2010/01/01(金) 07:30:44
明けましておめでとうございます。

>>518
/\p{ASCII}/ という表現を使いたいのでその手法は難しいんです。
今回は関係ありませんが/\x82\xA0/
という表現もその手法だと難しいですね。

マジコメでソースエンコーディングをsjisに指定するって手もあるのですが、
大人の事情でこの手法も避けたいのです。

ハチドリ本を読み返したのですが、p.335には"SJISは、s"って書いてありますね。
なんだかなぁ。

引き続きよろしくお願いします。
520デフォルトの名無しさん:2010/01/01(金) 08:14:35
失礼しました、>>518さんの方法でできますね。
もっとスマートな方法があればいいと思うのですが、とりあえず解決です。

お騒がせしました。
521デフォルトの名無しさん:2010/01/01(金) 14:23:19
SJISのデータを一度読み込んでUTF-8に変換してごにょごにょ
が一番綺麗だと思う。
SJISでしないといけない理由は実はなかったりしないかい?
522デフォルトの名無しさん:2010/01/01(金) 21:58:59
rubyのアンインストール方法ってどうするんでしょうか。
./configure --prefix=/usr/local
make
sudo make install
でインストールしたのを、事情によりきれいさっぱり削除したいです。
523デフォルトの名無しさん:2010/01/01(金) 22:45:28
>>522
特に手段は用意されてない
make -n installでファイルリストを作ってぶん回すぐらいしか思いつかないな
524デフォルトの名無しさん:2010/01/02(土) 02:18:44
標準ストリームに対する文字コードについて教えて下さい。
まだRubyの問題なのか、OSの問題なのかも上手く切り分け出来ていません。 m(__)m

TCPでクライアントと通信するプログラムを作っています。
環境はサーバー側(作っている側)がDebian Lenny(5.03)で、文字コードはUTF-8です。
クライアントはWindows2000のマシンで、文字コードはShift JISです。

コードは次のような感じです。
他にも色々な処理が入っていますが、話を簡単にするため、コードを思いっきり削っています。

> hoge.rb

#! /usr/bin/ruby -Ku

while receive = STDIN.gets

# コマンドを受信した

msg = "受信しました" # UTF-8

# 送信処理
# STDOUT.puts( NKF.nkf('-Ws', msg)) # これだとWindows側にパケットが全く返らない
STDOUT.puts( msg) # これだとWindows側で漢字は化けるけどパケットは返る
end

というような感じです。
何かパケットが来たら、メッセージを返すものです。
(実際にはPostgreSQLを呼び出し、コマンドの結果を得て返しています。)
525524:2010/01/02(土) 02:19:24
このコードはinetdから起動されます。

inetd.confはこんな感じ。

4142 stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/hoge.rb

Rubyで扱っているUTF-8の日本語文字列を、標準ストリームにShift JISで流したいだけなのですが、上手くいきません。
Shift JISで出力しようとすると、STDOUTするところで、何事も無かったかのようにパケットが送信されません。
Rubyはエラーにもならず、その行を飛ばしたかのような挙動になります。

UTF-8のままでSTDOUTへ出力すると、Windows側で文字化けしますが、パケットは返ります。

事情により、Windows側のプログラムには手を入れられません。
どこらあたりから、見直していけば良いでしょうか?

この件の調査修正で、お正月休みも返上です。(TT)
よろしくお願いします。
526524:2010/01/02(土) 02:48:40
あ、ごめんなさい、すっかり書き忘れていました。
Rubyのバージョンは1.8.7です。
よろしくお願いします。
527デフォルトの名無しさん:2010/01/02(土) 04:37:19
require 'kconv'

STDOUT.puts(msg.tosjis)
528524:2010/01/02(土) 12:29:54
>>527
ありがとうございます、しかし状況変わらずです。
NKFとkconvは、挙動が違うのでしょうか??
529524:2010/01/02(土) 12:53:11
>>527
再び524です。

申し訳ありません、確認が足りませんでした。

このmsgには”人の名 ”(漢字3文字+空白14)というように、
ASCIIで20Byte毎に区切って送るという仕様です。
ですが、Windows側には”人の名 ”(漢字3文字+空白11文字)として
届いていて構文チェックで跳ねられていました。

ちょうど空白が漢字の文字数分足りません。

UTF-8からShift JISに変換する時に、漢字とスペースの扱いはどうなるのでしょうか?
何か、特別な処理が必要でしょうか?
以前、EUC-JPとShiftJISでやったときは、問題無かったのですが。

なんとなく光が見えてきました、引き続きよろしくお願いします。
530デフォルトの名無しさん:2010/01/02(土) 13:25:36
どっかに全部コード貼ってから来なさい
531デフォルトの名無しさん:2010/01/02(土) 15:32:50
>>529
utf8では漢字は2バイトではなく3バイト。
http://ja.wikipedia.org/wiki/UTF-8
532524:2010/01/02(土) 17:35:34
>>531
ありがとうございます、解決しました。
結局、SJISに変換してから加工するようにコードを変えました。
UTF-8では、漢字は3バイトなんですね。
勉強になりました。

お騒がせしました。
533524:2010/01/02(土) 22:50:27
>>530
524です、今、デバッグを終えて、正常動作を確認しました。
決め手は>>532さんの「漢字は3バイト」でしたが、結構ポカミスもしてまして、今まで掛かりました。

ごめんね、プロジェクトの規模が大きすぎて、コードは晒せないの…
某自動車会社で、国土交通省に提出する書類を作成するためのシステムです。
Rubyの案件としては、中くらいの規模なんじゃないかな。
わりと重要なシステムで、止まると車が作れません。
Rubyはミッションクリティカルでも大丈夫、信頼が置けます。

pgsqlだったかな、DBIになる前の古いやつ。
それからDBIへの移植だったのですが、なかなか…
pgsqlでEUC-JPだから動いてたっていうコードが結構あって、
思っていたより全然はまりました。

何処へ質問を投げようかと思案したのですが、おまいらに聞くのが一番良い気がして
ここに書かせて貰いました。

あとは1月4日の総合テストを待つのみです。
実際に車を測定する設備が無いので、うちの社内では完全なテストは出来ないんですよ。

何はともあれ、おまいらのお陰で解決しました。
本当にありがとう。

それでは、名無しに戻ります。 m(__)m
534デフォルトの名無しさん:2010/01/03(日) 00:12:17
>>533
身元と案件を特定出来る情報を2chに書くなよ・・・
535531:2010/01/03(日) 00:20:53
>>533
いまのご時勢でRuby/DBIを選択しちゃうセンスは大いに疑問だが、問題が解決してよかったね。
536デフォルトの名無しさん:2010/01/03(日) 00:25:56
> いまのご時勢でRuby/DBIを選択しちゃうセンスは大いに疑問だが

kwsk
537デフォルトの名無しさん:2010/01/03(日) 02:32:44
通報。
538デフォルトの名無しさん:2010/01/03(日) 04:20:45
HTTPProxyを作りたいので
WEBrickでプロキシサーバを作って遊ぶ
ttp://jp.rubyist.net/magazine/?0002-WEBrickProxy
を参考に

require 'webrick'
require 'webrick/httpproxy'

s = WEBrick::HTTPProxyServer.new(
:BindAddress => '127.0.0.1',
:Port => 8080,
:Logger => WEBrick::Log::new(nil, WEBrick::Log::DEBUG),
:ProxyVia => false
)

Signal.trap('INT') do
s.shutdown
end

s.start

と書いて実験してみたところ
リモートからのデータをいったんメモリに貯めてからクライアントへ渡す動作をするようです
この場合巨大なファイル(結構大きいファイルを扱うProxyを作る予定です)を通したときにメモリ消費が
洒落にならないので、読み込んだデータから逐次クライアントへ渡すような動作にしたいのですが
そのような設定は可能ですか?可能であればその方法を教えてください。よろしくお願いします
539デフォルトの名無しさん:2010/01/03(日) 04:50:47
以前、どこかのスレで
python -i
と同じことをする方法を見たのですが、どうやるんでしたっけ?
540デフォルトの名無しさん:2010/01/03(日) 04:57:19
$ irb
541デフォルトの名無しさん:2010/01/03(日) 05:17:07
>>540
違う。
542デフォルトの名無しさん:2010/01/03(日) 09:50:24
ver #=> Microsoft Windows XP [Version 5.1.2600]
ruby -v #=> ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mingw32]

以下の簡易wget風ワンライナをより短くできませんか?

ruby -ropen-uri -e"$><<URI(*$*).read" http://www.example.com/>output
ruby -ropen-uri -e"$>.binmode<<URI(*$*).read" http://www.example.com/hoge.zip>output

短くならなければ「短くならないよ」というご意見や
よりスマートな代替案もいただけたら幸いです。
543デフォルトの名無しさん:2010/01/03(日) 10:07:26
>>542
代替案ということはワンライナにこだわらなくていいんだよね?
若干強引だけどlib/site_rubyにwget.rbライブラリを作ってそのなかに処理書いちゃうとか
ruby -rwget http://www.example.com/ > output
irb.batのようにbinにbat置いてスクリプト実行するとか
rwget http://www.example.com/ > output
544デフォルトの名無しさん:2010/01/03(日) 10:20:40
>>543
早速のレスありがとうございます。
ライブラリ案・バッチ案は個人で使う分にはアリですね。
コマンドもすっきりしますし。

個人的には何もライブラリやファイルをインストール(作成)せずに
Ruby単体で簡易wgetを実現できればいいなと思っています。
あまり実用的な場面はありませんが ^^;
545デフォルトの名無しさん:2010/01/03(日) 10:44:08
>>538
データをストリーミング中継したいということでしょうか?

私はネットワークプログラミングに詳しいわけではないのでアドバイスはできませんが,
googleで "webrick ストリーミング" で検索してみてください。
1件目のブログが参考になるかもしれません。
546デフォルトの名無しさん:2010/01/03(日) 12:22:32
>>539
対話型debugが目的なら -rdebug

対話型インターフェイスが目的なら
while true
print ">"
input = $stdin.gets.rstrip
break if input == "\x04" # ^D
puts input
end

もしくは(GNU Readlineが必要)
require "readline"
while input = Readline.readline(">")
puts input
end

pythonなんて知らんよ
547デフォルトの名無しさん:2010/01/03(日) 13:21:29
OpenGLってDirectXに比べるとプリミティブすぎるというか機能足り無くない?
標準のシーングラフとかあっても良いと思うのだが……
何か無いですか?
548538:2010/01/03(日) 13:46:23
>>545
レスありがとうございます
探していた情報はまさにそれです、ストリーミングも含めて考えていました
逐次転送するような動作は不可ですか・・・(´・ω・`)

以前にsocketで似たような物を実装しようとしたことがあったけどリクエスト/レスポンスの
終了を検出する方法が判らなくて断念・・・il||li ○| ̄|_
549デフォルトの名無しさん:2010/01/03(日) 15:32:50
>>548
webrickを改造する場合にはリファレンスの以下の項が参考になるかもしれません。
Net::HTTPResponse#read_body {|str| .... }
「エンティティボディを少しづつ取得して順次ブロックに与えます。」

TCPSocketを使う場合でも
socket.gets until $_ == CRLF
でヘッダを切り離して
while data = socket.gets
...dataを料理...
end
ではダメですか?
Rubyで終端を気にする必要はなかったように思います。
他に思いつくにはヘッダのContent-Lengthを信用してそのバイト数だけ読み込むとか。
TCP/IPの規格に詳しくないので当てずっぽうですが。
550デフォルトの名無しさん:2010/01/04(月) 01:49:17
windows機でタイマーを実装しようとしてます。
マルチスケジューリングなキッチンタイマーのようなものです。

問題がありまして、
例えば60分後にアラームを鳴らせるというタイマーのプログラムを行ったときに
やっぱりその30分前にもう一個のプログラムを追加したいと思ってもそれを行うためには
常に入力待ち状態である必要があります。
その一方で常に出力待ち状態でないと指定時刻にタイマーを実行することができません。

今は
タイマー入力(空入力も化)待機モード→
1分間のタイマー実行待機モード→
その1分の間に起こるべきイベントがあれば指定時刻にイベントを起こす→
またタイマー入力待機モードに戻る→
以下ループ

というようにユーザに入力によって待機モードを切り替えることでそれらしい動作をさせています。
どのようにすればもっとスマートにこのタイマーを実装できるでしょうか?

一つのスマートじゃない方法はテキストエディタと外部ファイルを使ってこのタイマー入力を行うことかなと思うんですが。(非排他モードでファイルの書き込み読み取りする)
forkがwindows rubyでは使えなくて、そもそも子プロセスを使ったことがないので悩んでいます。
551デフォルトの名無しさん:2010/01/04(月) 01:57:34
http://www1.axfc.net/uploader/Sc/so/70232.txt

しょーもないソースコードですが、文章で書くより伝わりやすいと思うので
よろしくお願いします。
552538:2010/01/04(月) 03:29:30
>>549
レスありがとうございます
WEBrickはソースコードを理解するだけで時間が相当かかりそうな感じなので
改造はあきらめます・・・

バイナリデータをgetsで読み出そうとすると最悪の場合、最後まで読み込んで
しまうように思いますが・・・
Socketの終了が判らない件ですがノンブロックモードで読み出す方法
(sysreadを使う。getsが使えなくなるけど・・・)が判ったのでひとまず解消しました
普通にreadを使うとブロックモードなんで帰ってこない・・・(TT

しかし1セッションに複数のホストへのリクエストとかマンドクセ(´・ω・`)
553デフォルトの名無しさん:2010/01/04(月) 05:32:35
>552
getsはバイト列に$/(普通は0x0A)がでてこなければ
最後まで読み込んでしまうけれど、その確率は気にするほどのものかな
ミッションクリティカルなアプリケーションならしかたないとは思うけど
554デフォルトの名無しさん:2010/01/04(月) 06:17:44
>>550
つ Thread & ConditionVariable
555デフォルトの名無しさん:2010/01/04(月) 12:40:48
あるURLから特定のURLのみを抽出するにはどうしたらいいでしょうか?
例えばhttp://menu.2ch.net/bbsmenu.htmlから"pc11"が含まれるURLを抽出したいです。

require "open-uri"
url = ARGV[0] || "http://menu.2ch.net/bbsmenu.html"
uri = open(url).read
URI.extract(uri, ['http']){
|uri|
puts uri
}

URL自体を抜き出すのは比較的簡単に出来たのですが、特定のURLを抜き出すのってこの状態からどうしたらいいでしょうか?
宜しくお願いします。
556デフォルトの名無しさん:2010/01/04(月) 13:03:47
puts uri if /pc11/ =~ uri.to_s
557デフォルトの名無しさん:2010/01/04(月) 13:05:12
>>555
URI.extract の返値(URI の配列)に対し find_all でいいんじゃない?

str = open(url).read
URI.extract(str, ['http']).find_all {|uri| uri =~ /pc11/ }

正規表現マッチの部分はもう少し厳密にした方がいいと思うので適当に
558557:2010/01/04(月) 13:13:58
返値を変数に格納するの忘れてたw
559デフォルトの名無しさん:2010/01/04(月) 13:20:49
str = open(url).read
URI.extract(str, ['http']).grep(/pc11/)
560デフォルトの名無しさん:2010/01/04(月) 20:31:50
「特定のURLを抜き出す機能」と考えるからわからなくなるんだと思う

配列から特定の条件を満たす要素を抜き出す方法とか
URIオブジェクトのURI構成要素を返すメソッドは何かとか
そういうの調べていったほうがたぶん早い
561デフォルトの名無しさん:2010/01/04(月) 20:41:17
御託はいいから妥当解とっとと出せカス
562デフォルトの名無しさん:2010/01/04(月) 20:43:13
「手抜き」じゃね?
いつ動かなくなるのか不安だ。。
563デフォルトの名無しさん:2010/01/04(月) 20:51:14
どうでもいいけど、
普通はstr = open(url).{|io|io.read}じゃね?
それかstr = URI(uri).readか。
564デフォルトの名無しさん:2010/01/04(月) 20:54:18
>>561
require 'open-uri'
url = "http://menu.2ch.net/bbsmenu.html"
purls = URI.extract(open(url).read, ['http'])
uris = purls.map{|url| URI.parse(url)}.find_all{|uri| /\Apc11\.2ch\.net\Z/ =~ uri.host}

ただ、
 「URLを抽出したあとそれに対して何をしたいのか」
 「本当に抽出したいのは本文のURLではなくて<a href>のリンクなのではないか」
 「貴様は次のレスで「あっあとttp://も抽出したいです」と言うッ!」
とかいうような危惧がないわけでもない

普通にHTMLパーサ通したほうが近道だったり
一般的な適当範囲の正規表現を通したほうがマシな処理だったりしなくもなくもないかも
565デフォルトの名無しさん:2010/01/04(月) 20:56:56
関係ないけど、2chのAPIは糞。
566デフォルトの名無しさん:2010/01/04(月) 21:00:02
そりゃ急いで突貫工事したものをずっと継ぎ接ぎで使ってるからな

これがめちゃくちゃ洗練されて、2chアクセス者全員にdat直読みだけをされるようになっても
本当は運営的にはちょっと困るのよ
567デフォルトの名無しさん:2010/01/04(月) 21:03:29
datはまぁ良いとして、bbsmenu.htmlだけはどうにかして欲しいな。
568デフォルトの名無しさん:2010/01/04(月) 21:03:47
>>566
APIが洗練されたとしても利用者全員がdat読みすることなんてありえんから
後半は全然関係ないだろw
569デフォルトの名無しさん:2010/01/04(月) 21:10:00
>>568
本当に洗練されたWeb経由APIはJavaScriptのみでの実装を許す
API経由で広告を見せて有効に動作させるロジックはまだ発明されていない
今の2chから広告収入外されたら傾くぞ

なんかこう物理的にナナメに傾くだけで済む気もするのがなんか謎な収益だが
570デフォルトの名無しさん:2010/01/04(月) 21:29:00
>>563
まあなんか非常にめんどくさいのだけど

open(path).read は close 忘れが多いので推奨されない書き方
(open(path){|f| f.read} を強く推奨、File.read(path) は Windows のバイナリスイッチが入らなので非推奨)
ただ、open-uri を読み込んだ URL や URI に限っては、
open(uri).read は IO#close 相当を必要としないので妥当安全にたまたま動作する

いや、ブロックつきで書いてもいいけど
っていうかレスしてて気づいたけど本当にたまたま動くんだなこれ

ローカルのファイルを読むことがなくて、簡便な HTTP アクセサとしてしか使用しないのなら
あなたの言うように URI.parse(url).read するのがいちばんではあるっていうかお前ら初心者スレで手を抜くな
571デフォルトの名無しさん:2010/01/04(月) 22:11:39
>>570
手を抜くな、と言われましても、2chの手抜きAPIに対して
真面目にプログラミングする気がしませんん。
572デフォルトの名無しさん:2010/01/04(月) 22:16:54
手抜きAPIを調教して俺色に染めてやんよ
573デフォルトの名無しさん:2010/01/04(月) 22:19:33
そもそも2ちゃんのそれはAPIなんかじゃない無いだろw
一時期XML吐こうぜみたいな動きがあったみたいだけど、
「やっぱだりぃわ」で自然消滅した?w
574デフォルトの名無しさん:2010/01/04(月) 22:23:55
>>571
URLにアクセスしてHTMLを取得するという根幹部分すらまともに書けませんと素直に言ったら
575デフォルトの名無しさん:2010/01/04(月) 22:30:23
>>574
は?HTTPのライブラリぐらい作ったことあるから w
576デフォルトの名無しさん:2010/01/04(月) 22:40:14
しっかし、open-uriって、
open(path)ってしただけでゴリゴリとTempfileをディスクに書いちゃうのね。
大量のURIを扱うならopenは使うべきじゃないな。
577デフォルトの名無しさん:2010/01/05(火) 04:26:10
>>571のような open(file).read と open(file){|f| f.read} の違いがわからないような人間にはなりたくないと思う
578デフォルトの名無しさん:2010/01/05(火) 05:17:44
>>576
f = open(uri) が open として何を返すべきかを考えたら、
StringIO が返ってくる低サイズ帯のほうがむしろ特殊というか変
579デフォルトの名無しさん:2010/01/05(火) 15:25:56
無圧縮のzipを作成したいのですが
ziprubyもrubyzipも無圧縮オプションが見当たりません
この2つは無圧縮zipの作成をサポートしていないのでしょうか?
あるいはlibtarで作成すれば無圧縮zipと同じものが出来ますか?
580デフォルトの名無しさん:2010/01/05(火) 19:57:04
open-uriだけでよくここまで話せるな
581デフォルトの名無しさん:2010/01/05(火) 22:54:32
>>579
ヒント
Zlib::NO_COMPRESSION
582デフォルトの名無しさん:2010/01/06(水) 05:24:47
>>579
オレも気になったので調べてみたけど見当たらないね、実装されてないのかな?
おそらくPKZIP形式を求めていると思ったので
偽Zip32J.DLLてのを使ってやってみた

require 'dl/win32'
zip = Win32API.new("Zip32J.DLL","Zip","lppl","l")
p zip.call(0,"-q -0 out.zip 1.txt 2.txt", "" , 0)

拘り無いならtarでいいと思う
583デフォルトの名無しさん:2010/01/06(水) 07:15:17
rubyzipのZip::ZipOutputStream#put_next_entry見ろよ。
どこ見てんのよ。
584デフォルトの名無しさん:2010/01/06(水) 12:31:59
a='/'
a.sub!(/\//, "\\")
p a

これで出力は \ 1個を期待したのだけど
\\ 2個になってしまう

a.sub!(/\//, "\")
こうすると怒られるし
どうしたらいい?

585デフォルトの名無しさん:2010/01/06(水) 12:36:25
>>584
irbでinspectの結果を見てないか?
586デフォルトの名無しさん:2010/01/06(水) 12:37:22
ごめん、pか。
pはinspectの結果を出すので、そうなって当然。
putsせよ。
587デフォルトの名無しさん:2010/01/06(水) 12:40:36
588デフォルトの名無しさん:2010/01/06(水) 14:25:27
subとgsubはブロックを使えと先生から習わなかったか
589デフォルトの名無しさん:2010/01/06(水) 14:38:24
しかしそれ以前の問題だからのう。

どうでもいいけど、個人的には正規表現に / が入るときは %r が見やすい
590584:2010/01/06(水) 14:48:46
>>585-589
あざーした!
pの方が短くてうちやすいので
ついputs代わりに使ってました
今度から気をつけます!
591デフォルトの名無しさん:2010/01/07(木) 15:03:29
exerb 使う時って open-uri 使っちゃいけないの?
592デフォルトの名無しさん:2010/01/08(金) 20:42:04
こんなのあったのね。テンプレに入れとけばどうか。まーActiveScriptRubyでもいいけどw

窓の杜 - 【REVIEW】Windowsでスクリプト言語“Ruby”を導入するための和製インストーラー「Rumix」
http://www.forest.impress.co.jp/docs/review/20100106_340742.html
593デフォルトの名無しさん:2010/01/08(金) 23:46:16
WindowsでRubyを使うこと自体が既に初心者レベルを超えてる
594デフォルトの名無しさん:2010/01/08(金) 23:52:33
いや、逆じゃないのか。。
595デフォルトの名無しさん:2010/01/09(土) 08:02:18
RumixってOne-Click Installerとなにがちゃうんや!
596デフォルトの名無しさん:2010/01/09(土) 08:37:14
One-Click Installer 海外版Windows向けRubyパッケージ(ただしRuby古い)
Rumix 日本語版Windows向けRubyパッケージ
597デフォルトの名無しさん:2010/01/09(土) 19:02:01
rubyはメモリをたくさん食うと聞いたことがあるのですが解決方法などはありますでしょうか?
598デフォルトの名無しさん:2010/01/09(土) 19:04:58
>>597
Rubyを使わない

Rubyはメモリを多めに使うことで、Rubyであるということの意味を保っている
(そもそも言語レベルでそのように作られている)
メモリを大量に消費するということがネックなのなら、その用途にRubyを選ぶべきではない
599デフォルトの名無しさん:2010/01/09(土) 19:20:43
ほんとカス言語だな
600デフォルトの名無しさん:2010/01/09(土) 19:33:36
>599 suck but ruby just sucks less.
601デフォルトの名無しさん:2010/01/09(土) 19:35:17
sorry!! this site is japanese only!!
602デフォルトの名無しさん:2010/01/09(土) 19:44:52
rubygemsの開始読み込みのへちょい構造はどうにかして欲しいと思うことがある
あれはRubyらしさとかそういうの抜きで単にミスだろう
603デフォルトの名無しさん:2010/01/09(土) 19:52:10
メモリを大量に食うこと自体が設計ミス
604デフォルトの名無しさん:2010/01/09(土) 19:54:55
>>603
お前気楽な人生送ってるな
反対のことだけ書いてりゃ爽快なんだもんな
605デフォルトの名無しさん:2010/01/09(土) 20:09:47
CPU時間でQuotaや課金があるようなサービスがもうちょっと一般的になると
Rubyは再度日陰になるのかね
どっちにしても初心者スレの話題じゃねーな
606デフォルトの名無しさん:2010/01/09(土) 20:22:09
Ruby1.8 for WinでインタプリタがCUIかGUIかを簡単に判別する方法ってありますか?
exerbでexeファイル化する予定なので出来れば自動で判別したいです
607デフォルトの名無しさん:2010/01/09(土) 20:26:19
よくわからんがこのへんではだめなのか
ttp://exerb.sourceforge.jp/man/doc/core.ja.html
608デフォルトの名無しさん:2010/01/09(土) 21:14:09
空間計算量と時間計算量を犠牲にしてMatz好みのOOとプログラマの幸せを手に入れたいらしい
609デフォルトの名無しさん:2010/01/10(日) 18:15:55
rubyかpythonどちらを初めに勉強しようか悩んでます
どなたかアドバイスお願いします
610デフォルトの名無しさん:2010/01/10(日) 18:28:22
はいはいpython、python
いいからさっさと消えてくれ。目障りだ
611sage:2010/01/10(日) 18:40:42
rubython
612デフォルトの名無しさん:2010/01/10(日) 18:46:03
Rubyを256倍使うための本ってどうですか?
オクにいくつかでてるんで、買おうか迷ってるので教えてください。
613デフォルトの名無しさん:2010/01/10(日) 18:50:05
>>612
古書
Rubyの過去を知るために有意義
614デフォルトの名無しさん:2010/01/10(日) 21:30:35
質問です。
hamlで以下のような定義のときに、ruby本体でどのようにしたらいいのか教えてください。

%table
!= header = capture_haml do
%tr
%th Name
%th TimelogUrl
%th Status
- @users.each do |u|
%tr
%td u.name
%td u.link
!= header
この中で、@usersをどのように定義したらいいのかが分かりません。

バージョンは以下のものを使っています。
ruby 1.9.1
haml 2.2.16
615デフォルトの名無しさん:2010/01/10(日) 23:05:34
>>614
そのときのコンテキストにおける self に対して。
たとえば instance_eval { @users = ... }
616デフォルトの名無しさん:2010/01/10(日) 23:34:52
>>615
レスありがとうございます。

すいません、もう少し詳しく教えてもらえると嬉しいです。
@users = [
[
name => "aaaa",
link => "link1"
],
[
name => "bbbb",
link => "link2"
]
]
こんな感じのを想定しているんですが、全く違うようなそうでないような・・・
そんなレベルです。すいませんorz
617デフォルトの名無しさん:2010/01/10(日) 23:43:00
もしかしてRailsのビューにhamlを使ってみようとかそういう話?
618デフォルトの名無しさん:2010/01/11(月) 00:03:44
あの〜、Rubyってブラウザ上で動くアプリは作れないのですか?
619デフォルトの名無しさん:2010/01/11(月) 00:16:32
ブラウザ上で動くアプリってたとえばどんなんだ

HTMLと画像とJavaScriptで構成されているWebアプリケーションなら
サーバを用意してサーバ上でRubyを頑張って動かせば作れないわけでもない

Flashなどを利用するタイプのは、そりゃバックグラウンドサーバでRuby動かすことはできるけど
それより先にFlashで普通に作らないといけないぞ

何の話をしてるかわからないのなら、Webアプリケーションについての概略知識が足りない
620デフォルトの名無しさん:2010/01/11(月) 00:21:59
>>617
先に書くべきだったでしょうか?

Sinatraを使ってPassenger経由で表示させようとしています。
index.hamlという名前でhamlを使って別ファイルに保存していて、それをstart.rbから読み込んで表示させようとしています。
621デフォルトの名無しさん:2010/01/11(月) 01:29:35
>>620
このページは参考になるかな(2ページ目の@comment変数)
ttp://gihyo.jp/dev/serial/01/ruby/0009
622デフォルトの名無しさん:2010/01/11(月) 03:13:44
>>621
はい。そのページは知ってるのですが、実際に定義する場合にどのようにしたらいいのか?
というところで悩んでます。
テストデータを仮に組もうとして、どう「書いたら」良いのか分からないという orz
623デフォルトの名無しさん:2010/01/11(月) 04:12:59
>>622
こんな感じか
TestData = Struct.new(:name,:link)
@users = [ TestData['aaaaa','link1'], TestData['bbbbb','link2'] ]
624デフォルトの名無しさん:2010/01/11(月) 04:33:52
>>623
ありがとうございます。
おかげさまで動きました。

ただ一つだけ修正が
>>614の所は
%td u.name
%td u.link

%td= u.name
%td= u.link
でしたorz
625デフォルトの名無しさん:2010/01/11(月) 07:46:02
【レス抽出】
対象スレ:Ruby 初心者スレッド Part 33
キーワード:orz

抽出レス数:7
626デフォルトの名無しさん:2010/01/11(月) 10:39:52
R Language
Ruby
627デフォルトの名無しさん:2010/01/11(月) 12:17:24
Pで始まってLで終わる言語っていう表現があったな。
文脈によって指すものは変わる。
628デフォルトの名無しさん:2010/01/11(月) 17:22:46
質問です
同じ名前のチェックボックスから複数の値をとりだすにはどうしたら
よいのでしょうか?
require "cgi"
cgi = CGI.new

check1 = cgi["check"][0]
とかで個別には取れますが、選択できる数が固定でない場合、
どのように書けばよいのでしょう?

配列の数さえわかればできるのですが
cgi["check"].lengthとかで配列の数がとれないようですし困っています。
629628:2010/01/11(月) 17:58:49
自己解決しました
くだらない質問してすみませんでした
630デフォルトの名無しさん:2010/01/12(火) 04:22:00
cgiは残念だがゴミ。
631デフォルトの名無しさん:2010/01/12(火) 18:16:46
zsh で rake を実行するときに、desc がある task だけしか、
task が補完されない。Rakefile 中の全 task を補完させたいのだけど、
どうしたらいい??
632デフォルトの名無しさん:2010/01/12(火) 18:27:46
rubyはjis規格で規定されていますか?
633デフォルトの名無しさん:2010/01/12(火) 18:39:02
>>631
zshの設定を変える
rake専用の補完関数を書けばいい
誰かが作ってるのではないかな
634デフォルトの名無しさん:2010/01/12(火) 18:45:55
>>632
今ドラフト。
635デフォルトの名無しさん:2010/01/12(火) 22:17:37
Ruby と IPA はどのような関係があるのですか?
636デフォルトの名無しさん:2010/01/12(火) 22:21:00
>>635
マブダチ。
637デフォルトの名無しさん:2010/01/12(火) 23:35:30
>>634
まじ?
638デフォルトの名無しさん:2010/01/12(火) 23:38:22
情報処理技術者試験の午後問題になる日も近いな
639デフォルトの名無しさん:2010/01/12(火) 23:59:56
Ruby Draft Specification
http://ruby-std.netlab.jp/
640デフォルトの名無しさん:2010/01/13(水) 00:11:14
Ruby/GSL
http://rb-gsl.rubyforge.org/

のWindowsバイナリってないです?
gem install gslしようとしたら、native libraryでコンパイルしようと下ので、
VC++2008環境でやってみたんですが、エラー吐いてダメポです。
どなたかコンパイルしたバイナリか、コンパイルの仕方教えてください。
mingwとかでもコンパイルできますか?

C:\Program Files\Microsoft Visual Studio 9.0\VC>gem install gsl
Building native extensions. This could take a while...
ERROR: Error installing gsl:
ERROR: Failed to build gem native extension.

C:/ruby/bin/ruby.exe extconf.rb
checking for sys/types.h... yes
checking for u_int8_t... no
checking for int16_t... no
checking for int32_t... no
checking for u_int32_t... no
creating narray_config.h
creating Makefile

nmake

(つづく)
641デフォルトの名無しさん:2010/01/13(水) 00:12:02
(つづき)

Microsoft(R) Program Maintenance Utility Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.

cl -nologo -I. -I. -IC:/ruby/lib/ruby/1.8/i386-msw
in32 -I. -MD -Zi -O2b2xg- -G6 -DHAVE_SYS_TYPES_H -c -Tcnarray.c
cl : コマンド ライン warning D9035 : オプション 'Og-' の使用は現在推奨されていま
せん。今後のバージョンからは削除されます。
cl : コマンド ライン warning D9002 : 不明なオプション '-G6' を無視します
narray.c
c:\ruby\lib\ruby\1.8\i386-mswin32\config.h(2) : fatal erro
r C1189: #error : MSC version unmatch
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN
\cl.EXE"' : リターン コード '0x2'
Stop.

Gem files will remain installed in C:/ruby/lib/ruby/gems/1.8/gems/narray-0.5.9.7 for inspection.
Results logged to C:/ruby/lib/ruby/gems/1.8/gems/narray-0.5.9.7/src/gem_make.out
642デフォルトの名無しさん:2010/01/13(水) 00:27:46
>>630

cgi.rbがゴミなのでしょうか?

他に使いやすいCGIライブラリってありますか?
643640:2010/01/13(水) 00:32:06
こういったライブラリはmingw32でコンパイルできるものなのでしょうか?
644デフォルトの名無しさん:2010/01/13(水) 00:49:49
>>642
いまのところの本命はRackやRackに基づいたもの。
645デフォルトの名無しさん:2010/01/13(水) 01:03:24
..           (.
.            )
      ,―ヽ__(__、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/    RubyはIPA Rubyになったピョん☆
      i、  \   ./  /
       \   ーー   ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
      >   ヽ. ハ  |   ||
646デフォルトの名無しさん:2010/01/13(水) 01:24:34
初心者には Ruby 1.8.7 を強くお勧めします。とありますが、
公式から初心者のためのRubyインストールガイドに飛んで、
<URL:http://rubyforge.org/projects/rubyinstaller/>でダウンロードできます。
に行ったところ、1.8.6と1.9.1しか見当たりません
ど初心者なので安心な公式からのリンクのインストーラを使っておきたいところなんですが
興味を持っていざ足を踏み入れてみたものの、いきなり迷子になってます
647デフォルトの名無しさん:2010/01/13(水) 01:29:31
>>640
rubyをコンパイルしたのと違うバージョンのコンパイラを使うと
ランタイムライブラリが衝突する関係上、拡張ライブラリはコンパイルできない
ただしVC6とMinGWは同じランタイム使うのでそこの互換性はあり

つーことで、>>643はrubyがVC6かMinGWでコンパイルされている条件付でyes
648デフォルトの名無しさん:2010/01/13(水) 01:33:27
>>646
そういえばOne-Click Installerって1.8.6までだったね
http://groups.google.co.jp/group/comp.lang.ruby/browse_thread/thread/3212e4e1a32d8526

>>592にあるRumixってのを試してみては
不安なら他の人のレスを待って
649デフォルトの名無しさん:2010/01/13(水) 01:43:57
>>648
ありがとうございます
教えてもらったRumix - Ruby Starter Package with Installer
でインストールして初めてみたいと思います
650デフォルトの名無しさん:2010/01/13(水) 01:46:22
>>646
とりあえず始めるにはRubyGemsつきの以下の2つをオススメしたいな

ActiveScriptRuby(ただし、少し古いので外部公開とかは注意)
COM Meets Ruby
http://arton.hp.infoseek.co.jp/indexj.html


か、>>592のRumixをどうぞ

Rumix - Ruby Starter Package with Installer
http://ruby.morphball.net/rumix/


Rumixの方は試してないからわからんが、コッチの方がRuby1.8.7でも新しい。
651640:2010/01/13(水) 01:48:30
ありがとうございます。
RubyはVC6版(ActiveScriptRubyのだと思う)のはずなので、MinGWでコンパイル試してみます。
652デフォルトの名無しさん:2010/01/13(水) 01:54:49
>>650
わざわざありがとうございます
ActiveScriptRubyもチェックしてみたいと思います
653デフォルトの名無しさん:2010/01/13(水) 06:54:52
環境によってrubygemsがアホみたいに遅くなるのはどのWindows版だっけ
654デフォルトの名無しさん:2010/01/13(水) 07:03:58
>>653
mswin32が爆弾持ち

絶対にmingwもいれて比較すべき
遅く感じないならどっちでもいい
遅くない人もいるみたいだから
655デフォルトの名無しさん:2010/01/13(水) 07:34:04
1.8.7のインストーラ用意してないのは、単なる手抜き?
まあ教祖自身がウィンドウズ使ってないから放置なんだろうけど。
656デフォルトの名無しさん:2010/01/13(水) 07:55:04
マストでないので、やる人員が確保できなければ特段用意されない
657デフォルトの名無しさん:2010/01/13(水) 08:15:41
マイクロソフトあたりが環境用意してくれるのはきっと大歓迎。
658デフォルトの名無しさん:2010/01/13(水) 09:20:36
>>655自身が必要なら手を上げれば今なら英雄候補生
659デフォルトの名無しさん:2010/01/13(水) 10:52:00
arr.insert(0, obj) ってなんか意味あんのかね
arr.unshift(obj) と一緒だよね
ただのデータ配列なのでキュー関連の物言いを嫌ったのかね
660デフォルトの名無しさん:2010/01/13(水) 16:12:42
floatの内部表現を表す4バイトを指す文字列(ポインター)が欲しいのですが、どうすればいいのでしょうか
C言語で書くとこうなります。

float f[] = {1,2,3,4,5,6};
unsigned char* p = (unsigned char*)f;

OpenGLを使っていて頂点データをGPUに送るのに配列の生データが欲しいのですが……
661デフォルトの名無しさん:2010/01/13(水) 16:49:47
>>660
pack調べろpack
662デフォルトの名無しさん:2010/01/13(水) 17:04:11
>>661
.pack("f*")で出来た。まじサンクス。

@@vertices = [1,0,0, 0,1,0, -1,0,0].pack("f*")
@@indices = [0,1,2].pack("f*")
663デフォルトの名無しさん:2010/01/13(水) 19:37:31
>>659
すまん。レスの趣旨がつかめん。
挿入位置によってメソッド使い分ければいいじゃんてことが言いたい?
664デフォルトの名無しさん:2010/01/14(木) 11:08:18
スタックとみなしてる意図のメソッドと、キューとみなしてる意図のメソッドってあるよね

とかそんなことだと思う
665デフォルトの名無しさん:2010/01/14(木) 17:43:13
たまたま何処かでそういうコードを見かけて、unshiftで事足りるのに
わざわざinsert使っているのは何故なんだっていうところだろうね。
666デフォルトの名無しさん:2010/01/14(木) 20:04:56
バグを見つけたらどうしたらいいの?
667デフォルトの名無しさん:2010/01/14(木) 20:16:27
[BUG] と出て落ちたとか Segmentation Fault したとかならまず検索かな
たいていは既に報告してて対処待ち

Rubygems みたいな外部ライブラリのバグっぽい感じのものならやっぱ過去の報告とか調べて
それでもなさそうなら Rubyforge や GitHub のページのバグ報告あたりに出すといい

ただ、断言してもいいけど6割はただの勘違いで、残りのうち3割5部は既に報告済みだと思う
どこのどのへんが怪しい動作と思えるのかここで言ってみ
報告のためにはそれなりに体裁とか前提条件とか洗い出さないと対処してもらいにくいけど
ここで何か言えばそのためのヒントくらいは出るかもよ
668デフォルトの名無しさん:2010/01/14(木) 20:20:12
>>665
unshift と書いてあったら俺はキューのようなものだとみなす
キューでもないのに unshift と書いてあったらたぶんキレる
先頭に要素突っ込みたいなら insert 使え
最後に要素突っ込みたいなら << か push 使え
669デフォルトの名無しさん:2010/01/14(木) 20:27:34
沸点低いなー

まあ確かに順番必要ないのにArray使ってる例というのは結構あって
670デフォルトの名無しさん:2010/01/14(木) 21:33:30
バグの情報はどこにあるの?
Googleで4・50件ほど見たけど無かった。
win32でコマンドラインに特定の非ASCII文字を含むディレクトリ名を指定するとワイルドカードが展開されない
671デフォルトの名無しさん:2010/01/14(木) 21:35:23
672デフォルトの名無しさん:2010/01/14(木) 22:16:49
>>670
非ASCII文字の中に「表」とかの \ で終わる文字が入ってるんだろ
673デフォルトの名無しさん:2010/01/14(木) 23:06:29
Do One Thing for Rails 3 on January 16th and 17th
http://railsbridge.org/news_items/10
674デフォルトの名無しさん:2010/01/14(木) 23:11:49
Rubyでwebアプリ作るときはcgi使うのとERB使うのと
お作法的にはどっち?
675デフォルトの名無しさん:2010/01/14(木) 23:13:46
どっちもつかわねー、というのが答ではあるが
初心者のうちは全部使って長所短所欠点体に刻んどけという気はする
どうせ外に出したりしないだろ
676デフォルトの名無しさん:2010/01/14(木) 23:15:09
何使うの?
677デフォルトの名無しさん:2010/01/14(木) 23:15:28
>>670
その「特定の非ASCII文字」が何かによって答えは変わる。
シフトJISにない文字なんじゃないかと思うが如何?
678デフォルトの名無しさん:2010/01/15(金) 00:13:11
>>644
RackやRackに基づいたもので、普通のCGIは作れるのでしょうか?
調べてみても、mod_railsとかmongrelとかの環境を作らないと
動かせないように見えるのですが...
679デフォルトの名無しさん:2010/01/15(金) 00:20:18
>>678
できる
できるが、rack/cgi はリリースされても全く動かなかったことがある
(つまり誰も本気でテストしてなかった)というヤな過去があって

つまり誰もやってないんだよね
理屈上はできるし理屈上はRackでやるとキレイなんだけど、
CGI作るということ自体がもうあまり流行らないから
680デフォルトの名無しさん:2010/01/15(金) 00:28:29
>>671

D:\tmp\r>ruby -e "p ARGV" D:\tmp\r\本/*
["D:\\tmp\\r\\本/*"]

D:\tmp\r>ruby -e "p ARGV" D:\tmp\r\表/*
["D:\\tmp\\r\\表/*"]

D:\tmp\r>ruby -e "p ARGV" D:\tmp\r\漢/*
["D:/tmp/r/漢/新規テキスト ドキュメント.txt"]

漢字の2バイト目が\とか{とか
681デフォルトの名無しさん:2010/01/15(金) 02:40:12
とりあえずバージョンを書いて
1.8.7p160だと問題なかった

pの出力で日本語が出てることをみると1.9系だと思うが
1.9.1p243だと >>680 と同じ状態

Dir.glob に渡した時はちゃんと展開されるが
コマンドライン引数を展開する時はダメなんだね
UNIXだとコマンドライン引数のワイルドカードはシェルが展開するから、開発者には気付かれにくいのだろう

昔の1.8は Dir.glob自体がSJISに完全対応してなくて、コマンドライン引数にも同様の不具合があったけど
今回のはコマンドライン引数の時だけの不具合なのか
682デフォルトの名無しさん:2010/01/15(金) 03:16:56
def set_select_quests
for i in 0..9
quest_number = rand(10)
@select_quests |= quest_number.to_a if select_quests_flag(quest_number)
end
end

def select_quests_flag(index)
return false if @select_quests.include?(index) #・・・@
return true
end

@で@select_questsに同じ要素が入っている場合falseを返す様にしたいのですが
この場合include?(val)メソッドしかないですよね?
なんかうまく動かないんですがどこか間違ってますか?
683デフォルトの名無しさん:2010/01/15(金) 03:29:47
>>682
@select_quests << quest_number if select_quests_flag(quest_number)
かな
684デフォルトの名無しさん:2010/01/15(金) 04:05:24
>>654
え、うそ!!!1
RubyGemsが遅いのってmswin32版のせいなの???
くっそー今まで散々苦労してきたのにー
確かにcoLinuxとかだとめっちゃ早いと思ってたわ。
mingw版だと早い?、とか
685デフォルトの名無しさん:2010/01/15(金) 06:38:43
とりあえずgemはバージョンが古かったら
サーバ側でバージョンが古いと怒って欲しい
686デフォルトの名無しさん:2010/01/15(金) 07:35:58
>>685
おう、そういう機能入れたから、rubygem をアップデートしてくれ

というわけで鶏と卵だ
687デフォルトの名無しさん:2010/01/15(金) 07:43:14
>>682
def initialize
@select_quests = Array.new
...
end

def set_select_quests
(0..9).each.do |i|
quest_number = rand(10)
# @select_quests に quests_number が含まれてなかった場合追加する
@select_quests << quest_number if @select_quests.include?(quest_number)
end
end
688デフォルトの名無しさん:2010/01/15(金) 08:06:58
>>687のifはunlessの間違いだと思う冬の朝
689デフォルトの名無しさん:2010/01/15(金) 20:25:24
rubyはwindowsで動かすとどうして遅いの?
ずーと前からみたいだけど直すきないの?
690デフォルトの名無しさん:2010/01/15(金) 20:28:45
開発者がアウトオブ眼中だから
691デフォルトの名無しさん:2010/01/15(金) 20:29:00
>>689
なんでWindozeを使ってるの?
LinuxやBSDやSolaris使えばいいだけじゃないの?
文句言ってるだけで何も行動しようとしないのはなんでなの?
692682:2010/01/15(金) 20:46:00
ありがとうございました
うまくいきました
693デフォルトの名無しさん:2010/01/15(金) 20:46:26
>>689
めんどくさいから
いやマジで
誰にでも絶対に起こるなら直されると思うんだが実際はそうではない
694デフォルトの名無しさん:2010/01/15(金) 20:50:00
>>689
>>691みたいな人ばっかりだから
695デフォルトの名無しさん:2010/01/15(金) 20:55:02
>>693
だよね
むしろ嫌がらせっぽい
696デフォルトの名無しさん:2010/01/15(金) 21:26:17
WindowsOSがやめられないので、ちょっとずつPythonに移行し始めたよ。
既存のクラスにメソッド追加したり、injectとかがちょっと使いづらい以外不満はない。
697sage:2010/01/15(金) 21:29:39
Pythonたんは、純粋なオブジェクト指向じゃないよね。
len() とか気持ち悪い。
698デフォルトの名無しさん:2010/01/15(金) 21:37:14
>>697
最初はそう思ってたけど慣れればそんなもんかって思えるよ。
あとは、三項演算子やcase文がないのがちょっと残念くらいなもんか。
699デフォルトの名無しさん:2010/01/15(金) 21:38:39
>純粋なオブジェクト指向
Rubyも「+」とか「end」はオブジェクトじゃないよね
700デフォルトの名無しさん:2010/01/15(金) 21:41:20
>699
不完全性定理というのがあってだな
701デフォルトの名無しさん:2010/01/15(金) 22:19:11
文字列をn文字ずつ&1文字ずつに分割したいのですが
x = "ABCDEFGHIJKLMNOPQRSTUVWXY"
x = x.scan(/.{5}/)
x.collect!{|y|y.scan(/./)}
p x
=>[["A","B","C","D","E"],["F","G","H","I","J"],["K","L","M","N","O"],["P","Q","R","S","T"],["U","V","W","X","Y"]]
みたいに書くと都度、正規表現によるマッチが行われるので遅いです
もっと高速に実行する方法があったら教えてください。よろしくお願いします
702デフォルトの名無しさん:2010/01/15(金) 22:20:42
まあ俺は自分の仕事が片付けばいいだけだから
オブジェクト指向の純粋さなんてどうでもいいわ
703デフォルトの名無しさん:2010/01/15(金) 22:31:44
>>701
x.chars.each_slice(5).to_a とか。
Benchmark.bm で1万回ずつやった時間を比較したら半分弱の時間だった。
704デフォルトの名無しさん:2010/01/15(金) 22:37:37
>>701
x.split(/.{5}/)
x.split(//)

がたぶん一番速い
これでも遅いという場合はそもそもそんな莫大な配列を文字から作る理由は何というとこから
705デフォルトの名無しさん:2010/01/15(金) 23:10:56
>>704
そもそも要件を全然満たしてない件
706デフォルトの名無しさん:2010/01/15(金) 23:17:57
enumeratorと配列の違いって何ですか?
なんとなく大体同じもののように思えるんですが
707デフォルトの名無しさん:2010/01/15(金) 23:42:36
超巨大な集合から1つずつ取り出そうとしたとき、Enumeratorは全部を
覚えていなくてもいいぞ。
alphabets = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z)

alphabets.combination(13).first(5) は造作もないが
alphabets.combination(13).to_a.first(5) はたぶんメモリ足りない。
708デフォルトの名無しさん:2010/01/16(土) 00:46:48
>>706
数えられて、返ってくる順番が保証されないのがEnumerator
Enumeratorを継承してるので数えられて、しかも順番情報を保持するようにしたのがArray

こう考えるとSetの出番がないんだがまあ誰も覚えてないし誰も使ってないと思うので気にするな
709デフォルトの名無しさん:2010/01/16(土) 12:34:07
>>701
シングルバイト文字限定でいいのかな?
であれば

x = "ABCDEFGHIJKLMNOPQRSTUVWXY"
res = [[]]
x.each_byte do |b|
if res[-1] < 5
res[-1] << b.chr
else
res << []
end
end

で,どうでしょう?
710デフォルトの名無しさん:2010/01/16(土) 14:39:59
ruby1.9の正規表現で,\wがマルチバイト文字にヒットしてくれません。
以下のコードはなにか間違っていますでしょうか?

# coding: cp932
p "日本語" =~ /\w/s #=> nil

鬼車のドキュメントには\wは多バイト文字にマッチすると書かれているのですが。
ttp://www.geocities.jp/kosako3/oniguruma/HISTORY_5X.txt
711デフォルトの名無しさん:2010/01/16(土) 14:44:55
\w は Ruby では元々 [0-9A-Za-z_] という意味のメタ文字だったので、
1.9 でもそうなってる。
712デフォルトの名無しさん:2010/01/16(土) 14:51:19
>>711
Thanksです。
マルチバイト文字を含めた単語構成文字にマッチするナイスな正規表現ってありませんか?

あとドキュメントのURLが間違ってました。
ttp://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt
713710:2010/01/16(土) 14:58:14
自己レスです

# coding: cp932
"日本語" =~ /\p{Word}/s

でいけました。
714デフォルトの名無しさん:2010/01/16(土) 15:02:56
たしか ¥d が漢数字にマッチしてしまって使いにくくなってたので
その種のは使い分けるようになったんだっけ?
715デフォルトの名無しさん:2010/01/16(土) 17:22:03
>>709
1.9系なら↓でマルチバイトもOK

x = 'あいうえおかきくけこさしすせそ'
res = []
x.each_char.each_slice(5){|a| res << a}
716デフォルトの名無しさん:2010/01/16(土) 17:29:26
これでもできるな

x = 'あいうえおかきくけこさしすせそ'.each_char.each_slice(5).map{|a| a}
717デフォルトの名無しさん:2010/01/16(土) 17:32:17
Windowsのユニコードのファイル名が扱えるライブラリはありますか?
718デフォルトの名無しさん:2010/01/16(土) 17:33:00
>>717
ありません
719デフォルトの名無しさん:2010/01/16(土) 17:38:28
いやいやいやいや、直接API呼べば問題ないからさ
そういうライブラリがrubygemsあたりにでもないかという話だろう

でもこれで困るの日本人とかだからなー
720701:2010/01/16(土) 18:50:38
レスありがとうございます
>>703の方法が一番早いようなのでこれを使わせてもらいます
721デフォルトの名無しさん:2010/01/17(日) 10:37:45
皆さんはRubyのコードを何で書いてるのでしょう?
やっぱり、Emacs or vim?

補完が効くのが良いのですが・・・・
722デフォルトの名無しさん:2010/01/17(日) 10:48:27
Emacsが無難ということに一応なってはいる

適当な統合環境が快適に動作する環境なのなら、エディタ部のコード書きの補完機能だけ使うのも悪くはない
Emacsを一度も使ったことがなくて基本キー操作から覚えなければならないというのだとすれば尚更

Emacsが好まれてるのはエディタの軽さの範疇を実際上は超えてないというのが大きい
もしEclipseやNetBeansが超サクサク動作だったならEmacsは時代遅れ度を2段階くらい上げていたはず
723デフォルトの名無しさん:2010/01/17(日) 11:02:32
Emacsは現代的なIDEが提供するところの補完機能を厳密にはもってない
…まあ、実用上はそれほど困らないが
724デフォルトの名無しさん:2010/01/17(日) 11:35:27
拙者は秀丸でござる。
感謝の意を込めてちゃんと送金したでござる。
725デフォルトの名無しさん:2010/01/17(日) 11:35:48
Emacs で指がつったら vim も試してみてね by vim厨
726デフォルトの名無しさん:2010/01/17(日) 11:46:52
>>721
主にNetBeans使ってる。IDE厨なのでw

ただし、NetBeansの最新の6.8はいろいろとバグが・・・
727デフォルトの名無しさん:2010/01/17(日) 11:57:45
俺もいわゆるスクリプト程度しか書かないからEmacsで十分だな
でもたしかにIDEがエディタ同様に軽ければそっち使うかも
728デフォルトの名無しさん:2010/01/17(日) 12:36:38
通常のエディタでは慣れてくると物足りない(プログラミング初心者は補完のないエディタでやること)
IDEはおおむね重いし遅いしプロジェクトとかそんなのが必要な大作ばかり作るわけじゃないから邪魔

というところにすこんと入るのがEmacs
全部できるが余分で煩雑で重い、というものを使うよりは、
やや足りなくて手作業が入るが軽快、のほうを選ぶ人は意外と多い
729デフォルトの名無しさん:2010/01/17(日) 13:17:32
emacs自体あんまり使わないんだけど、ショートカットキー一発で
全体を整形&フィリング(emacsではこういうのかな)できる設定ないかしら。
730デフォルトの名無しさん:2010/01/17(日) 13:20:51
あるお。
俺はCtrl-x hとかしたあと、Ctrl+Alt+\を押してる。
フィリング?は知らんけど。
731デフォルトの名無しさん:2010/01/17(日) 13:20:54
結局>>717は無いの?
732デフォルトの名無しさん:2010/01/17(日) 13:21:05
class C
 def hoge
  とても長いメソッド...
  local_var = value #<= ここだけを書き換えたい
  ...
 end
end

メソッド定義内のローカル変数たった一行を書き換えたいんです。
とても長いメソッドなので,class_eval{def...無意味なコピペ...end}をしたくありません。
スパッと書き換えることはできませんか?

とりあえずSCRIPT_LINES__とripperを使えば20行くらいでできるのですが,
もっとストレートな方法があるかもしれないと思い質問しました。
ちなみにbindingを使った実験には失敗しました。
よろしくお願いします。
733デフォルトの名無しさん:2010/01/17(日) 14:05:33
>>731
本スレ行って聞いてみたら
734デフォルトの名無しさん:2010/01/17(日) 14:22:30
Emacs が軽快とか隔世の感、とか言うのは多分年寄り。
735デフォルトの名無しさん:2010/01/17(日) 14:32:07
今は通信速度が速いから、Emacs も簡単にダウンロードできる。
昔はフロッピーで小分けにして、配布してたな。
736デフォルトの名無しさん:2010/01/17(日) 14:36:14
>>731
Perlの↓相当がgemにあればいいんだろうけど
http://perl-users.jp/articles/advent-calendar/2009/hacker/20.html
いまgemでサーチかけた感じだとなさそう

必要なら↑を参考にしてRubyにportしたら?
737デフォルトの名無しさん:2010/01/17(日) 14:46:29
>>731
1.9.2で扱えるようになるかも、ってことらしい
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/45826
738デフォルトの名無しさん:2010/01/17(日) 14:54:30
>>731 >>736-737
あれ、WindowsだとUNICODEファイル名ダメだったのかー
gemでモンキパッチみたいに簡単にWindowsのときだけOKにできるのとかあったら便利そうだね。
システムの根底だから難しいのかね
739デフォルトの名無しさん:2010/01/17(日) 20:48:07
>>736-738
ありがとう。だが初心者にはハードル高すぎ
1.9.2に期待しまつ。いつごろ出るんだろ?今年の春頃?
740デフォルトの名無しさん:2010/01/17(日) 20:52:56
一応「もう出てる」レベルではあるんだが、Windowsでは自力でソースからコンパイルしないといかん
rubygemsとかも未対応で動作しない可能性も大きい
しばらく前の1.9.1状態

来年くらいには使える状態になってるんじゃないかなあ
741デフォルトの名無しさん:2010/01/17(日) 21:21:56
なんか直接いじればどうにかなりそうな気はするんだけどねえ
742デフォルトの名無しさん:2010/01/17(日) 21:54:31
すいません、これ↓を使いたいんですが、何から始めればいいのか教えてください。
ttp://gist.github.com/211635
743デフォルトの名無しさん:2010/01/17(日) 22:12:49
>>730
フィリングってのはこういうの。文章の段落内でESC qでできる。
# ながーーーーーい説明文菜がーーー否がーーー否がーーーーーーーーーーーーーーーーーーーーい

# ながーーーーーい説明文菜がーーー
# 否がーーー否がーーーーーーーーー
# ーーーーーーーーーーーい

んで、ソースコード全体を一発で整形&フィリングしたいのんよ。ruby-modeで。
744デフォルトの名無しさん:2010/01/17(日) 22:20:06
>>742
見てわからんのならスクリプトがすこし違って詰まったときの対処も自力で全然できないということだから
素直に Ruby の勉強を進めたほうがいいような気がしないでもない

前情報として、Ruby の知識が全然ないのなら使えないよ
MySync GoogleContacts でぐぐると唯一出てくるから、
これをしたい場合は Ruby 上でこれを動かすしかないわけだけど、
まったくの一見さんが使えるようなクオリティにはそもそもなってない

を踏まえて
Ruby を適当にインストール、URL の Download からダウンロードして展開して、
au2gcontact.rb をてきとうなとこにコピー
その後、au2gcontact.rb 自身のファイルの文字コードを Shift_JIS というか CP932 に変換
MySync が吐き出したエクスポートの CSV(Shift_JISに変換済)を第 1引数に、
GoogleContacts に食わせたいファイル名を第 2引数にして、
ruby au2gcontact.rb mysync.csv output.csv
と実行
output.csv は ShiftJIS(というかCP932)だが、
これがそのまま GoogleContacts にでインポートできるかどうかまでは知らない
745742:2010/01/17(日) 22:53:26
なんかよくわからんまま試行錯誤したら一応の目的は達しました。ありがとうございました。以下俺メモです。

rubyをインストール。
ソース(っていうのかな?)をメモ帳にコピペ。拡張子を.rbに変える。
au2gcontact.rbとaddress.csv(←LismoPortが吐き出すやつ)とgcontact.csvをC:\Documents and Settingsに置く。
コマンドプロンプトからruby au2gcontact.rb address.csv gcontact.csv
出てきたのをgmailにインポートでおk。

いやーすごいですね。感動しました。ほんとありがとうございました。
746デフォルトの名無しさん:2010/01/18(月) 01:19:39
>>743
Emacs のスレで聞いたら adaptive-fill-mode の使い方なり filladapt.el の後継なり
何か情報が入るんでない?
747デフォルトの名無しさん:2010/01/18(月) 03:41:47
乗り遅れた感あるけど

vim+neocomplcacheでやっとります。
748デフォルトの名無しさん:2010/01/18(月) 09:32:46
> rubyはwindowsで動かすとどうして遅いの?
Ruby 1.8.7-p174 の select が遅かった話じゃなくて?
http://www.garbagecollect.jp/~usa/d/200909c.html
Ruby 1.8.7-p249 にすれば直るよ。

> たしか \d が漢数字にマッチしてしまって使いにくくなってたので
Ruby 1.9.1 の初期はそうだったんだけど、この挙動はバグ扱いされて修正されたので、
Ruby 1.9.1-p378 にすれば直るよ。
749742:2010/01/18(月) 09:33:49
追記。適当なソフトでau2gcontact.rbの文字コード変換をshift jisに変換。
750デフォルトの名無しさん:2010/01/18(月) 15:18:11
puts "日本語".inspect
とすると、"¥123¥456" みたいな表示なりますけど、これを "日本語" のままで表示させることはできませんか。
751デフォルトの名無しさん:2010/01/18(月) 15:35:00
1.8.7 mswin32の場合

irb(main):001:0> puts "日本語".inspect
"\223\372\226{\214\352"
=> nil
irb(main):002:0> $KCODE = "s"
=> "s"
irb(main):003:0> puts "日本語".inspect
"日本語"
=> nil
752デフォルトの名無しさん:2010/01/18(月) 15:37:06
-Kオプションの方がわかりやすいかもしれないと思い直した

>ruby -Ks -e'puts "日本語".inspect'
"日本語"
753739:2010/01/18(月) 18:25:32
1.9.2 preview1で試してみたけどダメだった
754デフォルトの名無しさん:2010/01/18(月) 18:35:12
だからそういうふうにそもそも作ってないんだから標準で用意されたメソッドをどう使おうと絶対に駄目だって
755デフォルトの名無しさん:2010/01/18(月) 19:39:35
火急的に困ってる人がいないんだろうね
見なかったことにするわけにもいかんと思うんだが、代替手段は何なのだろう
そこだけRubyを使わない?
756デフォルトの名無しさん:2010/01/18(月) 19:58:33
1.9.2で扱えるようになるかも、ってことらしかったんで
757デフォルトの名無しさん:2010/01/18(月) 20:21:42
#!ruby -Ku
require 'win32ole'
WIN32OLE.codepage = WIN32OLE::CP_UTF8
fso = WIN32OLE.new('Scripting.FileSystemObject')
a = fso.CreateTextFile("♡♥♡♥.txt", true)
a.WriteLine("This is a test")
a.Close()
758デフォルトの名無しさん:2010/01/18(月) 20:35:46
笙。笙・笙。笙・.txt というファイルができました先生
759デフォルトの名無しさん:2010/01/18(月) 20:39:55
u
760デフォルトの名無しさん:2010/01/18(月) 21:01:23
環境とエディタによってはこのへんきちんと動作するように保存するのは微妙に難しいぞ
慣れればどうということもないんだが
761デフォルトの名無しさん:2010/01/18(月) 21:11:27
おお! できました!! ありがとうございます!!!
これどうすればIOやDirで扱えるんですか?
762デフォルトの名無しさん:2010/01/18(月) 21:20:06
>>761
扱えない
全部 WIN32OLE 内で完結させる必要がある
必要なのは Ruby の知識じゃないね
763デフォルトの名無しさん:2010/01/18(月) 21:33:40
ですよねー...
764デフォルトの名無しさん:2010/01/18(月) 21:35:43
最初と最後にリネーム処理かませば Ruby から扱うのも不可能ではないと思う
765デフォルトの名無しさん:2010/01/18(月) 22:55:11
先生質問だよ質問

data = {/key/ => lambda{|m| "<#{m}>"}}


data.each_pair do |re, p|
 file.gsub!(re){|m| p.call(m)}
end

p file #=> key が <key> になってる

というような、
{正規表現 => キーのマッチ結果を便利に利用した結果の返り値またはただの文字列}
というデータを用いた連続置換をしたいのです
それで、data は外部から自由に与えたいのです

でも、よく考えたら lambda を作った時点では gsub の $1 も \1 もまだ無いから利用できないわけで
なにかうまい方法ないですか
eval ならなんとかなると思ったんだけど普通の置換後に使いたいだけの文字列も eval してしまいます
766デフォルトの名無しさん:2010/01/18(月) 23:47:16
>>765
m = Regexp.last_match
puts m[0]
とかでできないかな?

あと
data.each_pair do |re, p|
 file.gsub!(re, &p)
end
でいいような気がするけど試してはいない。

767デフォルトの名無しさん:2010/01/18(月) 23:55:48
こういうことだろうか。

to = data.each_pair.inject(from) {|result, pair| result.gsub(pair[0], &pair[1]) }
768デフォルトの名無しさん:2010/01/18(月) 23:59:30
これではどう?

a = 'abc def'
data = [['(\w+)', '<\1>'], ['(> <)', '> < \1 > <']]
data.each{|reg, rep| a.gsub!(/#{reg}/, rep)}
a => "<abc> < > < > <def>"

769デフォルトの名無しさん:2010/01/19(火) 00:09:09
>>768
なにそのわかりやすくしようとする気概をぜんぜん感じない例
770デフォルトの名無しさん:2010/01/19(火) 00:10:57
>>765

766-768が書いているようにgsub!の第2引数で置換パターンを書いたほうが
単なるstringでパターンを渡せるので簡単だと思う

766,767が書いてるパターンの前の '&' って
どういう意味?
771デフォルトの名無しさん:2010/01/19(火) 00:21:13
772デフォルトの名無しさん:2010/01/19(火) 00:26:03
なるほどProcを渡してるのねthx
俺には768の方がわかりやすいな、例は見づらいが
773デフォルトの名無しさん:2010/01/19(火) 00:42:38
だって先生が gsub はブロック使えって言ったんだもん言ったんだもん言ったんだもん

>>766-768
irb> data = {/k1/ => 'v1', /k(2)/ => 'v\1', /k3/ => lambda{|m| m.sub(/k/,'v')}}
irb> str = 'k1, k2, k3'
irb> data.each_pair do |re, p| p.kind_of?(Proc) ? str.gsub!(re, &p) : str.gsub!(re, p) end
irb> p str
"v1, v2, v3"

思ったことに近いことができましたーうおー
助かりましたせんきゅうです
774デフォルトの名無しさん:2010/01/19(火) 03:46:28
1byte文字以外をマッチする方法を教えてください
s="123123456456"
s.gsub!(/〜/){|c|
uni_enc(c)
}
p s
=>
123%uFF11%uFF12%uFF13456%uFF14%uFF15%uFF16
みたいに1byteじゃない文字だけ変換して置換したいです
よろしくお願いします
775デフォルトの名無しさん:2010/01/19(火) 06:56:24
$KCODE='s'
s="123123456456"
s.gsub!(/./){ |ch|
(ch.length==2) ? "(#{ch})" : ch
}
puts s;
776デフォルトの名無しさん:2010/01/19(火) 07:36:20
1バイトじゃない文字だって言ってるのにわざわざ2バイトをチェックするとはこれいかに
777デフォルトの名無しさん:2010/01/19(火) 14:27:57
# coding: sjis
# Ruby1.9以降か正規表現エンジンに鬼車を使用

s="123123456456"
s.gsub!(/[^\p{ASCII}]/){|c|
"%u"+c.encode('utf-8').ord.to_s(16)
}
p s
778デフォルトの名無しさん:2010/01/19(火) 17:08:32
test = {"うし"=>5, "うま"=>3, "うし"=>1, "うし"=>2, "うま"=>4}
test.each{|key, val|
}

これを実行したら最後二つの"うし"=>2と"うま"=>4しか処理が実行されないんですが
キーの要素が一緒だと前にある奴は消されてしまうんですか?
またこれをハッシュの数分だけ実行させることはできないんでしょうか?
779デフォルトの名無しさん:2010/01/19(火) 17:22:15
>778
ハッシュの意味を勉強してこい
780デフォルトの名無しさん:2010/01/19(火) 17:30:11
配列の配列を使う方法
test = [ ["うし", 5], ["うま", 3], ["うし", 1], ["うし", 2], ["うま", 4] ]
test.each {|k, v| use(k, v) }

値が配列になったハッシュを使う方法
test = {"うし"=>[5, 1, 2], "うま"=>[3, 4] }
test.each {|k, a| a.each {|v| use(k, v) } }
781デフォルトの名無しさん:2010/01/19(火) 17:44:49
文字列
a0-0 a0-1 a0-2 a0-3
a1-0 a1-1 a1-2 a1-3
a2-0 a2-1 a2-2 a2-3

から任意が選ばれた配列a
a=["a0-0","a2-2","a2-3"]
より、
配列bを作成したいのですが、
なにか良い方法はないのでしょうか?

b=[[1,0,0,0],[0,0,0,0],[0,0,1,1]]
782デフォルトの名無しさん:2010/01/19(火) 17:51:33
只今から上位エスパー召喚の儀を執り行う
783デフォルトの名無しさん:2010/01/19(火) 17:54:09
"a0-0" → [1, 0, 0, 0]
"a2-2" → [0, 0, 0, 0]
"a2-3" → [0, 0, 1, 1]

という対応があるように見えるのだが、2つめは [0, 0, 1, 0] ではない?
どういうルール?

784デフォルトの名無しさん:2010/01/19(火) 17:55:50
>>782
失敗してるぞw
785デフォルトの名無しさん:2010/01/19(火) 17:58:38
こうだな

a=["a0-0","a2-2","a2-3"]

b = Array.new(3){ Array.new(4, 0) }
a.each do |x|
if /a(\d)-(\d)/ =~ x
b.push[$~[1].to_i][$~[2].to_i] = 1
end
end
p b #=> [[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 1, 1]]
786デフォルトの名無しさん:2010/01/19(火) 18:00:09
>>782
成功したぞw
787785:2010/01/19(火) 18:00:44
ごめん。こうだったね。
> b.push[$~[1].to_i][$~[2].to_i] = 1
b[$~[1].to_i][$~[2].to_i] = 1
788デフォルトの名無しさん:2010/01/19(火) 18:02:57
>>783
a0-0 は配列aにあるから 1
a0-1 はないから0
a0-2 はないから0
a0-3 はないから0
これにより[1,0,0,0]です。

a2-0 はないから0
a2-1 はないから0
a2-2 はあるから 1
a2-3 はあるから 1
これにより[0,0,1,1]です。

このようなルールです。
789デフォルトの名無しさん:2010/01/19(火) 18:26:34
>>785
ありがとうございます。
この方法で問題なく解決しました。
790デフォルトの名無しさん:2010/01/19(火) 22:18:49
こういう3択クイズで選んだ結果をファイルに出力して、解答ファイルと照らし合わせる場合
どうすればいいのでしょうか?

require 'cgi'
c = CGI..new
hoge = c["va"]
print "Content-type: text/html; charset=EUC-JP\n\n"
print "<html><head><title></title></head><body>\n"
print "<p>"
if hoge == 1
print "<p>問題1</p>\n"
print"<form method=\"POST\" action=\"./test.rb\">\n"
print"<input type=\"radio\" name=\"va\" value=\"2\">ア
print"<input type=\"radio\" name=\"va\" value=\"2\">イ
print"<input type=\"radio\" name=\"va\" value=\"2\">ウ
print"<input name=\"ok\" type=\"submit\" value=\"OK\">\n"
print"</form>\n"
elsif hoge == 2

end
print "</p></body></html>\n"
791デフォルトの名無しさん:2010/01/19(火) 22:32:03
>>790
Rubyは基本、HTTPのクエリ文字列とかを隠蔽しない
そのときどんなデータがどのように送られてくるものなのか、HTTPの勉強をするといいぞ
792デフォルトの名無しさん:2010/01/19(火) 23:06:30
>>791
ありがとうございます
勉強して何とかやってみます
793デフォルトの名無しさん:2010/01/20(水) 08:35:06
>>791
事実だから仕方ないが、あんま威張ることじゃないけどねえ
Railsで作ってRailsで表示してRailsで受け取れば抽象度高くできそうだが、もうCGIではないな
794デフォルトの名無しさん:2010/01/20(水) 08:36:21
そりゃ言語としてWEBだからって何かするのはPHPくらいだろう。
795デフォルトの名無しさん:2010/01/20(水) 08:49:20
あほまるだし
796デフォルトの名無しさん:2010/01/20(水) 12:53:24
質問です!
文字列を受け取ってスペースと記号を削除した文字列を返すメソッドを作りたいんですが
どうすればいいでしょうか?
ちなみに条件はgsubメソッドをつかうこと
記号は全角も半角も含む(","とか"。"とか"?"とか"?"とか)
どなたかお願いします
797デフォルトの名無しさん:2010/01/20(水) 12:56:49
>>796
Rubyの宿題教えてください。2限目
http://pc12.2ch.net/test/read.cgi/tech/1200175247/
798デフォルトの名無しさん:2010/01/20(水) 13:10:06
>>797
スレ違いでしたね
すいません
わざわざありがとうございます
799デフォルトの名無しさん:2010/01/20(水) 13:48:31
RDEは軽いからお手軽なGUIのirbみたいなイメージで
自作メソッドとかの動作確認的な風に使うな
800デフォルトの名無しさん:2010/01/20(水) 14:45:43
railsを勉強しようと思うんですが、初心者向けで
お勧めの本はありますか?あるいは、これは読んで
おくべき本でも構いません。

Webでいろいろ読んだのですが、modelのassociation
やAjaxが難しく感じました。
801デフォルトの名無しさん:2010/01/20(水) 14:50:41
うむ、スレのテンプレすら読めんような注意力では何もかもが難しかろう

【Ruby】Ruby on Rails Part8
http://pc11.2ch.net/test/read.cgi/php/1252842574/
802デフォルトの名無しさん:2010/01/20(水) 14:53:24
Railsの初心者スレってありそうでなさそうで需要ありそうだがやっぱめんどいからなしで
803デフォルトの名無しさん:2010/01/20(水) 16:16:05
>>801
ありがとう。
804デフォルトの名無しさん:2010/01/20(水) 16:21:54
>>800
初心者が最低限これだけあればまずはなんとかなる!って書籍を3つ。
というか俺が実際にRails初心者レベルで仕事で使った本

・RailsによるアジャイルWebアプリケーション開発
http://www.amazon.co.jp/dp/4274067858/

・Ruby on Rails 逆引きクイックリファレンス Rails 2.0対応
http://www.amazon.co.jp/dp/4839928266/

・Railsレシピブック 183の技
http://www.amazon.co.jp/dp/4797336625/

あとは、webサイトだけど公式のガイド。ちょっとしたわからんことはまずこれ見たら大体すむ
Ruby on Rails guides
http://guides.rubyonrails.org/

毎回聞かれてるんで、Railsスレテンプレに入れといていいと思うんだ・・・
805デフォルトの名無しさん:2010/01/20(水) 16:23:43
質問いいでしょうか?
Ruby 1.8.7にて、ブロックつきメソッドの呼び出したブロックの返り値を得たいのですが、
ブロック内で
 return "UNKO!!"
すると、
 unexpected return (LocalJumpError)
と言われます。
 break "UNKO!!"
では問題ないようなのですが、これはこういうものなのでしょうか?
806デフォルトの名無しさん:2010/01/20(水) 17:03:26
>>804
紹介ありがとう
とりあえずそれらと公式サイトで始めてみます
807デフォルトの名無しさん:2010/01/20(水) 17:04:09
>>805
トップレベルでreturn使っていない?
def f(a)
a.each{ return 1 }
end

a = [1,2,3]
f(a) # これはだいじょうび
a.each{ return 1 } # でもこれはダメ
808805:2010/01/20(水) 17:50:49
>>807
ありがとうございます。
エラーでない方法をお聞きしたいというよりも、もう少し具体的に聞くべきでした。

こちらの期待する動作としては、
”UNKOoooooooOOOO!!”と”f is finisheeeeeeeedddddd!!111”ともに表示させたいのです。
breakの代わりにreturnだと”f is finisheeeeeeeedddddd!!111”が表示されませんよね・・・?(fから抜けてる?)

実際のコードではa.eachではなくeachの代わりに自分で定義したブロックを必要とするメソッドを呼び出してます

def f(a)
  puts a.each{ break "UNKOoooooooOOOO!!" }
  puts "f is finisheeeeeeeedddddd!!111"
end

a = [1,2,3]
f(a) # これはだいじょうび
#a.each{ return 1 } # でもこれはダメ
809デフォルトの名無しさん:2010/01/20(水) 18:01:04
breakはブロックの脱出、returnはメソッドの脱出ってこと
だからそのfの中でretrunを使ったら内部ブロックでだろうとfを脱出する

同様にこれも無理
def f
 break
end
f
810デフォルトの名無しさん:2010/01/20(水) 18:09:10
ある案件で始めてRubyをいらうことになったのですが、
訳がわからず困っています。

取り合えず、"RailsによるアジャイルWebアプリケーション開発”のT部
HelloWorldプログラムを作成して動かすまでを試してみて、
ああ、PHPでSmarty使ってMVCモデルで作成するのを自動、徹底
してる感じだなと思い、そのまま本チャンプログラムに挑みましたが・・・

・まず、.rhtmlがTopページしかなく、MVCとも.jsファイルばかり。
・ブラウザに表示してソースコードを見てみると、1万行近い
 ソースコードで表示と一致していない。
・ブラウザのURL表示がページ遷移しても常に一緒。

と、始めて見る構成でした。
私のRubyの理解が足りないと思い、U部以降を読み進めようと思いましたが
このプログラム構成が特殊だから、参考書読み進めても効果は薄く
それよりプログラムの解析を続けるべきでないかと思い直しました。

皆さんに質問ですが、こういった構成は一般的なのですか?
それなりにある手法ならば、読むべき参考書、検索のキーとなる
単語を教えていただけたらと思います。

要領得ない質問ですみませんがお願いします。。。
811デフォルトの名無しさん:2010/01/20(水) 18:17:27
>>810
お前には絶対に無理だ
812sage:2010/01/20(水) 18:20:39
せめて日本語で頼む。
813デフォルトの名無しさん:2010/01/20(水) 18:31:08
>>804の罪は重い
814デフォルトの名無しさん:2010/01/20(水) 18:34:15
これは俺でも煽る
直前読めずにスレのルールすら理解できないようでは駄目だろうな
815810:2010/01/20(水) 18:51:22
>>814
>関連スレやURLは>>2-5あたりを見てください。
>Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

これですか?
もっと詳細に質問すべきだったのかもしれませんが、
個々のプログラムの質問以前に全体として???だったもんで。。。

>>810,813
つまり、初心者レベルでないから私には到底無理ってことですか?
それならそれで上にそう報告しますので助かります。
それでもやれって言われそうですが・・・。

逆に、参考書読んだらわかるようなことを質問するなというのであれば
すみません。
参考書、全部読んでみます。

取り合えず、初心者参考書レベルの問題なのかだけでも教えて下さい。
816デフォルトの名無しさん:2010/01/20(水) 19:11:01
>>815
君が書いてる質問の中に、Rubyそのものに関する話題は一切ない。
Railsスレへ行きなされ。

>>813が書いてるのは、たぶん、Railsスレへ行けということが示されてるのに
わざわざ餌を撒いてここに君を留まらせた罪が重いってこと。
817810:2010/01/20(水) 19:13:22
>>816
そうですね。。。
すいません。

Railsスレにいきます。
スレ汚し失礼しました。
818デフォルトの名無しさん:2010/01/20(水) 19:21:36
>>817
読んでないことを期待するが、40パーセントくらいしか悪くないのでそれほど謝る必要はない
残り40パーセントは>>804で、残り20パーセントはたまたま重なったタイミング
819デフォルトの名無しさん:2010/01/20(水) 19:39:51
>>808
eachごとの結果がほしいのなら
ブロックの外で定義した配列に
欲しい結果を入れておく。
またはブロックのto_aとか

701へのレス703, 709参照。
820804:2010/01/21(木) 10:54:34
俺の名誉のために言っておくが、>>810の言っていることは、
"RailsによるアジャイルWebアプリケーション開発”のサンプルコードの話じゃなくて、
>>810が取り組んでる仕事のコードだと思うぞ
821804:2010/01/21(木) 10:55:31
ごめん >>816-818読んでなかった。餌まいてスマソ
822805:2010/01/21(木) 10:56:56
ありがとうございます!

>>809
> breakはブロックの脱出、returnはメソッドの脱出ってこと

ああ!それです。まさにその1行が聞きたかったのです。
俺はもっとよい聞き方を憶えないといけないな・・・
823デフォルトの名無しさん:2010/01/21(木) 11:43:10
こうして>>804はプライドも外聞もズタズタになったのであった。
824デフォルトの名無しさん:2010/01/21(木) 12:57:39
1. ruby -e 'puts ARGF.read' file.txt
2. ruby -e 'puts $<.read' file.txt

1.の文では正しくfile.txtの内容が表示されるのですが、
2.の文で「指定されたファイルが見つかりません。」と怒られます。
リファレンスマニュアルの$<の項には
 「つまり定数 ARGF の別名。 」
と書いてあるので、
1.と2.で同じ結果を期待したんですけど。
どこが間違ってるんでしょうか?

Ruby1.9.1でOSはWindowsXPです。
よろしくお願いします。
825デフォルトの名無しさん:2010/01/21(木) 13:06:28
あ,自己解決しました。
Windowsの<とか>とかってエスケープするか
""で括らなきゃいけなかったんでした。

1. ruby -e "puts ARGF.read" file.txt
2. ruby -e "puts $<.read" file.txt
または
2. ruby -e 'puts $^<.read' file.txt
なら同じ結果になりますね。
スレ汚しスマソ。
826デフォルトの名無しさん:2010/01/21(木) 13:10:22
>>824
「指定されたファイルが見つかりません。」を出してるのは実はcmd.exeだ
「<」を誤認識してる

ということで cmd.exe から < をエスケープすればよい
cmd.exe のエスケープ文字は ^ だから、

ruby -e 'puts $^<.read' file.txt
827816:2010/01/21(木) 14:12:27
別に810や804を責めたいわけでもないんだが、質問と回答は
適切な場所でやった方がいいよ、ってことで。
828デフォルトの名無しさん:2010/01/21(木) 14:15:52
>>826
すみませんすみません
ありがとうございました。
829デフォルトの名無しさん:2010/01/21(木) 14:33:03
>>810
>・まず、.rhtmlがTopページしかなく、MVCとも.jsファイルばかり。
>・ブラウザに表示してソースコードを見てみると、1万行近い
> ソースコードで表示と一致していない。
>・ブラウザのURL表示がページ遷移しても常に一緒。
> と、始めて見る構成でした。

これはAjaxでページを作ってるんだろう。Railsうんぬんはさほど関係ない。

> 私のRubyの理解が足りないと思い、

いや、JavaScriptやAjaxの知識が足りないだけだと思う。
830デフォルトの名無しさん:2010/01/21(木) 14:34:48
831デフォルトの名無しさん:2010/01/22(金) 17:50:52
riっていらないよね
832デフォルトの名無しさん:2010/01/22(金) 17:58:09
rubygem パッケージマニュアルとしての ri に関しては、「とりあえず入れておく」というようなもんでもないな既に
現時点で ri を利用してないのなら、 --no-ri で飛ばしてOK
基本的にロクなこと書いてないしソースを grep したほうがおおむね速いので、rdoc もなくてもいい
rdoc がきっちりしているライブラリのみ、マニュアル読む機会があるときだけ rdoc コマンドで構成するか、
あるいはネットで公開されてる rdoc を読めばいい
833デフォルトの名無しさん:2010/01/22(金) 19:04:47
refeはいるけど、riはいらない
834デフォルトの名無しさん:2010/01/22(金) 19:13:46
デフォで--no-ri -no-rdocしても特にデメリットはないね
インストール速いしディスクアクセスも少なくて済むしいいことだらけ
835デフォルトの名無しさん:2010/01/22(金) 19:37:04
俺は.gemrcに書いたが、デフォルトでそうであれ、とまでは思わない。
836デフォルトの名無しさん:2010/01/22(金) 19:41:39
自分の作るライブラリにはRDocをていねいに書く
自分がインストールするライブラリではrdocは使わない
837デフォルトの名無しさん:2010/01/22(金) 19:46:04
日本語でいいならコメント書くんですがー
838デフォルトの名無しさん:2010/01/22(金) 19:54:48
>>837
あちらさんの使ってるフォント自体に日本語文字がないから、本気で表示が崩れるぞ
外国語の文字も適当に表示できるフォントの認知度が高いのは日本くらいだ
839デフォルトの名無しさん:2010/01/22(金) 19:59:50
とりあえず日本語でコメントを書きまくり、英語の得意な人がプロジェクトに参加してくれることを祈るというのはどう
英語でコメント書くの大変だって言うような人が作るライブラリなんて、どうせ最初に使うのは日本人が主だろうしさ
840デフォルトの名無しさん:2010/01/22(金) 20:14:17
そうだな、とりあえず日本人向けオンリーででもまず本体クオリティ上げるのが第一かもしらん
英語ドキュメント書けないからと言って諦めるのはもしかしたら勿体無さ過ぎるかもしれない
841デフォルトの名無しさん:2010/01/22(金) 22:08:16
質問です。ある1つのディレクトリ内にあるファイルを更新時間順にソートしてファイル名を連番(数字のみ)にしようと以下のコードを書きました。


def consecutivenum(path)
i = 1
files = Dir.glob("#{path}/*").reject{|name| FileTest.directory?(name)}
files.sort{|a, b|
File.mtime(a) <=> File.mtime(b)
}.each{|name|
File.split(name)[1] =~ /.+(\..+)/
File.rename("#{name}", "#{File.split(name)[0]}/#{i}#{$1}")
i += 1
}
end

実行するとファイルが消去されたりコピーされたりしてしまいます。
試しにDir.glob(#{path}/*)だけを実行したところ、存在しないファイル名が混じっていました。
また、そのファイルをFileTest.exist?に送るとtrueが返ってきます。Windowsの隠しファイルでもありませんでした。
何がどうなっているのかさっぱりわかりません。OSはVistaでRubyのバージョンは1.8.7です。
ご助力よろしくお願いします。長々と失礼しました。
842デフォルトの名無しさん:2010/01/22(金) 22:40:56
> 存在しないファイル名が混じっていました
存在します

または、UNICODEファイル名です
UNICODEファイル名だった場合、Rubyから扱うことはできません
843デフォルトの名無しさん:2010/01/22(金) 23:30:17
てか存在しないファイル名とか教えてくれりゃ結構一発だったり
844デフォルトの名無しさん:2010/01/22(金) 23:33:11
察してください、まで読んだ
845デフォルトの名無しさん:2010/01/23(土) 00:28:53
>>842
>>843

ファイル名ですが、エクスプローラーやコマンドプロンプトのdirで確認できずにrubyで検出されたのは

6.jpg
2.ini

の二つです。
846841:2010/01/23(土) 00:29:59
失礼
>>845の書き込みは>>841の者です。念のため。
847デフォルトの名無しさん:2010/01/23(土) 00:59:11
本当に存在しないファイルなの?
そのディレクトリで
system('start 6.jpg')
ってやればjpegに関連付けられたアプリで 6.jpg が開くから確かめてみたら?
848デフォルトの名無しさん:2010/01/23(土) 01:01:01
あとは

dir /x

とか
849デフォルトの名無しさん:2010/01/23(土) 01:08:43
>>847
6.jpgについてはエラーが出ましたが、2.iniは開かれました。

>>848
6.jpg、2.iniいずれも出ませんでした
850デフォルトの名無しさん:2010/01/23(土) 01:16:26
2.iniがでてきたってことは、ファイル自体はあるってことだよね?
でもdirでは出てこないのか・・・謎だ・・・

require 'win32ole'
fso = WIN32OLE.new('Scripting.FileSystemObject')
fso.GetAbsolutePathName('2.ini')

とかしてみたら?
851デフォルトの名無しさん:2010/01/23(土) 01:27:40
>>850
さきほどまでのフォルダではなくtempフォルダのパスが出ました。
今度はそのtempフォルダで start 2.ini を実行しましたが開かれず、dirでも見つかりませんでした
852デフォルトの名無しさん:2010/01/23(土) 01:35:45
とりあえずスクリプトに
$KCODE = 'SJIS'
を付けて実行してみるべき

FileSystemObjectで見えているパスはWindowsで見えているパスなので
fso経由で2.iniが見えているのにdirで見えないのは、ちょっと不思議
853デフォルトの名無しさん:2010/01/23(土) 01:48:34
$KCODE = "SJIS"を付けてみましたが特に変わりないようです
(ただ、コンソールの作動場所のせいかスクリプトの保存場所のせいかまた別のパスが返ってきましたが)

>>850のスクリプトはなにを意味するのですか?2.iniの代わりに適当な文字列を入れてもパスが返ってくるのですが・・・
854デフォルトの名無しさん:2010/01/23(土) 02:49:29
まだいるかな?
attrib *.*
はどう?
855デフォルトの名無しさん:2010/01/23(土) 02:52:21
なんかの拍子にシステムファイルになったんじゃない?
フォルダオプション→表示→保護されたオペレーティング〜
のチェック外してみ
856デフォルトの名無しさん:2010/01/23(土) 14:46:40
dir で出てこなくて dir /a で出てくるなら
存在はしてるけど何らかの属性がついてて、そのせいでエクスプローラーに表示されないだけだな
857デフォルトの名無しさん:2010/01/23(土) 15:10:59
./hoge.rb を実行するときに例えば ./hoge.rb --debug のようにしてデバッグモードにして
そのときだけ状態メッセージを print するためにはどのようにするのは ruby 的にエレガントでしょうか?
858デフォルトの名無しさん:2010/01/23(土) 15:12:05
もはやRubyとは関係ないな
859デフォルトの名無しさん:2010/01/23(土) 15:43:41
>>857
読み手にとっていちばん妥当なもの

require 'logger'
@log = Logger.new(@logfile||$stdout)

@log.debug "debug log message" if @log

書く人が楽だがメソッド名に独り善がり感またはどや顔が滲み出たもの

def D(msg)
return unless @debug_output
@debug_output << msg
@debug_output << "\n"
end

@debug_output = $stderr
D "debug log message"


後者のタイプで def LOG(msg) を時々見る
860デフォルトの名無しさん:2010/01/23(土) 17:54:08
>>859
ありがとうございます!
後者のDをDoyagaoとして使いたいと思います(違)^A^K二つの視点から例を出していただきとても参考になりました!
861デフォルトの名無しさん:2010/01/23(土) 18:59:49
>>841です

>>854-856
2.iniがシステムファイルとして存在していました。相変わらず6.jpgは見つかりません。
862デフォルトの名無しさん:2010/01/23(土) 19:46:16
どこにだよ
tempか?
最初のフォルダの中のファイルは全部連番に変わったのか?
tempのファイルも全部か?
863デフォルトの名無しさん:2010/01/23(土) 21:43:18
ブロックスペシャルファイル(readするとバイト列が得られます)の長さを
調べたいのですが、実際にreadすることなしにこれを実現する方法はありますか?

パッと思いついたのは、openしてからファイルの末尾にseekして
先頭からのpositionを得るという方法ですが、他にはありますか。
864863:2010/01/23(土) 21:46:20
例えばこんな感じです:

File.open("/dev/sda") do |io|
 io.seek 0, IO::SEEK_END
 io.pos # /dev/sda のバイト列の長さ
end
865デフォルトの名無しさん:2010/01/23(土) 21:49:18
関数の外で@も@@も付けずに定義した変数はいったいどこに保存されるのでしょうか?

x = 10
def func
x = 20
end
func
puts x #=>10
これがxが20にならないので、最初に定義したxはグローバルには見えないどこかに閉じ込められてるのかな。
866デフォルトの名無しさん:2010/01/23(土) 21:50:04
>>863
完全にUNIX/Linuxプログラミングの話題じゃまいか
867デフォルトの名無しさん:2010/01/23(土) 21:51:41
>>866
を、Rubyで実現するにはどうすればいいですかという話だろう
868デフォルトの名無しさん:2010/01/23(土) 21:53:55
>>865
変数のスコープという概念を勉強してくれ
ごく端的に説明すると消えるというか、スコープを抜けるとアクセス不可になって取り出す手段がなくなる
def の「中」のローカル変数は def の「外」からはアクセスできない
だからメソッドの引数で「中」に入れてメソッドの返り値で「外」に出す
869デフォルトの名無しさん:2010/01/23(土) 21:57:27
File.statでサイズ読めないかね
870デフォルトの名無しさん:2010/01/23(土) 22:02:55
俺もそうおもた
871863:2010/01/23(土) 22:03:17
>>869
やってみたのですが size = 0 になっています。
statコマンドで調べても0バイトになっています。

そもそも、ブロックスペシャルファイルのバイト列の長さって、デバイス依存な気がします。
つまり「ファイルサイズ=バイト列の長さ」は成り立たない、ということかも知れません。
872デフォルトの名無しさん:2010/01/23(土) 22:03:31
$ sudo ruby -e "p File.stat('/dev/sda')"
#<File::Stat dev=0xe, ino=5003, mode=060660, nlink=1, uid=0, gid=6, rdev=0x800,
size=0, blksize=4096, blocks=0, atime=Sat Jan 23 18:12:33 +0900 2010,
mtime=Sat Jan 23 18:12:33 +0900 2010, ctime=Sat Jan 23 18:12:55 +0900 2010>
873863:2010/01/23(土) 22:06:31
>>872
ふむ、、やっぱり size = 0 ですね。。

バイト列の長さがデバイス依存(つまり不定値)なのは、よく考えてみればわかります。
/dev/null は常に長さ0ですし、/dev/zero は無限大。
難しいです。。
874デフォルトの名無しさん:2010/01/23(土) 22:11:19
そもそもなににつかうん
875デフォルトの名無しさん:2010/01/23(土) 22:12:16
やっぱりUNIXスレで聞いたほうがいいと思うんだ

カーネルとファイルシステムの知識が必要だし
Ruby初心者スレで聞くような話題じゃないよ
876865:2010/01/23(土) 22:18:31
>>868
ありがとうございます。
ただ、自分が不思議に思ったのは、外から関数内の変数にアクセスできないことではなく、
関数の外の変数に内側からアクセスできてないことです。
一般的に内側から外側の変数にはアクセスできると思うので。
x=20の段階で、外側の変数に代入するのではなく、新しい変数を作ってしまっているのが不思議なんです。
877デフォルトの名無しさん:2010/01/23(土) 22:18:59
>>876
変数のスコープという概念を勉強してくれ
878863:2010/01/23(土) 22:19:06
>>874
LVM の論理ボリュームのスナップショットを自動で作成しようかと。
ただし、論理ボリュームの大きさが:
・Xバイト以下だったら、それと同じ大きさのスナップショットを作成
・Xバイトより大きければ、Xバイトのスナップショットを作成

という処理をしたかったのですが、論理ボリュームの大きさを調べるために
外部のコマンドに投げるのは嫌だったので、どうせならデバイスファイルの中身の大きさを調べちゃえ、みたいな感じです。

>>875
すみません、そうします。
カーネルの知識はありませんが。。
879デフォルトの名無しさん:2010/01/23(土) 22:22:19
はいさよなら
880デフォルトの名無しさん:2010/01/23(土) 22:27:03
>>878
わあそれはRuby標準では無理だ
そのように動作するようなロジックを知っている上で、Rubyでそのまま記述する必要がある
881デフォルトの名無しさん:2010/01/23(土) 22:31:03
fdisk -l /dev/sda とかやってみると、ディスクの大きさが表示されるね。
Cで書かれているから読んでみれば分かるかな?
ioctlに投げているのかも知れないが、詳しくはわからん。
882デフォルトの名無しさん:2010/01/23(土) 22:31:58
Ruby
883デフォルトの名無しさん:2010/01/23(土) 22:39:51
>>875
関数は単なるブロックとは違うよ

x=1
if true
x=2
end
puts x
これなら2が出力されるけど。ごっちゃになってるんじゃないかな
884デフォルトの名無しさん:2010/01/23(土) 22:40:36
>>876だったすまん
885デフォルトの名無しさん:2010/01/23(土) 23:22:06
>>876, 883
制御構造はブロックを作らないので例がいまいち

if true then x = 'foo' else y = 'bar' end
puts x #=> 'foo'
puts y #=> nil

ブロックは do end や {} で作られる
↓を読んでみよう
http://www.ruby-lang.org/ja/man/html/trap_A5B9A5B3A1BCA5D7A1A2C0A9B8E6B9BDC2A4.html

ただし、上のページの一番最後のブロック内で現れたローカル変数の取り扱いは
1.8系と1.9系で異なる
1.9系であれば最後の "p a.class" は Array になる
http://d.hatena.ne.jp/conceal-rs/20090119#1232348671
886デフォルトの名無しさん:2010/01/24(日) 02:19:34
if true then x='foo' end
puts x #=> 'foo'

ruby1年も使ってるのにこれ知らなかったw
if文ってスコープ作らないのか
887デフォルトの名無しさん:2010/01/24(日) 02:24:52
>>886
if文ではありません
888デフォルトの名無しさん:2010/01/24(日) 04:02:11
>>886
変数宣言がない言語は一般的に、if文やwhile文では変数スコープを作らないんじゃないかな。
PHPやpythonも作らないし。
Perlはmyが、JavaScriptはvarがあるから作るけど。

>>887
こういう、わざわざ初心者を混乱させるような書き方するやつって何なんだろうね。
889デフォルトの名無しさん:2010/01/24(日) 04:10:31
いやJavaScriptのvarは関数スコープだぞ
ブロックスコープはlet(Javascript1.7)
890デフォルトの名無しさん:2010/01/24(日) 05:12:52
JavaScriptの関数スコープは本当にキモい

x = 10; // var 宣言していないのでグローバル変数
function tmp() {
 alert(x);
 var x = 20;
}

alertで表示されるのは 'null'
なぜなら『関数』スコープだから
関数内でローカル変数が宣言されているので
グローバル変数がシャドウイングされる
でもまだ未定義なので 'null'
891デフォルトの名無しさん:2010/01/24(日) 06:15:33
js廚がアフォなのがよくわかるスレw
892デフォルトの名無しさん:2010/01/24(日) 06:48:37
なぜRubyスレにjs厨がw
なにがアフォなのかわからない俺には
釣ることもできんがwww
893デフォルトの名無しさん:2010/01/24(日) 07:29:56
>>888
> こういう、わざわざ初心者を混乱させるような書き方するやつって何なんだろうね。
制御構造はスコープを作らない
ifは制御構造だからスコープを作らない
ブロックは制御構造ではないからスコープを作る
894デフォルトの名無しさん:2010/01/24(日) 11:48:10
>>893
最初からそれを書けば文句言われなかったのにね
895デフォルトの名無しさん:2010/01/24(日) 11:48:30
>>888
混乱というが、値を返す式であるということは知っとくといいこともあるかもよ
896デフォルトの名無しさん:2010/01/24(日) 11:59:34
>>895
なるほど

x = if true then a = 'foo' end
p x #=> "foo"

で、この後
x = if x == a then puts x end
だと
p x #=> nil

で1.9.1の
x = if x == a then p x end
だと
p x #=> "foo"

うむ、わかりやすいなw
897デフォルトの名無しさん:2010/01/24(日) 12:53:12
なるほどわからん
898デフォルトの名無しさん:2010/01/24(日) 13:06:48
>>894
ifが文ではないとしたら何なのだろうと考えないのかね
899デフォルトの名無しさん:2010/01/24(日) 13:22:19
初心者には暗黙の了解の部分が分からないんだよ
だから書かないと
900デフォルトの名無しさん:2010/01/24(日) 13:22:59
文と式って何が違うの?
901デフォルトの名無しさん:2010/01/24(日) 13:26:22
わかりやすいwww
if if if true then a = true end then a = false end then else a = 'foo' end
p a #=> 'foo'
902デフォルトの名無しさん:2010/01/24(日) 13:29:55
>>900
難しい質問だなw
返値があって代入の = の右に書けるのが式、ぐらいの理解でいいと思う
903デフォルトの名無しさん:2010/01/24(日) 13:37:22
>>900
式は他の式の一部になれる、文の一部にもなれる。
文は文の一部にはなれない。
ただし、文は括弧で囲むと式になり、式は(ry
904デフォルトの名無しさん:2010/01/24(日) 13:41:39
Ruby ではかなりあいまいなので、C の場合、

値があるのが式、値がないのが文
セミコロンを付けて文(式文)になるのが式
文は {} で囲んで複文という文になる
905デフォルトの名無しさん:2010/01/24(日) 13:45:38
>>899
暗黙なんかじゃない
制御構造だとマニュアルにも書いてあるし、解説も多くがそのように言うはずだ
if文なんて書いてあったら焼き捨てろ

と書くとオフィシャルマニュアルの古い部分の記述が焼かれていい感じだが
ポリシー無しにかかれてた時代のはどんどん置き換えるべき
906デフォルトの名無しさん:2010/01/24(日) 13:53:29
loopは制御構造じゃなくてただのブロックつきメソッドなんだよね
907デフォルトの名無しさん:2010/01/24(日) 13:55:52
制御構造も式の一つでしょ
>また、メソッドの引数に指定できない式と指定できる式があります(このような式を「文」と呼び分ける場合があります)。
ってあるしif文って呼んでも別に問題ないんじゃないかなーって思うけど
http://www.ruby-lang.org/ja/man/html/_A5D7A5EDA5B0A5E9A5E0.html
908デフォルトの名無しさん:2010/01/24(日) 14:00:55
「if」「制御構造if」「if制御構造」「if〜end」「if式」

このへんがやっぱり妥当
制御構造ifとかなんか続編のゲームっぽいが

「if文」があまりよくないのは「文は値を返さない」というのが全言語間で「なんとなく」共有されてるから
発言者が if は値を返すというのを理解していない可能性を仄めかしている
レシーバ無しメソッドが関数と根強く呼ばれるのと同じようなイメージ
909デフォルトの名無しさん:2010/01/24(日) 14:14:10
>>887がじゃあ何なのかを書かなかったことがこの流れの始まり
910デフォルトの名無しさん:2010/01/24(日) 14:22:23
>>888がアホだっただけのような気もするが…
911デフォルトの名無しさん:2010/01/24(日) 14:28:13
発火点が主因が給油点が主因かというのは太古の昔から輪廻のように繰り返される議題でありまして
912デフォルトの名無しさん:2010/01/24(日) 14:28:18
>>890
『未定義』だと宣言済みなのと訳わからなくなるから
『未代入』の方がいいかも

>>908
同意
更にRubyのifは値を返すし
913デフォルトの名無しさん:2010/01/24(日) 14:29:31
つか文なんていうからわかりにくいんだよ
ステートメントなら返却値がないのは当然だってわかるだろ
914デフォルトの名無しさん:2010/01/24(日) 14:29:47
String x, Array yに対して
x % y って何を表してんの?
915デフォルトの名無しさん:2010/01/24(日) 14:31:54
>>914
String#%調べれ
Stringのインスタンスメソッド%だ
x.%(y) だな
916デフォルトの名無しさん:2010/01/24(日) 14:39:46
んじゃ正確に言えば
Javaではif文
rubyではif式
と呼ぶ。
この認識であってるのかな?

というか皆そんなことまで考えて言葉選んでたのか。
自分の適当さ加減に気付かされた気がする
917デフォルトの名無しさん:2010/01/24(日) 14:51:29
皆そんなことまで考えて言葉選んでない
918デフォルトの名無しさん:2010/01/24(日) 15:03:15
>>916
if 式というか、Ruby の if は他の C のような言語とは違って式として機能する、が正確
それを踏まえて if のことを if 式と呼ぶか if 文と呼ぶか if とだけ呼ぶかは自由
とりあえずは、Ruby の if は値を返すということだけ憶えてもらえればいい

他にはどういうのがあるのかな、と思ったときには「制御構造」という分類呼称を思い出してくれ
これに分類されるものはいわゆる後置 if のような修飾子以外、式で値を返す
それと、当初の話題だったはずなのに既に忘れ去られてるがスコープを作らない

時々言われてるのは「while true はスコープを作らないが loop はスコープを作る」だが
これは単にブロックつきメソッドであるかどうかの違いに過ぎない
loop は制御構造ではなく関数的メソッド、つまり Kernel#loop で、each がスコープを作るのと完全に同一の理屈

>>917
そりゃ君だけだ
919デフォルトの名無しさん:2010/01/24(日) 15:14:57
>ruby -ve "def self.if;p 'if_method';end;self.if"
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
"if_method"

奥が深い
920デフォルトの名無しさん:2010/01/24(日) 15:28:19
parse.y で stmt なら文、expr なら式
921デフォルトの名無しさん:2010/01/24(日) 15:32:11
RHGを何度読んでも分からない。
青木さんは天才なんだおる。
922デフォルトの名無しさん:2010/01/24(日) 15:35:09
なんだっていいんだよ
話し手も聞き手も意味が分かってれば
923デフォルトの名無しさん:2010/01/24(日) 15:45:40
『せっかくだから、俺はこっちのifが式なRubyを選ぶぜ』
少なくとも俺はそこまでの域には達してないw
読み書きするときに留意はしてるけど
924デフォルトの名無しさん:2010/01/24(日) 16:10:38
>>922
いちいち単語ごとに相手も自分と同じ認識をしているか
確認するのはメンドクサイ。
かといって曖昧にすると情報に齟齬が発生する
だから定義をつくる事と定義を守る事と定義を周知する事は大事だと思う
925デフォルトの名無しさん:2010/01/24(日) 16:27:39
スコープの話をしているところにifブロックと言ったとかならともかく
返値が関わるような話なんてしてなかったところでぐだぐだするのは
まるでグローバル変数みたいだな
926デフォルトの名無しさん:2010/01/24(日) 16:52:14
>>922
それは1行目と2行目に繋がりが見えない

なんだっていいなら意味の疎通は不問だろう
意味意図が通じるのが第一なら表現は一考されるべき
927デフォルトの名無しさん:2010/01/24(日) 16:56:21
名前重要
928デフォルトの名無しさん:2010/01/24(日) 17:12:15
you = if 'neet' then 'fuck' else 'good' end
三項演算子要らないんだな
929デフォルトの名無しさん:2010/01/24(日) 17:25:30
オイオイ、それじゃみんなfuckだよw

Cっぽく書きたい人のためにあるんだろうな > 三項演算子
930デフォルトの名無しさん:2010/01/24(日) 17:31:25
if then else end
って書くのがRubyっぽいのか?
931デフォルトの名無しさん:2010/01/24(日) 17:43:51
1.9が広がりきってないうちに
9と8で結果の違うことをコードに入れたくないね
932デフォルトの名無しさん:2010/01/24(日) 17:44:41
>>930
うん、まあ、一応は
一応は、ね

条件演算子はそれこそメソッド引数やらリテラル埋め込み記述やらに使う
短く見やすく記述できることがウリだが、実用上はカッコ連打で結構微妙な状態に陥ることが多い

「どうせ来週の版では記述増えてifに置き換わってるんだから最初からifで書こうぜ」みたいな感じはなくもない
933デフォルトの名無しさん:2010/01/24(日) 17:51:50
>>931
じゃあ1.9使うの禁止な
934デフォルトの名無しさん:2010/01/24(日) 17:52:36
Rubyは文も値を返す。
返せないのは制御を返さないreturnとかbreakとかだけ。
という意味で>>907に引用されている文が一番正確。
935デフォルトの名無しさん:2010/01/24(日) 17:57:01
いやそれはRubyはナニを文と呼んでるかという自己問題が
936デフォルトの名無しさん:2010/01/24(日) 18:03:53
>>920最強伝説
937デフォルトの名無しさん:2010/01/24(日) 18:25:38
>>931
変わってるのはブロックのスコープで、if関連は変わってないのでは?
938デフォルトの名無しさん:2010/01/24(日) 18:39:31
もう全て式でいいや
余計分からなくなってきた
責任取ってくれ
939デフォルトの名無しさん:2010/01/24(日) 18:44:44
本スレだと思ったら初心者スレか・・・
940デフォルトの名無しさん:2010/01/24(日) 18:48:41
初心者を馬鹿にすると初心者に泣く
941デフォルトの名無しさん:2010/01/24(日) 18:51:17
初心者のころからきちんと式とスコープを勉強しておけば混乱することなんて全くないんだよ
初心者のうちに式とスコープを勉強しようとすると混乱してわけわかめになることについては責任もたん
942デフォルトの名無しさん:2010/01/24(日) 22:15:59
stripだとASCIIしか除去してくれないけど
いわゆる全角スペースも除去するにはどうしたらいい?
utf8のスペースが" "と" "しかないなら
sub /^[\s ]+/, "" て書くけど…
943デフォルトの名無しさん:2010/01/24(日) 22:34:21
1.9では、gsub(/[[:space:]]+/, '') でいける。

http://ja.wikipedia.org/wiki/スペース に載ってるスペース文字はOK
944デフォルトの名無しさん:2010/01/24(日) 23:38:23
おっと、
U+200B ZERO WIDTH SPACE
U+FEFF ZERO WIDTH NON-BREAKING SPACE (別名BYTE ORDER MARK)
は[[:space:]]で認識されなかった。
945デフォルトの名無しさん:2010/01/25(月) 02:51:21
>>841です

>>862
2.iniはtempではなく最初のフォルダにありました
>>850
require 'win32ole'
fso = WIN32OLE.new('Scripting.FileSystemObject')
fso.GetAbsolutePathName('2.ini')
を実行しましたが、'2.ini'を適当な文字列にしても、スクリプトの実行場所にあるファイルとしてpathが返ってくるのでいまいちよくわかりません。

>>841を何度か実行しましたが、毎回いくつかのファイルが削除されていき、たまにコピーされて数が増えているのもあります。
うまく連番になるときとならないときがあります。
946デフォルトの名無しさん:2010/01/25(月) 09:17:19
送り幅ゼロだと「スペース」と名乗っててもspaceじゃないわけだ
947デフォルトの名無しさん:2010/01/25(月) 11:39:34
>>944
trunk の[[:space:]]とかの定義は http://unicode.org/reports/tr24/ を参照しているのだが、
どうもZWNBSPは制御文字扱いらしい
948デフォルトの名無しさん:2010/01/25(月) 11:56:31
バイトオーダーマークがヒットしたら困るだろ常識的に考えて
949デフォルトの名無しさん:2010/01/25(月) 14:16:06
>>948
ZWNBSPはBOMじゃないってば!
950デフォルトの名無しさん:2010/01/25(月) 19:43:38
>>930
式 ? 真の時 : 偽の時
式 and 文
式 or 文
文 if 式
文 unless 式

if 式
then 文
else 文
end

if 式 (then)
 文
else
 文
end

unless 式 (then)
 文
end

たくさんあって、悩むw
951デフォルトの名無しさん:2010/01/25(月) 21:22:20
外からクラス変数にアクセスするにはどうすればいいのでしょうか?
インスタンス変数ならattr_accessorがありますが、クラス変数の場合は自前でゲッターメソッドを定義するしかないのかな?
952デフォルトの名無しさん:2010/01/25(月) 21:36:00
>>951
オブジェクト外から内部の変数にアクセスする仕組みというのはRubyでは全く存在しません
メソッドの返り値に明示的に指定します

なお、アクセサのある言語からきた人を上っ面だけ騙してRubyを嫌わせるために
def hoge
@hoge
end
と3行書く代わりにattr_reader :hogeと書けるという短縮形が用意されています
953デフォルトの名無しさん:2010/01/25(月) 21:50:56
attr_* は Ruby1.9 で消えると思ってたんだが意外としぶといな
954デフォルトの名無しさん:2010/01/25(月) 21:54:34
>>952
ありがとうございます。
インスタンス変数の場合はattr使うのは分かるのですが、クラス変数にはそういう文法が無いのですか?
その都度自前でゲッターを作るのですか?
955デフォルトの名無しさん:2010/01/25(月) 21:57:03
>>953
消えるわけ無いだろ…ほとんどの既存プログラムが動かなくなる。
Railsとかフレームワークでもごりごり使ってるのに。
956デフォルトの名無しさん:2010/01/25(月) 21:58:28
>>954
> インスタンス変数の場合はattr使う
だから使わないんだって
957デフォルトの名無しさん:2010/01/25(月) 22:04:59
あーうん、attr_* は初心者は使わないのがいいぞ
>>951みたいに混乱するからさ


やっぱなくしたほうがいいと思うなあ
本物のアクセサとしての機能を提供してるわけじゃないし
(セッターとゲッター設定したのに○○できません、はもうお約束)
内部変数と同じ名前のメソッドを提供するということにどれほどの意味があるのか
内部変数関係なく、わかりやすい名前と使いやすい引数のメソッド作れよ
958デフォルトの名無しさん:2010/01/25(月) 22:24:34
>>955
俺の作ってるライブラリは動くぞー
attr系はひとつも使ってない
「rdocでの扱いがキモいから」という理由が主だが
959デフォルトの名無しさん:2010/01/25(月) 22:29:27
attr系が無くなるのは個人的には非常に困る
てか、使いまくってる
960デフォルトの名無しさん:2010/01/25(月) 22:35:06
ごちゃごちゃした実装を綺麗に一から作り直してくれるなら互換性が全くなくなってもいい
Railsプロジェクトは異常なほど開発サイクル早いからすぐに対応するだろう
ruby2.0を作ろう
961デフォルトの名無しさん:2010/01/25(月) 22:39:42
>>954
まずクラス変数自体あんまり使わない
それでもクラス変数のアクセサメソッドを作りたいんだったら手で書くか
それかattr系メソッドを自分で定義するか
class Module
  def attr_class_reader(*names)
    names.each{| name |
      module_eval "def #{name}; @@#{name}; end"
    }
  end
end
962デフォルトの名無しさん:2010/01/25(月) 22:45:23
> Railsプロジェクトは異常なほど開発サイクル早いからすぐに対応するだろう
プッ
963デフォルトの名無しさん:2010/01/25(月) 22:55:38
Railsのほうから文句言ってくるに1票
964デフォルトの名無しさん:2010/01/25(月) 23:22:08
わざわざ文句なんて言わずに、>>961のように自前で書いて終わりだろう
965デフォルトの名無しさん:2010/01/25(月) 23:29:42
>クラス変数自体あんまり使わない

これは嘘だろ。クラス変数を外から参照することはあまり無いけど。
966デフォルトの名無しさん:2010/01/25(月) 23:49:51
1.9 使ってると、継承先で書き換えられると怖いからクラス変数は避けるようになった
大体はクラスオブジェクトのインスタンス変数でどうにかごまかせる
967デフォルトの名無しさん:2010/01/25(月) 23:50:41
今はクラスインスタンス変数使うと思う
クラス変数は使わないな
968デフォルトの名無しさん:2010/01/26(火) 00:20:10
うええええマジですか?
969デフォルトの名無しさん:2010/01/26(火) 00:36:36
Rubyはクラスオブジェクト(モジュールオブジェクト)自体をおおむね1個しか作らんのだから、
そのオブジェクトのインスタンス変数はクラス変数と実用上の違いはない

クラスインスタンス変数という機構があるわけじゃないぞ

irb>
class CIns
@hoge=0
def self.hoge; @hoge; end
end
irb> p CIns.hoge
0
irb> class CIns2 < CIns; end
irb> p CIns2.hoge
nil

irb>
class CCval
@@hoge=0
def self.hoge; @@hoge; end
end
irb> p CCval.hoge
0
irb> class CCval2 < CCval; end
irb> p CCval2.hoge
0

970デフォルトの名無しさん:2010/01/26(火) 00:50:43
>>969はattr_readerを使いたかったはずだと思った
流れ上使わないようにしろってのがwwww

Rubyのクラスインスタンス変数は、ふつう、attrとselfを使ってこう書く

class C
class << self; attr_accessor :hoge; end
end

これを見たら「あークラスインスタンス変数作ってるー」と思ってくれ
見慣れないとナニを意図してやってんだかさっぱりわからん謎の記述だ
971デフォルトの名無しさん:2010/01/26(火) 00:53:21
クラスインスタンス変数ってのは一般的な用語なのか
972デフォルトの名無しさん:2010/01/26(火) 01:01:00
>>971
Smalltalkにはクラスインスタンス変数(class instance variables)がナチュラルに存在してるぞ
973デフォルトの名無しさん:2010/01/26(火) 01:16:39
なんでクラス変数使っちゃいけないのかがそもそも分からないんですけど
974デフォルトの名無しさん:2010/01/26(火) 01:23:56
俺ルールの押しつけだから気にしないで使って良いよ
975デフォルトの名無しさん:2010/01/26(火) 01:30:37
>>969
それって1.9だとクラス変数もnilになるんじゃないの?
976デフォルトの名無しさん:2010/01/26(火) 07:17:13
>>957
>あーうん、attr_* は初心者は使わないのがいいぞ
>>>951みたいに混乱するからさ

まるで意味がわからない。
951ってこれだよね?
> 外からクラス変数にアクセスするにはどうすればいいのでしょうか?
> インスタンス変数ならattr_accessorがありますが、クラス変数の場合は自前でゲッターメソッドを定義するしかないのかな?

別に混乱しているようにはとても思えないし、初心者がattr_*を使わないほうがいい理由になっているとも思えない。

「attr_*を使わないほうがいい」なんて意見、初めて聞いた。こんなバカ発言、だれがいいだしたの?
977デフォルトの名無しさん:2010/01/26(火) 08:04:12
>>973-974
だから継承先で書き換えられるかもって言ってんじゃんよ
そんなことはないとか、むしろそう使うつもならどんどんクラス変数使ってください

ところで次スレって980ですか
978デフォルトの名無しさん:2010/01/26(火) 08:54:28
名前重要、と言ってるすべての人が、attrを実質的に否定してると思う
attrは設定メソッド名と参照メソッド名と内部変数名を統一してしまう
この2者・3者に共通して妥当な名称を、俺はそんなに思いつく自信がない
979デフォルトの名無しさん:2010/01/26(火) 09:14:47
>>975
クラス変数の扱いは1.9の途中から1.8相当に変更されて1.9.1に至ってるけどちゃんとアップデートしてる?
980デフォルトの名無しさん:2010/01/26(火) 18:40:40
>>978
>名前重要、と言ってるすべての人が、attrを実質的に否定してると思う

そんなのまるで聞いたことないので、具体的に誰がどう否定しているのか紹介してくださいおねがいします。

> attrは設定メソッド名と参照メソッド名と内部変数名を統一してしまう
> この2者・3者に共通して妥当な名称を、俺はそんなに思いつく自信がない

統一したらなんかまずいんでしょうか。
def name
@value
end
のほうがよっぽどきもいように思います。

981デフォルトの名無しさん:2010/01/26(火) 18:47:45
getほにゃらら setほにゃらら が正義、ってことかな?
982デフォルトの名無しさん:2010/01/26(火) 18:56:23
method と value に同じ名前がつくことのほうが事象としては稀だと思う
日本語じゃないから食い違いに気がつけないだけかもしれんが
983デフォルトの名無しさん:2010/01/26(火) 19:04:25
英語圏では、動詞と名詞が同じ綴り、というのに使われてる気がするが、気のせいかも
984デフォルトの名無しさん:2010/01/26(火) 19:20:19
ただのメソッドのくせにrdocで別項になるのが気持ち悪いので使ってない
通常のインスタンスメソッド一覧に混ぜるタイプのマニュアルライブラリはない?
985デフォルトの名無しさん:2010/01/26(火) 19:25:32
えーちょっと何が言いたいかわからんなあ
長さを得るメソッドがlengthで長さを保持するインスタンス変数が@lengthって自然だと思うけど
986デフォルトの名無しさん:2010/01/26(火) 19:47:36
細かい部分だけど、長さを得るメソッドならlength?のほうがより良いよね
でも@length?にはできないせいattrが使えないし
細かい違いよりもattrの便利さのほうが上回るからlengthに流れてしまう

別にattr否定派というわけではないけど
こういったように名付けに縛りが生まれるというか消極的になるのはattrの罪だと思う
987デフォルトの名無しさん:2010/01/26(火) 19:51:15
>>950
青木峰郎氏によると、unless, untilはオススメらしい。

http://jp.rubyist.net/magazine/?0010-CodeReview#l13
988デフォルトの名無しさん:2010/01/26(火) 19:52:25
>>986
> 細かい部分だけど、長さを得るメソッドならlength?のほうがより良いよね

なんで?「長さ」なら具体的な数値を返すべきだと思うけど。
基本的に「?」が付くメソッドは真偽値(True or False)を返すというルールだったはずだが。。
989デフォルトの名無しさん:2010/01/26(火) 19:53:42
Rubyってプロパティ無いんだよね
990デフォルトの名無しさん:2010/01/26(火) 19:57:15
>>988
指摘thx、激しく勘違いしている>>986はなかったことに
991デフォルトの名無しさん:2010/01/26(火) 20:52:03
メソッド名が名詞だと何が問題なのか全くわからん。
そもそもrubyはメソッドをプロパティのように見せることで、
オブジェクトの安全性は保ちながら読み手には簡潔に見える、ってのがコンセプトの一つだったような。
Railsなんてその最たる例だ。
992デフォルトの名無しさん:2010/01/26(火) 20:57:45
次スレのテンプレに「次スレは>>970が立てること」みたいなの入れとこうぜ
993デフォルトの名無しさん:2010/01/26(火) 20:58:15
Rails は Rails語としてRuby から分岐していんではないだろうか?
とか思ったりなんかしちゃったりする今日この頃
994デフォルトの名無しさん:2010/01/26(火) 21:10:48
length? の例えはおかしいと思うが、真偽値を格納するアクセサならまぁ
995デフォルトの名無しさん:2010/01/26(火) 22:05:23
>>993
Ruu語と空目するtogther
996デフォルトの名無しさん:2010/01/26(火) 22:06:59
RubyとRailsはある時期から急速に廃れるような気がしてならない
997デフォルトの名無しさん:2010/01/26(火) 22:10:55
>>991
gui とか書くとき form.listbox とかで何か値返してきたら
住所不定小包とどいたけど、これじゃない・・・とかか?
998デフォルトの名無しさん:2010/01/27(水) 09:38:00
Rubyですごい事が出来た実例を教えて下さい。
999デフォルトの名無しさん:2010/01/27(水) 13:31:08
Rails
1000デフォルトの名無しさん:2010/01/27(水) 13:49:40
もはやrubyじゃなくなってるけどな。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。