Ruby初心者スレッド Part 11

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは2以降。Ruby on Railsの質問はWebProg板のRailsスレで。

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

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


宗教的な話題は禁止します。
2デフォルトの名無しさん:2007/03/23(金) 08:55:38
# 本スレ
Rubyについて Part 26
http://pc11.2ch.net/test/read.cgi/tech/1173036694/

# 関連スレ
【Ruby】Ruby on Rails Part3
http://pc11.2ch.net/test/read.cgi/php/1170760209/

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

RUBYの宿題教えてください。
http://pc11.2ch.net/test/read.cgi/tech/1106572657/

Rubyは難しすぎ
http://pc11.2ch.net/test/read.cgi/tech/1156496224/

【最高言語】 Rubyist Magazine創刊 【ルビま!】
http://pc11.2ch.net/test/read.cgi/tech/1094825807/

Python厨とRuby厨が仲直りするスレッド
http://pc11.2ch.net/test/read.cgi/tech/1099804004/

Jython、Groovy、JRuby - どれが一番効率的?
http://pc11.2ch.net/test/read.cgi/tech/1100563765/

ムカツクRubyピッケル本をイラツキながらも読んでみるスレ
http://pc11.2ch.net/test/read.cgi/tech/1160945741

Ruby>>>>>Java
http://pc11.2ch.net/test/read.cgi/tech/1158807229/
3デフォルトの名無しさん:2007/03/23(金) 08:56:42
4デフォルトの名無しさん:2007/03/23(金) 08:59:35
= 公式非公式関連リンク

== Rubyを知る
Ruby Home Page
http://www.ruby-lang.org/ja/

== Ruby使用時の調べもの
Rubyリファレンス
http://www.ruby-lang.org/ja/man/
http://www.ruby-doc.org/ (英語)
リファレンスのHTMLヘルプ版配布
http://elbereth-hp.hp.infoseek.co.jp/ruby.html
# Windowsで便利
Ruby FAQ
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ

Programming Ruby - The Pragmatic Programmer's Guide
http://www.ruby-doc.org/docs/ProgrammingRuby/
# 好評書籍をWebで公開中、ただし英語
逆引きRuby
http://www.namaraii.com/rubytips/
5デフォルトの名無しさん:2007/03/23(金) 09:02:21
== Ruby使用時の探し物
RAA - Ruby Application Archive
http://raa.ruby-lang.org/
RubyForge
http://www.rubyforge.org/
# 共にRubyのアプリやライブラリが検索できる

== Ruby関連のニュースや読み物
日本Rubyの会 公式Wiki - 日本Rubyの会Wiki
http://jp.rubyist.net/

Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
# コードレビューが好評

== いろいろRubyサイト
Matzにっき … Ruby作者の日記
http://www.rubyist.net/〜matz/

Ruby hotlinks 五月雨版 … Ruby関連の日記やblog
http://www.rubyist.net/〜kazu/samidare/
Rubyの本一覧
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Ruby%A4%CB%B4%D8%A4%B9%A4%EB%BD%F1%C0%D2
<rubyXML/>
http://www.rubyxml.com/
Ruby Weekly News @ Ruby Garden
http://www.rubygarden.org/rurl/html/
6デフォルトの名無しさん:2007/03/23(金) 11:40:53
宗教の話はマ板のスレへどうぞ。

【カルト】Ruby開発者Matz【モルモン】
ttp://pc11.2ch.net/test/read.cgi/prog/1148712641/
7デフォルトの名無しさん:2007/03/23(金) 17:50:42
14歳からはじめるRubyインターネットプログラミング教室
ttp://www.amazon.co.jp/dp/4899771827/
> 第1章 Rubyってどんな言語?―Rubyのインストールから使い方まで
> 第2章 Rubyの文法を覚えよう!―基本構文からオブジェクト指向まで
> 第3章 インタラクティブなゲームに挑戦!―会話プログラムから学習型しりとりまで
> 第4章 CGIでWebプログラミングしよう!―超簡単!掲示板を作ろう
> 第5章 ERBで埋め込みスクリプティング!―思考型ゲーム「リバーシ」に挑戦!
> 第6章 データベースを使って本格Webアプリ作り!―オリジナル・ブログシステムを作る!

サンプルとしてしりとりを作るとこだけ立ち読みした

そういえばレシピブックが第二版になったよ
ttp://www.amazon.co.jp/dp/4797340045/
8デフォルトの名無しさん:2007/03/23(金) 18:16:30
レシピブックは糞だから絶対買うな
9デフォルトの名無しさん:2007/03/24(土) 17:09:47
前スレの話だけど

if expr then
  result = A
else
  result = B
end
return result

なんて書くくらいなら俺は

return A if expr
return B

って書くなぁ
10デフォルトの名無しさん:2007/03/24(土) 17:17:39
あれは例として1行で代表して書いてるだけだろ?

実際はthen以下には数行の処理が入るはず
なぜかインスタンス変数持ち出してる奴もいたがわけわからんな
11デフォルトの名無しさん:2007/03/25(日) 00:39:23
Exceptionのある言語で出口一つに拘る意味があるのかね。
12デフォルトの名無しさん:2007/03/25(日) 00:42:23
>>9
expr ? A : B
13デフォルトの名無しさん:2007/03/25(日) 01:19:27
>>11
たくさんあるとわかりにくいだろ?

わかりやすいように記述しようとするのは悪いことでもなかろう
14デフォルトの名無しさん:2007/03/25(日) 04:21:45
別に。それでわかりづらくなるようだったらおそらくそれは
メソッドが長すぎると言うことだから、適当な単位に分轄するよ。
15デフォルトの名無しさん:2007/03/25(日) 04:39:32
教えて、勉強し初めったばっかっす。
\nって改行だよね?なのに?nってなるんだけどなんで?
16デフォルトの名無しさん:2007/03/25(日) 04:56:34
>>15
'¥n'とかやってないか? "¥n"とやればいいとおもう。
17デフォルトの名無しさん:2007/03/25(日) 05:24:09
ほんと、勉強しはじめましたって感じの質問だ
俺も昔を思い出す、がんばれ
18デフォルトの名無しさん:2007/03/25(日) 14:36:33
<<ってなんなんでしょうか?
リファレンスで見たら特異クラス定義らしいんですがどうもしっくりきません。
Googleで検索しようにも記号のせいでうまくいかず。
ttp://wota.jp/ac/?date=20060120
ここの
> # 持ち歌に加えると、group_id に反映される
> >> berryz.songs << song
の場所なんですが。
19デフォルトの名無しさん:2007/03/25(日) 14:45:34
その << はActiveRecordとかいろいろ絡んでくるので一言では説明できないが、
本質的にはArray.pushだ。

20デフォルトの名無しさん:2007/03/25(日) 14:46:43
「適当に足す」記号だと思って適当に使えばー

という回答では充足しないだろうな
なにがどうしっくりこないのよ
<< という記号全般の動作?
ActiveRecordでの動作?
21デフォルトの名無しさん:2007/03/25(日) 14:49:44
ActiveRecord固有の事情については前田さんの
http://shugo.net/tmp/metaprogramming.pdf
の「has_many: 返り値」のあたりに概要が書いてあるが、
入門したての人が読むと余計に混乱するのでやめておくこと。
22デフォルトの名無しさん:2007/03/25(日) 14:52:39
見付けた説明が特異クラス定義の構文に出てくる<<ゆえ、
「でもここは特異クラスの定義には見えないなぁ」
というのがしっくり来てない点と思われる。
23デフォルトの名無しさん:2007/03/25(日) 14:57:06
「(1..10)の..って何メソッドですか?」というのと同じ問題か
24デフォルトの名無しさん:2007/03/25(日) 15:01:29
Arrayのメソッドのとこには

 self << obj
 obj を配列の末尾に追加します。Array#push と同じ効果です。

  ary = [1]
  ary << 2
  p ary # [1, 2]

と書いてあるな
こっち見つければよかったのに
25デフォルトの名無しさん:2007/03/25(日) 15:03:47
ケツにくっつけるという意味ではどれも一緒のような気もする
26デフォルトの名無しさん:2007/03/25(日) 15:06:59
Net::HTTPRequestのマニュアル見ると

> self[ key ] = val
> key ヘッダフィールドに val をセットします。 key は大文字小文字を区別しません。

とか書いてあったので、村一番の素直な正直者で通ってる俺は

Net::HTTP.new( server,port ) {|http|
http[ 'If-Modified-Since' ] = 'Sun, 25 Mar 2007 02:18:22 GMT'
response=http.get( path )
}

と書いたら
undefined method `[]=' for #<Net::HTTP pc11.2ch.net:80 open=false> (NoMethodError)
というエラーが出ました

悲しいです
マニュアルにもう少しわかりやすい例を増やしてください
27デフォルトの名無しさん:2007/03/25(日) 15:08:26
レベル高めのスレにアホな質問で恐縮ですが…
スキルはrubyプログラミング入門という本を買って、いま35頁目という程度です。

foo = [[1,2,3],[4,5,[6,7]]]

配列の要素に配列を含める事ができるという例で上の例があり、
puts()でどんな出方をするのか試してたんですが、
puts(foo[0][0][0])は存在しないからnilかエラー落ちを返すとおもってたら1を返されました。
存在しない時は一次元上のfoo[0][0]が返されるのかと考え、確認でこんどは
puts(foo[1][1][1])でfoo[1][1]の5が帰ってくると思ってたら0が帰ってきました。
どういうルールでこんな結果が出るんでしょうか?
まだ質問するようなレベルじゃないとは思っているのですが、すこし混乱してしまって…
よろしくお願いします。
28デフォルトの名無しさん:2007/03/25(日) 15:12:12
httpは
Net::HTTPのインスタンスであって、
Net::HTTPRequestのインスタンスではないようだな。
29デフォルトの名無しさん:2007/03/25(日) 15:15:08
>>27
p 1[0] #=> 1
p 1.to_s(2) #=> "1"
p 5[1] #=> 0
p 5.to_s(2) #=> "101"
30デフォルトの名無しさん:2007/03/25(日) 15:16:44
>>27
puts は最終的にわかりきったものを見目良く表示するときにだけ使え
プログラム作成途中や不明不審なものを表示するときは p を使う
irbの使い方は知ってるか?

> foo = [[1,2,3],[4,5,[6,7]]]
=> [[1, 2, 3], [4, 5, [6, 7]]]
> p foo[0]
[1, 2, 3]
> p foo[0][0]
1
> p foo[0][0][0]
1
> p 1[0]
1

> p foo[1]
[4, 5, [6, 7]]
> p foo[1][1]
5
> p foo[1][1][1]
0
> p 5[1]
0

で、Integerの[ ]の説明
self[nth]
nth 番目のビット(最下位ビット(LSB)が 0 番目)が立っている時 1 を、そうでなければ 0 を返します。
31デフォルトの名無しさん:2007/03/25(日) 15:17:12
>>27
foo[0][0][0] は foo[0][0] が 1 なので 1[0] => 1
foo[1][1][1] は foo[1][1] が 5 なので 5[1] => 0

何を返しているかというと、二進数で表したときの、指定した桁のビット。

32デフォルトの名無しさん:2007/03/25(日) 15:33:25
>>26
実際にはサブクラスの
Net::HTTP::Get
Net::HTTP::Post
Net::HTTP::Head
Net::HTTP::Put
を使ってくださいとか書いておきつつ、これのマニュアルがないんだよね
3327:2007/03/25(日) 15:49:49
ええと、
数字の配列表記の場合、要素の次元より下を指定した場合は、
数字自体に対してのビット表記での桁位置指定として解釈される…って事でいいんでしょうか?

>>30
irbというのは初耳です。ぐぐってみたら昔のBASICみたいなリアルタイムの実行環境
で合ってますでしょうか?
いまは始めたばかりで量も少ないので、テキストファイル作ってdosプロンプトで
ruby "hoge.rb"とかちまちましてます。
34デフォルトの名無しさん:2007/03/25(日) 15:55:59
>>32
Rubyにはまず多次元配列というものは標準では存在しない。
foo[0][0][0]というのは3次元配列へのアクセスの記法ではなく、

x = foo[0]
y = x[0]
z = y[0]

と順次呼ばれていっている途中の変数を省いた記法にすぎない。

yがたまたま整数であれば、整数に対して[]というメソッドが呼ばれている。

3527:2007/03/25(日) 16:08:32
>>34
なるほど氷解しました。
そもそも foo = [[1,2,3],[4,5,[6,7]]]の構造がいまいちわからなかったので
表示テストしてたのですが、1次元で芋づる式だったらなんでもありな
構造ができますね。
ありがとうございました。

36デフォルトの名無しさん:2007/03/25(日) 16:14:31
出口が一つの方がわかりやすいなんてのは迷信。
37デフォルトの名無しさん:2007/03/25(日) 20:14:44
Cygwinなんですが、自分で作ったrubyのライブラリ的な.rbファイルを、いつでもどこでもrequireするには、どこに置く流儀がベストなんでしょう?
38デフォルトの名無しさん:2007/03/25(日) 20:28:38
$: の中にsite-rubyという部分を含むパスがあればそこへ。
cygwin版で具体的にどこになるのかわからんけど。
3937:2007/03/25(日) 20:46:05
>>38
ありました。ありました。
p $: #=> ["/usr/lib/ruby/site_ruby/1.8", "/usr/lib/ruby/site_ruby/1.8/i386-cygwin", "/usr/lib/ruby/site_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i386-cygwin", "."]
って感じです。
今のところ/usr/libは空っぽなので、/usr/lib/ruby/site_rubyを作ってここに入れたいと思います。
ありがとうございました!

# 1つ気になったのですが、普段使われる標準ライブラリは/lib/ruby/1.8に入っていて、$:の中にないのに、なぜかちゃんと使えるみたいです。
40デフォルトの名無しさん:2007/03/25(日) 22:01:32
>>26
Net::HTTP.new( server,port ) {|http|
 response=http.request_get(path){|req|
  req[ 'If-Modified-Since' ] = 'Sun, 25 Mar 2007 02:18:22 GMT'
 }
}
41デフォルトの名無しさん:2007/03/25(日) 22:11:58
>>40
そういうのはどこに書いてあるんだ…?
42デフォルトの名無しさん:2007/03/25(日) 22:14:29
>>41
/usr/lib/ruby/1.8/net/http.rbの724行目くらいから
43デフォルトの名無しさん:2007/03/25(日) 22:24:18
>>39
おれは ~/lib/site_ruby とか作って、環境変数 RUBYLIB に設定している。
44デフォルトの名無しさん:2007/03/25(日) 23:27:46
def swap(a,b)
temp = a
a = b
b = temp
end

a = 10
b = 5
swap(a,b)
p a

why?
45デフォルトの名無しさん:2007/03/25(日) 23:31:25
a, b = b, a でいい
46デフォルトの名無しさん:2007/03/25(日) 23:36:32
Rubyはマニュアルが整備不足だよね(´・ω・`)
ソースを自分で調べて使わないといけないよね(´・ω・`)
47デフォルトの名無しさん:2007/03/25(日) 23:53:55
>>44がなぜ間違っているかを教えてください
48デフォルトの名無しさん:2007/03/26(月) 00:02:15
>>47
p aで10が出力される理由なら、a = 10ってやって以来、このスコープのaの値を一度も変更していないからだが。
49デフォルトの名無しさん:2007/03/26(月) 00:05:55
swapって書いてあるから必死でobjectIDの説明プログラム書いてたんだが
よく考えるとこれそれ以前だよな
50デフォルトの名無しさん:2007/03/26(月) 00:08:48
>>48
自作関数のswapで変更してる気がしますが
51デフォルトの名無しさん:2007/03/26(月) 00:11:58
2.6 仮引数に代入すると実引数に影響を及ぼしますか

仮引数は、ローカル変数であり、仮引数に代入を行うと他のオブジェクトを指すようになるだけで、
元の実引数のオブジェクトには何の影響もありません。
52デフォルトの名無しさん:2007/03/26(月) 00:13:12
とりあえずFAQは全部読んだ方がいいよ
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
53デフォルトの名無しさん:2007/03/26(月) 00:14:30
>>50
def hoge(a,b)
puts 'hogeに持ち込んだaは',a,'hogeに持ち込んだbは',b
a=1
b=2
puts 'hoge内で変更したaは',a,'hoge内で変更したbは',b
end

a=10
b=5
hoge(a,b)
puts 'hogeが終わってaは',a,'hogeが終わってbは',b


----
実行結果

hogeに持ち込んだaは
10
hogeに持ち込んだbは
5
hoge内で変更したaは
1
hoge内で変更したbは
2
hogeが終わってaは
10
hogeが終わってbは
5

54デフォルトの名無しさん:2007/03/26(月) 00:26:40
def foooo(a,b,c) の a や b や c は def の外の a や b や c とは完全に別なんだよね

def の「外」に影響を与えたい場合は

・ returnで値を返させてそれを代入
・ @つきのインスタンス変数とか使う

どっちかにしとけ
前者はわかりやすいが変数が多くなりがちで格好悪い
後者はスマートだがどこで値が変化してるんだかわかりにくくなりがち
55デフォルトの名無しさん:2007/03/26(月) 00:34:53
メソッド間の値の受け渡しのためだけに大域変数使うなよ
56デフォルトの名無しさん:2007/03/26(月) 00:37:02
完全に別というのはどうかと

irb(main):001:0> str = "foo"
=> "foo"
irb(main):002:0> def poo(s); s.replace("bar"); end
=> nil
irb(main):003:0> poo(str)
=> "bar"
irb(main):004:0> str
=> "bar"
57デフォルトの名無しさん:2007/03/26(月) 00:52:11
>>56
その例でも、「poo内のs」と「poo外のs」は、完全に別だからねぇ。
58デフォルトの名無しさん:2007/03/26(月) 01:12:03
>>56
取り敢えずRubyの変数がどういうものかもう一度やりなおしですよ、その理解だと。
Rubyの変数は名札と紐みたいなもので紐の先にオブジェクトが結びついているイメージです。
んでdefの内部(パラメータも含めて)において定義される変数はその内部でしか通用しない名札を与えられます。

そして定義されたメソッドに渡されるパラメータは変数ではなく、
変数の先にぶら下がっているオブジェクトなのです。
そのオブジェクトに対し破壊的メソッド(String#replaceなど)を適用すると、
当然そのオブジェクトは変わります。

同じオブジェクトをぶら下げている変数(str)も当然ですが変わったように見えます。
59デフォルトの名無しさん:2007/03/26(月) 01:36:39
俺は45=51=52=56だが、「完全に別」と言う表現の認識に差異があっただけで
「もう一度やりなおし」とまでいわれる筋合いはないな。
まだソース1/10くらいしか読んでないし未熟なのは間違いないけど
60デフォルトの名無しさん:2007/03/26(月) 03:12:45
ソースって何のソース? Rubyのソースを読んでいて変数が参照であることを理解できてないっていうの?
それはおかしい。知ったかぶりするにしてもすぐにバレる嘘をつくなよ。
61デフォルトの名無しさん:2007/03/26(月) 07:18:23
変数が参照であることは理解してるよ。元の本題は
def foo(n); n = 10; end
num = 0; foo(num); p num #=>0 の挙動の説明だろ。

Java や Python は Ruby と同じ挙動を示すけど、

C++ だと
int foo(int &n) { n = 10 }
int num = 0; foo(num); cout << num #=>10

Perl だと
sub foo { $_[0] = 10 }
my $num = 0; foo($num); print $num #=>10

そういう言語からきた人にとっては仮引数に代入して実引数に
影響を及ぼさないのは不自然だと感じられるんじゃないの?
62デフォルトの名無しさん:2007/03/26(月) 07:23:31
うげげ、C++の例が酷いことになってる
void foo(int &n) { n = 10; }
int num = 0; foo(num); cout << num; //=>10
63デフォルトの名無しさん:2007/03/26(月) 07:35:27
>>61
?? なんでC++の例で勝手に仮引数を参照で受けるようにしちゃうのさ。
そもそもC++でだって

int foo(int n) { n = 10; }

という例もあるんだし、この例で考えれば自然じゃないの。
C++からきた人が不自然に感じられるなんてわけないでしょ。
せいぜいどっち? ってはなしになるわけで(で、Rubyの場合はどっちでもないんだけど)。

というかそういう話だったの? C++で参照で受けてたのと動きが違うんですけど、
なんて話じゃなかったでしょうが。
64デフォルトの名無しさん:2007/03/26(月) 07:38:40
少なくとも>>44がやりたがってたのはそういうことだと俺は読み取ったんだけど
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}

int a = 10;
int b = 5;
swap(a,b);
cout << a << b; //=> 5 10
65デフォルトの名無しさん:2007/03/26(月) 07:44:41
>>64
あ、そうか。確かにそうだな。おれのエスパー度が足りなかったようだ。
そこまで言われて理解できた。絡んですまんかった。
66デフォルトの名無しさん:2007/03/26(月) 08:22:41
心の贅肉が、彼にエスパー度なる新語を造らせてしまうのだった。
67デフォルトの名無しさん:2007/03/26(月) 08:55:33
すみませんExerbについての質問、ここでいいでしょうか。

wxrubyでGUIアプリを作っています。htmlヘルプを用意して、
GUIからヘルプウインドウを呼び出せるようにしたのですが、
Exerbでexe化するとコケてしまいます。

Rubyスクリプトからは次のような設定ファイルを呼びだす形
になっており、このファイル自体は呼び出せてるものの、
そこに記載されたファイルにアクセスできてないみたいです。

[app1.hhp]
Contents file=app1.hhc
Index file=app1.hhk
Title=app1
Default topic=index.html

この段階での挙動はRubyからコントロールできない(バイナリ?)
と思うのですが、何か可能性のある打開策があればご教示ください。
お願いします。
68デフォルトの名無しさん:2007/03/26(月) 09:06:29
> この段階での挙動はRubyからコントロールできない
この意図が解んないkwsk

あとエラーコードも無いと判断できない
69デフォルトの名無しさん:2007/03/26(月) 10:02:59
67です。
>> この段階での挙動はRubyからコントロールできない
> この意図が解んないkwsk

wxruby2.soのAPIからはヘルプの設定ファイルの読み込みに
ついて指定するというのはできないみたいなんです。
wxruby自体C++によるライブラリのswigによるバインディング
に過ぎないですし。

> あとエラーコードも無いと判断できない

普通にRubyスクリプトとして動かすとエラーは出ないんですが、
exeファイルからヘルプを呼んだときにはC++ Runtime Error
という大して役に立ちそうもないメッセージダイアログが出ます・・・。
70デフォルトの名無しさん:2007/03/26(月) 22:56:31
>>44
誰も言わないから言うけど、

a, b = b, a

で交換できると思う。メソッドこさえなくても。
71デフォルトの名無しさん:2007/03/26(月) 22:58:12
45の立場はいったい
72デフォルトの名無しさん:2007/03/26(月) 23:09:54
>>71

>>45がさりげないから(というか以後が熱くて)見逃した。
吊ってくる。
73デフォルトの名無しさん:2007/03/26(月) 23:56:13
>>55が気になる
74デフォルトの名無しさん:2007/03/27(火) 09:18:29
>>69
htmlヘルプをフルパスで指定している?
相対パスだとうまく行かないと思うけど
7518:2007/03/27(火) 14:08:10
レスくれたかた、ありがとうございました。
とりあえずArray.pushだと認識しておくことにします。
76デフォルトの名無しさん:2007/03/27(火) 14:29:13
Cレベルで定義を見ると、
push == 各引数に対して<<を呼ぶ。
という形だな。

pushは複数を追加できるが、<<は1つだけ。

$ irb
irb(main):001:0> a=[]
=> []
irb(main):002:0> a.push(1)
=> [1]
irb(main):003:0> a.push(1,2)
=> [1, 1, 2]
irb(main):004:0> a.push([1,2])
=> [1, 1, 2, [1, 2]]
irb(main):005:0> a.push(*[1,2])
=> [1, 1, 2, [1, 2], 1, 2]
irb(main):006:0> a << 1
=> [1, 1, 2, [1, 2], 1, 2, 1]
irb(main):007:0> a << [1,2]
=> [1, 1, 2, [1, 2], 1, 2, 1, [1, 2]]
77デフォルトの名無しさん:2007/03/27(火) 14:32:39
>>75
今更だが、少なくともArray.<<はプッシュということはソースからもうかがえる

http://svn.ruby-lang.org/repos/ruby/trunk/array.c
2980: rb_define_method(rb_cArray, "<<", rb_ary_push, 1);
2981: rb_define_method(rb_cArray, "push", rb_ary_push_m, -1);

Array.<<はrb_ary_pushで、Array.pushはrb_ary_push_mだと定義してる


0453: rb_ary_push(VALUE ary, VALUE item)
0454: {
0455: rb_ary_store(ary, RARRAY_LEN(ary), item);
0456: return ary;
0457: }

0473: rb_ary_push_m(int argc, VALUE *argv, VALUE ary)
0474: {
0475: while (argc--) {
0476: rb_ary_push(ary, *argv++);
0477: }
0478: return ary;
0479: }

つまり、Array.pushは内部でArray.<<を呼んでいる
両者は引数の取り方が違うだけで同じもの
78デフォルトの名無しさん:2007/03/27(火) 14:33:10
あ、76が答えてたな
79デフォルトの名無しさん:2007/03/27(火) 17:26:35
>>75
>>77
そこはArray#push、Array#<<と言おうぜ
Array.pushだとクラスメソッドだ。
80デフォルトの名無しさん:2007/03/27(火) 19:10:23
同じも何もマニュアルに書いてあるな

マニュアルすら読まん奴はそうやって無駄に時間使う
81デフォルトの名無しさん:2007/03/27(火) 19:23:15
いや、元質問者>>18はちゃんとリファレンスを読んでるぞ。
ただ、特異クラス定義の<<だけしか見付けられずにはまっていたわけで。
82デフォルトの名無しさん:2007/03/27(火) 19:57:29
マニュアル読めというのは、初心者が読んでもわかるようなマニュアルを用意してから言ってくれ。
83デフォルトの名無しさん:2007/03/27(火) 20:30:02
すごま(だっけ?)をヲチするとか参加するとか
84デフォルトの名無しさん:2007/03/27(火) 21:08:26
馬鹿な!
初心者にもわかりやすいオンラインマニュアルなんか用意したら解説本が売れないじゃないか!
85デフォルトの名無しさん:2007/03/27(火) 22:26:19
>>83
るりま!じゃなかったっけ?
86デフォルトの名無しさん:2007/03/27(火) 22:41:52
http://doc.loveruby.net/wiki/

!なしでるりまが正しそうだ。
87デフォルトの名無しさん:2007/03/28(水) 00:01:58
んと、自前の小さなプログラムなんだが、初期設定がいっちょまえにあるんだ。
で、その初期設定を格納するには、
1.各値をグローバル定数
2.各値をグローバル変数
3.各値を"初期設定"ってクラスのインスタンスの中の定数
のどれが理想的なんだろう。
Rubyっつうよりプログラマ初心者で申し訳ないが。。
88デフォルトの名無しさん:2007/03/28(水) 00:17:48
ん…
1.定数
2.グローバル変数
3.初期設定をまとめたクラスのインスタンス変数(読み出しのみの指定)
の三つ、と表記すべきでした。すいません。
89デフォルトの名無しさん:2007/03/28(水) 00:34:09
確か添削のTropyの回にそんな話があったよね。
90デフォルトの名無しさん:2007/03/28(水) 00:45:20
>89
ほほう?もう少しkwsk教えてくれ。
91デフォルトの名無しさん:2007/03/28(水) 01:00:42
うーむ、そこそこ検索したが見つからぬ。もちょっとヒント希望。
92デフォルトの名無しさん:2007/03/28(水) 01:37:55
"るびま"でぐぐれ
RubyのWeb雑誌で、その中に公募したコードを添削する企画がある
93デフォルトの名無しさん:2007/03/28(水) 01:55:48
毎度の事ながら、先人が居るってすばらしい。本当にありがとうございました。
助かった。もしここに流れ着いた人のためにURLだけ書いておこうっと。
ttp://jp.rubyist.net/magazine/?0015-CodeReview#l35
94デフォルトの名無しさん:2007/03/28(水) 05:21:37
つーか初心者はまずマニュアルをよく読んで、理解できるまで勉強すべき。
いきなり英語読み書きするのは厳しいのと同じ。まずは英語の勉強しないと。
95デフォルトの名無しさん:2007/03/28(水) 07:17:22
rubyを覚えたい訳じゃなくて、やりたいことがあってそれでrubyを使うだけだからな。

どこに自分の知りたい情報があるのか知っておくために、
軽く目を通しておいたほうがいいと思うが>マニュアル
96デフォルトの名無しさん:2007/03/28(水) 08:53:39
だからそういうのは初心者が読んでもわかるようなマニュアルを用意してから言え。
9789:2007/03/28(水) 10:44:16
初心者だし、まだ応用が効かないのよ。
他の人のソースを見て勉強するだけのスキルもまだ無いし。
実際のところ、マニュアルだけで全て解決できる人間なんて居ないだろう。
実例とサンプルプログラムじゃ山と谷ほどの差があるのに。
正当化するわけじゃないけど、こうやってヒントをもらうと探索範囲が増えるので、
くだらない質問が減ることは間違いないと思うんだが。
ともかくも、ヒントくれて本当にありがとう。
98デフォルトの名無しさん:2007/03/28(水) 17:56:27
初心者ならまず本でも読んだ方がいいと思うよ。
いきなり英語辞典読んでも文法知らないと無理なんだし。

というわけで、初心者が理解できたルビー本はどれ?
99デフォルトの名無しさん:2007/03/28(水) 18:08:03
>>98
俺は「楽しいRuby」だった、というかそれしか無かった。
CのHelloWorldレベルだけど何とかなったよ、
でもクラスが登場するあたりは、ちょっと辛かったかも
100デフォルトの名無しさん:2007/03/28(水) 18:19:15
結城浩氏は「Rubyプログラミングレッスン」を書かないのかな。
101デフォルトの名無しさん:2007/03/28(水) 18:21:25
珍しい本持ってるな>楽しいRuby

現状唯一のお勧めはこれだと思う
ttp://www.amazon.co.jp/dp/4797336617/

初級の補佐には1冊程度で充分な難易度の言語だと見るか、
あるいは書籍サポートがうまくいってないと見るか…

レシピブック読んだあと何買っていいかわからんな
102デフォルトの名無しさん:2007/03/28(水) 18:37:15
レシピブックまで読めたら、あとはWebで適当に調べれば良いのでは?
103デフォルトの名無しさん:2007/03/28(水) 23:03:03
レシピだけじゃ料理作れない香具師もいる訳で。
片っ端から本読んで知識つけるしかないね。

マニュアルというより、具体的な事例のチュートリアルが充実すると良い感じ。
104デフォルトの名無しさん:2007/03/29(木) 00:32:58
おまいらデバックフラグどう記述してる?

Cでいうところの#define DEBUG 1みたいなの。
105デフォルトの名無しさん:2007/03/29(木) 01:11:41
106デフォルトの名無しさん:2007/03/29(木) 02:15:28
それはデバックモードのフラグな。

おまいらpデバックしないの?
デバックで使ったpをいちいちコメントアウトするの面倒じゃん。
107デフォルトの名無しさん:2007/03/29(木) 03:19:04
DEBUG と書きつつデバッ「ク」なのが気になる
108デフォルトの名無しさん:2007/03/29(木) 09:26:52
>> 106

p hoge if $DEBUG

じゃダメなの?
109デフォルトの名無しさん:2007/03/29(木) 14:21:15
Perlの
@hash{'inu', 'neko'} = ('dog', 'cat');
みたいなことはできないのですか?
110デフォルトの名無しさん:2007/03/29(木) 14:48:41
キー:値ペアをまとめて追加する方法は、
hash.merge!('inu' => 'dog', 'neko' => 'cat') #merge! == update
くらいかねぇ。
111デフォルトの名無しさん:2007/03/29(木) 18:27:23
本日Ruby始めました。perlはちょっとだけできます。eucファイルを読み込むなどはなんとか出来ました。
ファイルを読込み後、クラス変数などに格納したいです。
ファイルの内容は、
--20070305
x1
x2

--20070306
y1

y2
のような内容です。日付と、複数行をセットにして配列か何かに持ちたいです。特に複数行どうやって保持するんでしょう。
ググったのですが、見つからない。
なにかよいサイトなどあれば教えてください。
112デフォルトの名無しさん:2007/03/29(木) 19:11:21
>>111
「複数行保持」って言うのは
例えば一行一行を別けて配列の要素にして保持したいって事?
113デフォルトの名無しさん:2007/03/29(木) 19:59:40
>>111
{"20070305" => ["x1", "", "x2" ]}
みたいにHashのkeyを日付に、valueを各行の要素からなるArrayにすれば?
hash = Hash.new
date = "20070305"
hash[date] = Array.new
hash[date][0] = "x1"
hash[date][1] = "x2"
hash[date][2] = ""
114デフォルトの名無しさん:2007/03/29(木) 21:29:55
なにをしたいのかわからん
ファイルは1個で区切りが「--8桁日付」で、データを

20070305は
「x1
x2



20070305は
「y1

y2」

というようなペアで保持したいということ?

ファイルをFile.readして全部読み込んで正規表現でscanして
{日付 => データ,日付 => データ, ... }
というハッシュにするのがよろしかと

file=File.read(ファイル)
pairs=Hash.new
# --の次に数字8桁でお約束改行が1個あってたくさん文字があり
# 直後に--かデータ末が見えるまでマッチする正規表現↓
file.scan(/--(\d{8}).(.+?)(?=(?:--|\Z))/me){
pairs[$1]=$2
}

pairs.each do |key,value|
puts "キーは"+key+"で"+"値は"+value+"です"
end
115デフォルトの名無しさん:2007/03/29(木) 21:52:28
また小難しい正規表現を

-- という2連ハイフンがデータの中に絶対現れないのなら

splited=file.split(/--/)
splited.each do |text|
text=~/(\A(\d{8}).(.+)\Z)/
pairs[$1]=$2
end
116デフォルトの名無しさん:2007/03/29(木) 22:01:50
おまいら、今日はじめたという奴にそんな小難しい内容を……
117デフォルトの名無しさん:2007/03/29(木) 22:20:39
そもそものファイルのデータ構造が小難しいんだよな

自力でPerlでやってできないというのなら、まだ難しいかもしれん
118デフォルトの名無しさん:2007/03/29(木) 22:23:36
とりあえず p の使い方覚えることだろな

puts を使って表示させて確認してるうちは
成功してるんだか失敗してるんだかよくわからんはずだ
119デフォルトの名無しさん:2007/03/30(金) 00:07:47
独自データ構造使っていいことは何もない。
XMLやYAML使っとけ。
120デフォルトの名無しさん:2007/03/30(金) 00:56:01
>>119
ファイル書式を選べるかどうかも分からないのに、
あくまで練習としてこの書式を読むことに挑戦しているかもしれないのに、
そんなこといっちゃいけないよ。
121デフォルトの名無しさん:2007/03/30(金) 02:39:44
みなさま、ご協力ありがとうございます。
GUIのアプリケーションなどで汎用的に使用しようかなと思っています。
リストボックスを選択したときにその複数行の内容を取得してマルチテキストなどに読込む、といったもの。
じっくりゆっくりやってみます。

今日は、if文のあとに括弧とかthenとかないのを見て、へー、ってな感じ。
122デフォルトの名無しさん:2007/03/30(金) 06:54:44
>121
then は書くことも出来るけどな
俺は then や do は基本的に書く派
123デフォルトの名無しさん:2007/03/30(金) 09:42:48
>>115
text=~/(\A(\d{8}).(.+)\Z)/m

thenは書かないとifやwhenの条件が終わったことが目視できないから書く
改行を区切りにするのはどうにも不安だ
同様にreturnも絶対書く
124デフォルトの名無しさん:2007/03/30(金) 11:51:41
sort_by! ってなんで無いの?
125デフォルトの名無しさん:2007/03/30(金) 11:54:19
Enumerableモジュールはオブジェクトの実装を知らないので破壊的操作をできない。
126デフォルトの名無しさん:2007/03/30(金) 12:13:20
ふむ。じゃあ Array#sort_by! も無いのはなんでなのかな?
127デフォルトの名無しさん:2007/03/30(金) 12:14:45
無いなら作ればいいじゃない
128デフォルトの名無しさん:2007/03/30(金) 13:00:15
>>126
Array#sort_byがないのと同じ理由だろ。
129デフォルトの名無しさん:2007/03/30(金) 13:06:28
破壊的メソッドのメリットの一つとして、新たに領域を確保しなくていいってのがあるけど
sort_by だと結果とは別にブロックの評価結果を保存するために
O(n) サイズの領域を使うからsort_by!を作ってもメリットが少ないと踏んだのかな?
130デフォルトの名無しさん:2007/03/30(金) 13:14:02
たぶんね

要領よくソートさせるためにはどーしてもデータを大量あるいは全部コピーする必要があるんで
「破壊的動作のように見せかけるためにわざわざ書き戻す」とか
アホくさい動作にしなければならんのでやめたのだろう
131デフォルトの名無しさん:2007/03/30(金) 13:15:23
正規表現 =~ 文字列
文字列 =~ 正規表現

どちらでも良いということですが、使い分けたりするんですか?
他にも全く同じ意味のメソッドが複数あったりするようなのですが、何故そういう仕様なんでしょうか。
132デフォルトの名無しさん:2007/03/30(金) 13:28:50
マッチを行うなら、最初から左辺が正規表現のものを書いた方が
Ruby的には素直。

文字列 =~ 右辺 の場合、右辺には他の型も書ける。
右辺が文字列だと、エラー。(1.7までは正規表現が書かれていると見なして
処理)
右辺が正規表現だと正規表現 ~= 文字列 (rb_reg_match)。
右辺がその他の型だと、右辺 =~ 文字列を行う。



同一動作のメソッドがあるのはそういうものとしか言いようがない。
慣れた名前のほう/文脈によりふさわしいほうをどうぞ。
Perlにもgrepとmapみたいなのあるな。
133デフォルトの名無しさん:2007/03/30(金) 13:33:30
>>131
RubyとしてはRegexpのメソッドである前者の =~ を使うのが「Rubyらしい」
後者はPerlなどでよく使われるので利便性のために正規表現のマッチとしても動作するようにしてあるだけ

同じ意味のがたくさんあるのは

 ・ させたい動作に対するコトバの意味で使い分けてみる
 ・ どっかの言語で使われていたイディオムをRubyでも使えると楽しい

これくらいの意味しかない
「普通は使わんメソッドや文法」というのはあるが、基本的にはどれを使って好きに書いてもいい
134デフォルトの名無しさん:2007/03/30(金) 13:35:22
なるほど。確かにアホくさいので用意しなかったというのはありそうですね。

ただ、対称性ということでいうと、
たとえアホくさい動作になっても用意しといて欲しい気はします。
破壊的メソッドは非破壊的メソッドより効率良くなければならないという法はないですよね。
135デフォルトの名無しさん:2007/03/30(金) 14:06:39
配列にのそれぞれの要素の「数値」部分を元に
ソートさせるコード書いたんですが、こんなヘボしか思いつきません。誰か助けて。
a = ['f2f', 'f10f', 'f1f', 'f0f', 'f3f']
sa = a.sort{|a,b| a[/\d+/].to_i <=> b[/\d+/].to_i }
sa.each{|v| print v, ' ' }
136デフォルトの名無しさん:2007/03/30(金) 14:15:47
ヘボもなにも、それが正答だと思うけど。
あ、3行目は
print sa.join(' ')
の方がいいね
137デフォルトの名無しさん:2007/03/30(金) 14:17:04
別にそんなんでもいいんじゃね

俺なら配列にしてそういう比較をすること自体が何かマズいと考えて全体を作り直したいけど
まあそういうのって面倒だしな
138デフォルトの名無しさん:2007/03/30(金) 14:21:03
他の言語のソース中から、
 Version = '1.1.1';
の、バージョン番号名を抜き出したいのですが、

def get_version
 s = IO.read "hogehoge.pas"
 /Version\s*=\s*'([\d.]+)'/ =~ s
 $1
end

のような感じでよいのでしょうか?
正規表現で、切り出すのに、慣れてないのですが、こんな感じでよいの?
一応、ちゃんと動いているようですが
139デフォルトの名無しさん:2007/03/30(金) 14:27:35
>>136-137
あ、そうなんですか…
いや、いつも自分で書いたコードより
簡潔に表現されてるコードがあるもので。
今回は問題無かったみたいでよかったです。失礼しますた。
140デフォルトの名無しさん:2007/03/30(金) 14:31:58
>>138
def get_version
file = File.read('hogehoge.pas')
return file.scan(/Version\s*=\s*'([\d\.]+)';/).to_s
end

たいしてかわらんな
抜き出すのはscanじゃないほうがいいのかねえ
141デフォルトの名無しさん:2007/03/30(金) 14:49:57
>>139
要素数が5個程度だからそれでOKとは書いたけど、
これが数万とかのオーダーになったり、
何度も何度もソートするようなコードであればまた答は別よw

さすがに比較時に正規表現で取り出して整数に変換なんてのをやってるのは、
要素数が多くなってくると効率が悪すぎる。
142デフォルトの名無しさん:2007/03/30(金) 14:56:47
そこで sort_by! ですよ。(嘘)
143デフォルトの名無しさん:2007/03/30(金) 15:15:40
>>141
確かに。
ただ今回は多くても数百くらいですので、これで無問題ですよね?
144デフォルトの名無しさん:2007/03/30(金) 15:23:12
sort_byとか言ってる香具師は素人
145デフォルトの名無しさん:2007/03/30(金) 15:37:01
>>143
うん、多分無問題だと思う。
パフォーマンスに問題が出たら、そこを真っ先に疑うがよいw
146デフォルトの名無しさん:2007/03/30(金) 15:39:08
>>145
どうもでした。
147デフォルトの名無しさん:2007/03/30(金) 15:52:04
irb(main):001:0> "hoge".delete("o")
=> "hge"
irb(main):002:0> ["h", "o", "g", "e"].delete("o")
=> "o"

対称じゃなくてキモい。
148デフォルトの名無しさん:2007/03/30(金) 15:59:17
そういうのを対称というのか?
149デフォルトの名無しさん:2007/03/30(金) 16:04:38
統一性?
150デフォルトの名無しさん:2007/03/30(金) 16:08:43
一貫性?
151デフォルトの名無しさん:2007/03/30(金) 16:09:35
どっちかってえと

irb> s="hoge"
=> "hoge"
irb> s.delete("o")
=> "hge"
irb> s
=> "hoge"
irb> a=["h", "o", "g", "e"]
=> ["h", "o", "g", "e"]
irb> a.delete("o")
=> "o"
irb> a
=> ["h", "g", "e"]

これのほうが直感に反してて困る
152デフォルトの名無しさん:2007/03/30(金) 16:28:46
みなさんRubyでどんなスクリプト書いてますか?
自分はちょっとしたファイル加工とか、CGIとかにしか使ってません。
まぁプログラミング言語なんて使い分けるのが当たり前かもしれませんけど。
153デフォルトの名無しさん:2007/03/30(金) 16:50:30
>>152
・ちょっとした小物(shellスクリプトでやるようなのも全部Rubyで)
・HTMLから、RSS生成したり
・他小物CGI
154デフォルトの名無しさん:2007/03/30(金) 17:22:06
PC使う際の「手足」に使ってる

聞いてどうするんだという気はせんでもないが
155デフォルトの名無しさん:2007/03/30(金) 17:23:16
なんかRubyで書かれた実用的なソフトってあんの?
いまんとこレイルズくらい?
156デフォルトの名無しさん:2007/03/30(金) 17:23:38
>>153
う〜ん、やっぱり用途が似てますね…

自分の場合、大きな物作らないから
いつまで経っても、Rubyはスキルアップしないですねえ…
言語仕様も色々と機能が豊富みたいなんですけど
作るスクリプトが小物なんで、使うまでもない物が殆どなんですよ。
157デフォルトの名無しさん:2007/03/30(金) 17:25:36
>>155 が釣りなのは俺にもわかった
158デフォルトの名無しさん:2007/03/30(金) 17:27:54
>>154
手元に置いて、便利に使える道具的な使い方が多いですよね。

みんな一番大きなのでどの位の規模の作ったのあります?
自分はせいぜい、2000ステップくらいのCGIですね…
159デフォルトの名無しさん:2007/03/30(金) 17:27:58
USBメモリなどにrubyをに入れて rubyのインストールされてない環境で実行したいんですが
それは可能ですか?
160デフォルトの名無しさん:2007/03/30(金) 17:30:36
>>159
Winなら、Exerbとかruby2exeとかで
バイナリにする方法もあるよ。
161デフォルトの名無しさん:2007/03/30(金) 17:34:33
700ステップくらい
しかしメソッドチェーンやワンライナ多用だから指標になるのだろうか…
162デフォルトの名無しさん:2007/03/30(金) 17:36:31
つーか、ステップの数え方は?
163158:2007/03/30(金) 17:39:15
>>162
自分は、空白、コメント等もすべて入れてです。
HTMLもコード中に埋め込んでる様な汚い物なんで
純粋なRubyのコードだけでいうと半分くらいしかないと思いますけど。
164159:2007/03/30(金) 17:41:18
>>160
素早い回答ありがとうございます

えっと バイナリにするのではなく
ruby環境を持ち運んで 別PCで開発&実行ということは可能でしょうか
165デフォルトの名無しさん:2007/03/30(金) 17:42:53
星野真里のファンは誰だよww
166デフォルトの名無しさん:2007/03/30(金) 17:43:16
>>163
ERbLightとかでhtmlを外部ファイルにするとかなり楽になるよ
167デフォルトの名無しさん:2007/03/30(金) 17:43:16
>>152
あと、
・でかいプロジェクトのRakefile
素のmake使えなさすぎ

>>159
USBストレージにいれて動かしている。とりあえず、パスさえ通せば使えるはず。
rubyスクリプトを動かしたいだけなら、ruby2exeとか、exerbで。
168デフォルトの名無しさん:2007/03/30(金) 17:50:10
ステップで物数えんな
169デフォルトの名無しさん:2007/03/30(金) 17:52:37
>>166
確かにHTMLは外部にしなきゃダメだとつくづく思います…
そうしないと、もうRubyのコードとは思えない程汚いです。
170デフォルトの名無しさん:2007/03/30(金) 17:53:06
>>135
つシュワルツ変換
171デフォルトの名無しさん:2007/03/30(金) 17:54:49
>>168
メソッド数がある程度目安になると思う
適宜メソッドに分けることのできる人はそれなりにそれなりだから

読み込んで処理して整形して吐き出すCGIなのにメソッド3個とか眩暈がする
172デフォルトの名無しさん:2007/03/30(金) 17:56:37
>>135

これこそsort_byを使うべきところじゃね?
a = ['f2f', 'f10f', 'f1f', 'f0f', 'f3f']
p a.sort_by {|s| s[/¥d+/].to_i} #=> ["f0f", "f1f", "f2f", "f3f", "f10f"]

135のやり方だと効率云々よりも a[/¥d+/] と b[/¥d+/] と同じことを2回書いてるから美しくない。
173デフォルトの名無しさん:2007/03/30(金) 18:01:38
thenの中が4行以上ならメソッドに分ける
174デフォルトの名無しさん:2007/03/30(金) 18:05:10
俺の場合は同じ処理が二回以上出てきたらメソッドにまとめるって感じだな…
まあ小物ばっかりなんで
175デフォルトの名無しさん:2007/03/30(金) 18:07:23
>>173
お前か
引数5個で中身6行のメソッドとか平気で作ってるの
176デフォルトの名無しさん:2007/03/30(金) 18:11:13
自分の場合は完全に感覚だな…
削除処理だからそれをメソッド
表示処理だからそれをメソッド

まぁあまり一つのメソッドに詰め込みすぎるのはよくないよね。
177デフォルトの名無しさん:2007/03/30(金) 18:25:15
意味のある名前のつけられそうな処理だったらメソッドにする
178デフォルトの名無しさん:2007/03/30(金) 18:27:44
モジュール作るの積み木とかパズルみたいで楽しいよね
179デフォルトの名無しさん:2007/03/30(金) 18:28:23
ぜんぶくらすだからもじゅーるとかわかんない
180デフォルトの名無しさん:2007/03/30(金) 18:28:31
181デフォルトの名無しさん:2007/03/30(金) 18:41:54
で?
182デフォルトの名無しさん:2007/03/30(金) 18:43:04
>>180
別人だけど、なんで?メモリ?
183デフォルトの名無しさん:2007/03/30(金) 20:23:41
if文の条件式が長くなって困ってる。
Javaなんかはセミコロン打つまでいくらでも改行できるんだが
Rubyではどうやんの?

if visible==1 and visit_count==10 and ( s_member_id==1 or s_member_id==5 or s_member_id==9 )
disable = 1
end

みたいな場合。

下らん質問で申し訳ない。調べたけど案外見つけられなくて聞いてみる。
まだ探し回ってるから時々見に来ますんでよろしくです。。。

184デフォルトの名無しさん:2007/03/30(金) 20:27:41
andの後ろみたいな、明らかに式が続くことが分かる箇所では
自由に改行可能。

そうでない箇所で改行する場合は改行前に ¥ を入れておく。
185デフォルトの名無しさん:2007/03/30(金) 20:41:01
>>184
d。できますた。
and / or 前置き派なのでハマっていたのでした。
あるいは\ね。メモメモ
186デフォルトの名無しさん:2007/03/30(金) 21:02:19
> 明らかに式が続くことが分かる箇所
へえ
187デフォルトの名無しさん:2007/03/30(金) 22:14:11
>183
catch(:hoge) do
 throw(:hoge) unless visible == 1
 throw(:hoge) unless visit_count == 10
 throw(:hoge) unless [1,5,9].include?(s_member_id)
 disable = 1
end
188デフォルトの名無しさん:2007/03/30(金) 22:28:31
>>182
破壊的メソッドじゃないから効率が悪い。破壊的メソッドの sort! を使え。
189デフォルトの名無しさん:2007/03/30(金) 23:21:23
久々にひどい半可通を見た
190デフォルトの名無しさん:2007/03/30(金) 23:32:22
GNU libc の memfrob(3) 関数相当の処理
http://ja.wikipedia.org/wiki/ROT13#memfrob.28.29.E9.96.A2.E6.95.B0
を行うコード書いたんですが、こんなヘボしか思いつきません。誰か助けて。
require "enumerator"
class String
def frob
self.enum_for(:each_byte).inject("") { |s, c| s << (c ^ 42) }
end
end
191デフォルトの名無しさん:2007/03/31(土) 00:01:46
self.unpack('C*').map{|c|c^42}.pack('C*')
192デフォルトの名無しさん:2007/03/31(土) 00:09:46
ところで必ずreturn書く人に聴きたいんだけど、ブロックの戻り値ってどうやってます?
最近WindowsのGUIフレームワークを書き始めたんだけど、イベントリスナをブロック
で登録できるようにしてるんだが、ブロックから値を戻すときに、returnと書くと、
LongJumpErrorとか出るんだけど。
ブロックをreturnで戻ることはできないのかなぁ。
193デフォルトの名無しさん:2007/03/31(土) 00:13:33
>>187
こんな書き方はじめてみた。
すごいのかわかりにくいのかなぞだ
194デフォルトの名無しさん:2007/03/31(土) 00:52:51
>>191
さんくすこ。メモリは数倍食うけどこっちの方が速いみたいっすね。
195デフォルトの名無しさん:2007/03/31(土) 00:54:05
>>188
>破壊的メソッドじゃないから効率が悪い。破壊的メソッドの sort! を使え。
あははは!sortとsort_byでベンチマークとって、自分でたしかめな。
196デフォルトの名無しさん:2007/03/31(土) 04:22:15
つ、つられないぞ!
197デフォルトの名無しさん:2007/03/31(土) 05:50:40
>>140
scanってのがあるんですね。
参考になりました。

>>177
俺もその感じ。
コメントつけるところで、むしろメソッド化

でも、Rubyだと、小物多いから、ずらって、書いちゃうことも多い
198187:2007/03/31(土) 06:05:37
>>193
def hoge
 return unless @visible == 1
 return unless @visit_count == 10
 return unless [1
5
9].include?(@s_member_id)
 @disable = 1
end

begin
 break unless visible == 1
 break unless visit_count == 10
 break unless [1
5
9].include?(s_member_id)
 disable = 1
end while(false)
199デフォルトの名無しさん:2007/03/31(土) 07:42:01
>>192
メソッドの戻り値はreturnをつかうけど、ブロックの戻り値はreturnを使わない。後者は挙動が違うし。
メソッドとブロックを同じにしなきゃいけないという理由はない。
200デフォルトの名無しさん:2007/03/31(土) 11:46:49
>>195
あははは!お前こそベンチマークとって、自分でたしかめな。

% time ruby -e '1000000.times { [1, 2, 3].sort! { |a, b| a <=> b } }'
ruby -e '1000000.times { [1, 2, 3].sort! { |a, b| a <=> b } }' 11.40s user 0.01s system 99% cpu 11.520 total
% time ruby -e '1000000.times { [1, 2, 3].sort_by { |a| a } }'
ruby -e '1000000.times { [1, 2, 3].sort_by { |a| a } }' 15.58s user 0.00s system 97% cpu 15.922 total
201デフォルトの名無しさん:2007/03/31(土) 12:24:12
3 個でソートはちょっと・・・。
しかも、ソート列をまたソートさせるのも・・・。

$ time ruby -e '10.times{x=Array.new(10000){rand(5000)};x.sort!{|a,b|a<=>b}}'
real 0m0.950s
user 0m0.942s
sys 0m0.007s

$ time ruby -e '10.times{x=Array.new(10000){rand(5000)};x.sort_by{|a|a}}'
real 0m0.208s
user 0m0.201s
sys 0m0.007s
202デフォルトの名無しさん:2007/03/31(土) 12:25:56
>>200
require 'benchmark'
include Benchmark

a = (1..10000).map {rand(10000)}

bm(10) do |b|
b.report("Sort") { a.sort {|x,y| x<=>y} }
b.report("Sort!") { a.sort! {|x,y| x<=>y} }
b.report("Sort by") { a.sort_by {|x| x} }
end

        user    system   total    real
Sort    1.021000  0.000000  1.021000 ( 1.142000)
Sort!    1.052000  0.000000  1.052000 ( 1.091000)
Sort by  0.070000  0.000000  0.070000 ( 0.080000)

破壊的メソッド「だから」動作が速いという理屈にはならない
単純にどれかが最強というようには決められないのがsort
203デフォルトの名無しさん:2007/03/31(土) 12:54:37
sort と sort! だと sort! の方が速いじゃん?
ごく僅かだが。
204デフォルトの名無しさん:2007/03/31(土) 12:56:31
>>202
sort と sort! を比較するなら a は毎回初期化すべきじゃない?
205デフォルトの名無しさん:2007/03/31(土) 13:02:33
$ time ruby -e '200.times{x=Array.new(10000){rand(5000)};x=x.sort{|a,b|a<=>b}}'
real 0m19.140s
user 0m19.055s
sys 0m0.060s

$ time ruby -e '200.times{x=Array.new(10000){rand(5000)};x.sort!{|a,b|a<=>b}}'
real 0m19.130s
user 0m19.063s
sys 0m0.049s

ほとんど変わんないね。
206デフォルトの名無しさん:2007/03/31(土) 13:13:34
% time ruby -e '1000000.times { [1].sort { |a, b| a <=> b } }'
ruby -e '1000000.times { [1].sort { |a, b| a <=> b } }' 4.12s user 0.01s system 98% cpu 4.171 total
% time ruby -e '1000000.times { [1].sort! { |a, b| a <=> b } }'
ruby -e '1000000.times { [1].sort! { |a, b| a <=> b } }' 2.70s user 0.01s system 99% cpu 2.715 total

このくらいにすると変わってくるか。
207デフォルトの名無しさん:2007/03/31(土) 13:14:29
>>204
        user   system   total    real
Sort    1.201000  0.010000  1.211000 ( 1.312000)
        user   system   total    real
Sort!    1.051000  0.020000  1.071000 ( 1.221000)
        user   system   total    real
Sort by  0.221000  0.000000  0.221000 ( 0.311000)

少なくともsort_byは使うの素人言われるほど常に遅いわけではないな
208デフォルトの名無しさん:2007/03/31(土) 13:50:31
sort_by の利点が生きるのはブロック評価が処理が重い時だろ常識的に考えて……
209192:2007/03/31(土) 14:04:53
>>199
レスありがとう。普通はそうだよね。
でも俺は、returnは戻り値を明確にする意味で使っているので、ちょっと困った。
俺の癖として、最初は結構適当に書いて、ある程度動き出したらリファクタリング
するんだけど、returnがかけないと、修正したときにうっかり戻り値部分のシーケンス
をかえちゃって、気がつかないうちに戻り値が変わってバグっちゃうってことが頻繁に
あるんだよね。この手のバグは後から見つけるのが大変で。
注意して修正すればいいだけの話かもしれないが……
210デフォルトの名無しさん:2007/03/31(土) 14:08:44
リファクタリングはテストとセット。
211デフォルトの名無しさん:2007/03/31(土) 14:47:49
HTML外部ファイルにすると実行時に読み込む分遅くならないか?
.rbファイルの下のほうにHTMLだけ集めて沈めておけばおk。
212デフォルトの名無しさん:2007/03/31(土) 14:58:49
>>211
自分も前作ったCGIでは、必要なHTML部分を
パーツごとに変数に保存して置いて
必要な時に、使用出来る様にしてましたけど。
ズラズラHTMLが並ばずにソースの見通しもよくなるし。

HTMLの一部分を後で置き換えしたい場合なんかは
その部分に特殊な文字を設定したりしてましたけど。
<a href="_URL_">_STR_</a> とか。
213デフォルトの名無しさん:2007/03/31(土) 15:26:12
ディスクにアクセスしてHTMLデータを読み込む
でっかいHTMLデータをsubでスキャンして置換
でっかいHTMLデータをsubでスキャンして置換
ディスクにアクセスしてHTMLデータを読み込む
ディスクにアクセスしてHTMLデータを読み込む
でっかいHTMLデータをsubでスキャンして置換
でっかいHTMLデータをsubでスキャンして置換
ディスクにアクセスしてHTMLデータを読み込む
でっかいHTMLデータをsubでスキャンして置換

ということを連続してやらせてるのが非常に心苦しいのでソースに直に書く
Rubyソースに一緒に書いておけばディスクアクセスは1回で済むし
214デフォルトの名無しさん:2007/03/31(土) 16:36:37
hash.has_key(hoge')?

で1時間以上詰まった
215デフォルトの名無しさん:2007/03/31(土) 16:37:30
hash.has_key('hoge')? だった

要は ? の位置
216デフォルトの名無しさん:2007/03/31(土) 16:45:24
>>213
そんな事しないしw
初心者は質問するだけにしようなw
217デフォルトの名無しさん:2007/03/31(土) 17:12:44
というか、みんなCGI書くときHTMLはどう管理してんの?
特別なフレームワークとか利用せずに、よい管理方法はなにかな?
218デフォルトの名無しさん:2007/03/31(土) 17:13:54
eruby使ってる。
219デフォルトの名無しさん:2007/03/31(土) 17:27:59
俺はRubyでは小規模なCGIばかり作ってるので
今の所はHTMLをソースに埋め込むスタイルでいいや。
220デフォルトの名無しさん:2007/03/31(土) 17:36:45
>>218
>>213の言うところの置換の塊だな
221デフォルトの名無しさん:2007/03/31(土) 19:51:26
>>217
eruby
222デフォルトの名無しさん:2007/03/31(土) 19:58:27
erubyとERBがあってerbscanとかいうのもあってどれを使うべきかさっぱりわからない
223デフォルトの名無しさん:2007/03/31(土) 21:28:54
>>217
ごく簡単なのをでっち上げるときはerbを使う。
あとコードと同じファイルの__END__以降にHTMLを書いて、
そいつを読み込んでる。ファイル一個で済むから楽でいい。
224デフォルトの名無しさん:2007/03/31(土) 21:52:25
なるほど、色々あるねえ。
225MoonWolf ◆MoonWdLnkQ :2007/03/31(土) 22:32:18
>>222
eRubyというのがHTMLおよびテキストファイルにRubyスクリプトを埋め込む
テンプレート言語の仕様。
erubyというのが最初の実装だったかな。
あとでpure RubyのERBが出てきた。
erbscanはERBのスキャナ部を高速化するだけで単体では動作しない。
eRuby実装としては他にもerubisというのがあった。
とりあえず標準添付ライブラリのERB使っておけばいいと思う。
226デフォルトの名無しさん:2007/03/31(土) 23:03:02
>>209
ブロックってbreakで値を返せるんじゃなかったっけ?
yieldした所に値を返す場合はnextで。
227デフォルトの名無しさん:2007/04/01(日) 15:11:22
>>201-207
そもそもの発端である>>135では
> a = ['f2f', 'f10f', 'f1f', 'f0f', 'f3f']
> sa = a.sort{|a,b| a[/¥d+/].to_i <=> b[/¥d+/].to_i }
と書いてあるから、これにそってベンチすべきじゃね?

require 'benchmark'
data = (1..10000).collect { "f#{rand(10000)}f" }
Benchmark.bm(10) do |bench|
  bench.report("sort_by") { data.sort_by {|a| a[/¥d+/].to_i } }
  bench.report("sort") { data.sort {|a,b| a[/¥d+/].to_i <=> b[/¥d+/].to_i } }
  bench.report("sort!") { data.sort! {|a,b| a[/¥d+/].to_i <=> b[/¥d+/].to_i } }
end


結果:
                user     system      total        real
sort_by     0.090000   0.000000   0.090000 (  0.118594)
sort        1.030000   0.010000   1.040000 (  1.154424)
sort!       1.030000   0.020000   1.050000 (  1.348342)

もう明らかにsort_byが速い。sortとsort!の差は誤差。しかもsort!のほうが悪い数値。

>>208
今回がまさにそのケースだな

>>200
これはひどい
228デフォルトの名無しさん:2007/04/01(日) 15:33:16
>>227
> しかもsort!のほうが悪い数値。

>>204
229デフォルトの名無しさん:2007/04/01(日) 15:38:34
sort!はsortのあとに呼び出してるんだから、毎回初期化する必要なんかないと思うけど?
230デフォルトの名無しさん:2007/04/01(日) 16:23:59
>>229
すまん。かんちがい。
231デフォルトの名無しさん:2007/04/01(日) 16:54:33
>>220
ああいう「文書作れるよシステム」ってのは
何か物凄いカッコイイことして生成してるんだと思ってた俺

ただの全文置換と知ったときはなんとなく失望した
232デフォルトの名無しさん:2007/04/01(日) 16:57:32
Webサービス公開してる人は勉強のためにソースも公開してる?

ソース公開しちゃうと穴突かれてレン鯖が過負荷攻撃とかされたりしそうで二の足踏んでるんだけど
233デフォルトの名無しさん:2007/04/01(日) 21:12:05
>>200すごいな 自信満々で赤っ恥かいてる
あと一日待っていれば「エイプリルフールネタでした」とごまかせたものを

今年はruby-lang.orgで何もやんないの?
234デフォルトの名無しさん:2007/04/01(日) 22:20:19
>>233
>今年はruby-lang.orgで何もやんないの?
やってるよー。よく見てみな。
235デフォルトの名無しさん:2007/04/01(日) 23:29:13
>>234
わからん・・・どこにネタが?
236デフォルトの名無しさん:2007/04/02(月) 00:17:47
もちろん>>234がネタ
237デフォルトの名無しさん:2007/04/02(月) 00:40:03
yaml使ってみようと思ったんですけど日本語が化けるのって
どうしたら直りますか?

#!/usr/bin/ruby -Ku
require "yaml"
$Kcode = "UTF8"

obj3 = {"テスト"=>"250400", "テスト2"=>"25500"}
p obj3.to_yaml(:BestWidth=>10000)

の表示結果が激しく化けます。
"--- \n\"\\xE3\\x83\\x86\\xE3\\x82\\xB9\\xE3\\x83\\x882\": \"25500\"\n? !binary \"44OG44K544OI\\n\"\n: \"250400\"\n\n"
な感じです。
環境はruby 1.8.5 (2006-12-04 patchlevel 2) [i386-linux]です。
分かる方いらっしゃったら解決方法お願いします。
238デフォルトの名無しさん:2007/04/02(月) 00:56:22
239デフォルトの名無しさん:2007/04/02(月) 01:09:14
>>238
そこ見てたんだが何だかうまいこと出来なかった。
んでもう一回今やったら出来ました。
ありがとです
240デフォルトの名無しさん:2007/04/02(月) 10:59:45
>>234
だまされた Σ(´д`)
241デフォルトの名無しさん:2007/04/02(月) 11:05:28
Rubyで書かれた有名なソフトってどんなのがありますか?
242デフォルトの名無しさん:2007/04/02(月) 11:16:22
特にありませんが何か?
243デフォルトの名無しさん:2007/04/02(月) 11:26:16
tDiaryとか…(汗
244デフォルトの名無しさん:2007/04/02(月) 11:53:26
ワードやエクセルみたいなのじゃないと駄目だろ
みんなが知ってるやつ
245デフォルトの名無しさん:2007/04/02(月) 12:00:38
「有名なソフト」というそのものが数少ないからな

で、ソレがあったとして、あるいはなかったとして>>241はどうするのかという話
使われなくなって廃れるのが怖いなら不滅のC使え
246デフォルトの名無しさん:2007/04/02(月) 12:08:15
あったら参考にするし
なかったら幻滅する
247デフォルトの名無しさん:2007/04/02(月) 12:18:44
しつもんです。本のデータ扱ってます。
たとえば書名と著者と出版社をキーとするハッシュがあってそれが配列に入ってます。
[
{ 書名 => 本その1, 著者 => ○○, 出版社 => ■■出版 },
{ 書名 => 本その2, 著者 => ●●, 出版社 => □□出版 },
{ 書名 => 本その3, 著者 => ★★, 出版社 => ◆◆出版 },
{ 書名 => 本その4, 著者 => ★★, 出版社 => □□出版 },
{ 書名 => 本その5, 著者 => ○○, 出版社 => □□出版 },
{ 書名 => 本その6, 著者 => ●●, 出版社 => ■■出版 },
{ 書名 => 本その7, 著者 => ○○, 出版社 => □□出版 },
]

これを、出版社でソートしたあと著者でもソートしたいです。

[
{ 書名 => 本その5, 著者 => ○○, 出版社 => □□出版 },
{ 書名 => 本その7, 著者 => ○○, 出版社 => □□出版 },
{ 書名 => 本その2, 著者 => ●●, 出版社 => □□出版 },
{ 書名 => 本その4, 著者 => ★★, 出版社 => □□出版 },
{ 書名 => 本その1, 著者 => ○○, 出版社 => ■■出版 },
{ 書名 => 本その6, 著者 => ●●, 出版社 => ■■出版 },
{ 書名 => 本その3, 著者 => ★★, 出版社 => ◆◆出版 },
]

どのように書くのがマトモですか?
248デフォルトの名無しさん:2007/04/02(月) 12:48:48
books.sort_by {|i| [i["出版社"], i["著者"]] } でどうよ
249248:2007/04/02(月) 12:53:48
books.sort_by {|i| i.values_at "出版社", "著者" } の方がきれいか
250デフォルトの名無しさん:2007/04/02(月) 13:01:38
俺ならハッシュ使うよりも本のクラスを作って
class Book
 def initialize(書名, 著者, 出版社)
  @書名 = 書名
  @著者 = 著者
  @出版社 = 出版社
  ・
  ・
 end
 attr_reader :書名, :著者, :出版社
end
んな感じにするけどな
そうすりゃ
list = Array.new
list.push Book.new("エロ本","エロイ人","エロイ出版社")
list.push Book.new("空手入門","マス大山","ピヨピヨ空手連盟")

でソートや検索も楽になるし
251デフォルトの名無しさん:2007/04/02(月) 13:10:34
>>250
…それソート楽か?
252デフォルトの名無しさん:2007/04/02(月) 15:02:59
>>248-249
うおおおおおれにはなにやってんだかさっぱりです(w

ありがとうです勉強します
253デフォルトの名無しさん:2007/04/02(月) 19:07:37
>>251
独自クラスにして、
<=>メソッドをオーバーライドしる

ってことじゃね?
254デフォルトの名無しさん:2007/04/02(月) 19:09:31
Thread.forkでつくったスレッドにはメインスレッドからjoinできないのですか?
255京大生www ◆HEfxsk5e3k :2007/04/02(月) 20:00:49
てゆうかThreadって何をするクラスですか?
どういう場面に有益なんでしょう
256デフォルトの名無しさん:2007/04/02(月) 20:46:29
うんこしながら新聞よみつつカレー食ったりしたいだろ?
257デフォルトの名無しさん:2007/04/02(月) 20:54:05
京大性はシングルタスクOS
258デフォルトの名無しさん:2007/04/02(月) 22:29:14
>>253
それじゃソート順が固定になっちゃう。
259京大生www ◆HEfxsk5e3k :2007/04/02(月) 22:55:17
ようするに並行処理がしたいってことだろうけど
それって何かメリットあるの?
デュアルコア対応?
260デフォルトの名無しさん:2007/04/02(月) 23:08:05
無駄に気合が入ったぱるまからもう一年か。
なつかしいな。
261デフォルトの名無しさん:2007/04/02(月) 23:08:28
>>258
む、スマン"ソート順が固定"の意味がいまいち掴めん。

<=>を「出版社のあと書名で比較する」って動作にしてしまうと柔軟じゃなくなるって意味なら禿同。
262デフォルトの名無しさん:2007/04/02(月) 23:21:09
>>259
例えばhttpで複数のファイルをダウソしたいときとか
いちいち1個のURLのごとにレスポンス待ってたら遅いだろ?
スレッドで並行処理させれば複数のURLに同時にコネクション張れる
263京大生www ◆HEfxsk5e3k :2007/04/02(月) 23:44:07
別にひとつひとつ処理しても結局時間は変わらないと思うんだけど?
同時にふたつの処理をしたら速度は1/2になるだろ、常識的に考えて
264デフォルトの名無しさん:2007/04/02(月) 23:46:08
rubyはネイティブスレッドじゃないから高速化はしないので、
I/Oデバイス・ネットワークデバイスが相手でなければ、その通りだが。
265デフォルトの名無しさん:2007/04/02(月) 23:56:09
そんなこと言っても理解できるとはとうてい思えないけどなw
266デフォルトの名無しさん:2007/04/02(月) 23:57:14
>>262
荒らしは氏ね
267デフォルトの名無しさん:2007/04/03(火) 00:02:30
>>263

>>262はhttp通信の具体例に限った話をしてるわけで…

>>266
荒らし?
今すぐブラウザ削除して寝てろ
268京大生www ◆HEfxsk5e3k :2007/04/03(火) 00:25:07
>>267
httpの場合はどのくらい早くなるの?
つまり画面にあるエロ画像とかをまとめてDLしたい時だよな。
非常に簡単で性器表現を使えば楽勝だけど
早くなるの?
順々にDLしていくのと結局変わらないだろ。
269デフォルトの名無しさん:2007/04/03(火) 00:31:44
>>267
レスするから付きまとってスレが穢れるんだろ
270デフォルトの名無しさん:2007/04/03(火) 00:32:13
>>268
リクエストを出して結果が返ってくるまでに平均で1秒かかるサーバがあったとする。
a,bの2個のファイルをダウンロードするとする

順々にダウンロードする場合
aをダウンロード(1秒)の後bをダウンロード(1秒)
合計2秒

スレッドを使って平行ダウンロードする場合
aをダウンロード(1秒)
bをダウンロード(1秒)
平行してダウンロードしてるので1秒しかかからない

271デフォルトの名無しさん:2007/04/03(火) 00:35:33
>>268
とあるホストが落ちていたり、転送速度が極端に低かったりする場合を考えてみろよ
272デフォルトの名無しさん:2007/04/03(火) 08:23:27
273京大生www ◆HEfxsk5e3k :2007/04/03(火) 10:00:40
よくわかんないけどじゃあ10000000個のファイルを同時に落としても1秒ってことだね。
すごいね、すごいね、嘘つきwwwwwwwww
274デフォルトの名無しさん:2007/04/03(火) 10:15:40
>>252
<=>メソッドの比較動作は摩訶不思議だからな
どーゆー理屈で1とか-1とか返してんだか一見してわからんものもいくつか
275デフォルトの名無しさん:2007/04/03(火) 11:04:43
メソッドチェインが素敵なので怠けて
table = open('./table.txt','r').read.split(/\n/)
ついついこんなコードを書いてしまうのですが、これってファイル閉じてないからよくないですか?
それとも参照してる変数がないから速攻でGCたんが回収しにきたりするんでしょうか?
276デフォルトの名無しさん:2007/04/03(火) 11:58:09
>>275
リファレンスマニュアルでは開けっ放しのGCまかせは推奨されていない。
277デフォルトの名無しさん:2007/04/03(火) 12:03:50
>>275
table = File::read('./table.txt').split(/^/)
table = File::open('./table.txt') { |f| f.read }.split(/^/) # Ruby 1.6
278デフォルトの名無しさん:2007/04/03(火) 12:28:40
ただのopen使う人ってまだ時々いるよね
(こんなの勧めてるのどこの解説だ?)

1行で書くならFile.read(path)のほうが絶対にいいのに
279デフォルトの名無しさん:2007/04/03(火) 13:18:09
レスありがとうございますー。

>>276
Fileオブジェクトを変数に格納しなくても「開きっぱなし」状態になるのかな、と思いまして…

>>277
おお、File::readメソッドいいですね!
使わせていただきます。

>>278
RubyのリファレンスマニュアルでIOオブジェクトのopenメソッドの説明では
詳細は組み込み関数の方見やがれ、って書いてあるのでなんとなくでした。
280デフォルトの名無しさん:2007/04/03(火) 14:03:37
Rubyのというよりプログラミングののような気がする質問があるんですが、ここで聞いても良いんでしょうか。
281デフォルトの名無しさん:2007/04/03(火) 14:07:31
そのプログラムをRubyで表記してたらいいんじゃね?
282デフォルトの名無しさん:2007/04/03(火) 14:10:55
スレ違いなら罵倒なりスルーなり誘導なりするから普通に書けばいいんじゃねの
283デフォルトの名無しさん:2007/04/03(火) 14:12:58
Enumearble#zip って何故 nil 返すんだろ?
ブロックを評価した値を配列にしたものを返す方がよくね?
ていうかそういうメソッドが既にあったりする?
284デフォルトの名無しさん:2007/04/03(火) 14:40:04
>>279の自己レス
readlinesっていうクラスメソッドがありました。
table = File.read('./table.txt').split(/\n/)

table = File.readlines('./table.txt')
になります

ただreadlinesだと改行除去してくれないっぽくて
File.readlines('./notexist.txt').map!{|x| x.chomp}
こんな感じにする必要がありました、びみょー・・
285デフォルトの名無しさん:2007/04/03(火) 14:41:58
irb(main):001:0> [1, 2].delete 1
=> 1
irb(main):002:0> [1, 2].delete_if { |e| e == 1 }
=> [2]

なにこの統一感の無さは?
286デフォルトの名無しさん:2007/04/03(火) 15:20:54
検索サイトを利用しようと思ってます。で

response = http.post( '/cgi-bin/search.rb', 'query=subject&target=ruby' )

という形でpostしてますが、queryのたとえばsubject部分に &amp; や &gt; といったものが含まれてると

  query=you&amp;me
  &target=ruby

という2つではなく

  query=you
  &amp;me
  &target=ruby

という3つ送る解釈をされてしまって検索できません
どうやればうまく解釈してもらえるようになりますか?
287デフォルトの名無しさん:2007/04/03(火) 15:25:52
CGI.escapeでURLエンコードすればいいんじゃないかな
288デフォルトの名無しさん:2007/04/03(火) 16:01:09
逆じゃないか
おそらく HTML や XML 由来の検索ワードの中に実体参照とかがあって
その & が邪魔してるってんだから CGI.unescapeHTML してみ
289デフォルトの名無しさん:2007/04/03(火) 16:45:18
両方やらなきゃいけないような。
290デフォルトの名無しさん:2007/04/03(火) 17:18:41
HTMLやXMLのファイルを外部からとってくる
        ↓
とりあえずCGI.unescapeHTMLする
        ↓
抜き出したりとか加工したりとかする
        ↓
外部にPOSTするときにはCGI.escapeする


流れ的にはこうかね
291デフォルトの名無しさん:2007/04/03(火) 17:46:46
それだと抜き出したり加工したりするときに<なのか&lt;なのか判らなかったりして困るような。
292デフォルトの名無しさん:2007/04/03(火) 19:57:07
>>278
ファイルがでかくて逐次処理したほうがいいときとか

そういう基本的なプログラミングテクニックはのってないわな
293デフォルトの名無しさん:2007/04/03(火) 20:03:00
File::readで読むのを躊躇うような巨大なファイルをrubyに食わせてやるなよ(w
294デフォルトの名無しさん:2007/04/03(火) 20:05:09
よーしパパRubyで動画編集しちゃうぞ〜
295デフォルトの名無しさん:2007/04/03(火) 20:08:54
どちらにしても限定的だしopenの挙動に任せるような事態じゃないな
読む前に検知して別途何かさせるべきかもしれん

「ファイル読むときの基本はFile.read」ということでいいのか
296デフォルトの名無しさん:2007/04/03(火) 20:22:07
>>291
そこでアプリケーションハンガリアンですよ。
297デフォルトの名無しさん:2007/04/03(火) 23:07:49
File.read()はあるのにFile.write()がないのがなっとくいかん
でもFile.read()ではなく実はIO.read()であるのはもっとなっとくいかん
298デフォルトの名無しさん:2007/04/03(火) 23:23:12
Rubyはちょこちょことこういう虫が出てくるからカワイイ
299デフォルトの名無しさん:2007/04/04(水) 00:10:24
でかいファイルにアクセスする可能性があるなら
open(){} 使って行かバイト単位で読み書きした方が良い罠
ちっこいファイルとか、試作ならreadで済ます
300デフォルトの名無しさん:2007/04/04(水) 00:10:48
>>292
> ファイルがでかくて逐次処理したほうがいいときとか
ブロックつかえよ。
301デフォルトの名無しさん:2007/04/04(水) 00:17:09
>>299
将来どんな大きさのファイルが来るかなんてわからないじゃないか!
どんなものに対しても考えうる最大限の用意をしておくのが
製作者としての最低限の礼儀だろ!


てなわけでrescueがトップレベルにずらーっと
302デフォルトの名無しさん:2007/04/04(水) 00:21:15
>>297
おれはFile.readにモードを指定できないのがむかつく。
303デフォルトの名無しさん:2007/04/04(水) 00:30:45
File.writeが無いのでFile.readは使わない
304デフォルトの名無しさん:2007/04/04(水) 09:46:05
バイナリモードにできないからFile.readは使わないというより使えない
305デフォルトの名無しさん:2007/04/04(水) 15:22:27
rubyには、urlの文字列を操作するメソッドってありますか?
Pythonでいうところの、urljoinみたいなやつがあると便利なんですが。。。
>>> urljoin('http://www.python.org','doc/lib')
'http://www.python.org/doc/lib'
306デフォルトの名無しさん:2007/04/04(水) 15:56:39
>>305
require 'uri'
puts URI.join('http://www.ruby-lang.org/', '/ja/man-1.6/')



http://www.ruby-lang.org/ja/man-1.6/
307305:2007/04/04(水) 16:11:50
>>306
素早い回答ありがとうございます。助かりました。
308デフォルトの名無しさん:2007/04/04(水) 16:26:32
Structで作った構造体クラスのメンバをすべてクリアしたい場合にはどうすればよいのでしょうか?

hoge.map!{|x| x = nil}

だと参照元が元のオブジェクトは無関係のようで、変化なしでした。
再度Newするとパフォーマンス的に問題がありそうなので何か良い方法があれば教えて下さい。
Arrayクラスみたいにmap!があればいいのになぁ…。
309デフォルトの名無しさん:2007/04/04(水) 16:27:19
ぐふっ
× hoge.map!{|x| x = nil}
○ hoge.map{|x| x = nil}
です。
310デフォルトの名無しさん:2007/04/04(水) 16:29:42
>>306
さりげなくurlの変え方が細けえ!
404具合とか・・・
311MoonWolf ◆MoonWdLnkQ :2007/04/04(水) 16:47:50
312デフォルトの名無しさん:2007/04/04(水) 16:53:05
www.ruby-lang.org ってしょっちゅう 503 にならない?
リロードすると大抵見れるようになるから別に良いっちゃあ良いんだけど。
313デフォルトの名無しさん:2007/04/04(水) 17:02:35
文字列は全部ダブルクォートでくくって書いてるんですが
シングルクォートで書いた方が良い状況はありますか?

" と ' が混在するとソース全体の見ばえが雑になる気がして嫌なんですけど
何かシングルクォートで明示的にしておくべきケースがあるなら…と気になって質問しました
314デフォルトの名無しさん:2007/04/04(水) 17:22:13
>>313
ダブルクォーテーションの恩恵を受けなくてもいいとき
ダブルクォーテーションだと困るとき
315デフォルトの名無しさん:2007/04/04(水) 17:39:07
微々たる違いかもしれないけど、変数展開の処理がない分
シングルクォートの方が処理としては軽いんじゃ?

だからダブルクォートは必要な場面でのみ使って
それ以外はシングルクォートがいい

ってばあっちゃが言ってた
316デフォルトの名無しさん:2007/04/04(水) 17:51:49
もちろんハッシュのキーはシンボルだよな!
317デフォルトの名無しさん:2007/04/04(水) 17:57:49
オブジェクト生成が重いのでクラスやモジュールは極力使わずトップレベルにメソッドを定義
外部モジュールのメソッドは使うぶんだけをトップレベルにコピペする
変数は基本的に使わず内容は手で直書き・メソッドチェーン活用
ファイル読み込みと字句解析に余分な時間がかかるのでコメントやインデント空白は一切なし
318デフォルトの名無しさん:2007/04/04(水) 18:06:47
(;^ω^;)Cで書けよw
319デフォルトの名無しさん:2007/04/04(水) 18:27:32
>>317
>外部モジュールのメソッドは使うぶんだけをトップレベルにコピペする
この辺りで狂喜のようなものを感じたww
320デフォルトの名無しさん:2007/04/04(水) 19:02:40
大喜びですか。
321デフォルトの名無しさん:2007/04/04(水) 19:28:17
>>315
微々たる違いかもしれないけど、シフトキーを押す処理がない分
シングルクォートの方が処理としては軽いんじゃ?

って英語キーボード使いのじいちゃんは言ってた
322デフォルトの名無しさん:2007/04/04(水) 19:33:39
人間がコード読むときにダブルクォートだと変数展開があるかも、
って思うかもしれないからその分負担が増えるかもね

微々たる違いかもしれないけど

323デフォルトの名無しさん:2007/04/04(水) 20:53:04
>>317
徹底してないな。必ず破壊メソッドを使え。
324デフォルトの名無しさん:2007/04/04(水) 22:32:49
普段から気をつけると覿面なのはsortとか正規表現オブジェクトとか正規表現のマッチングとかかな?
325デフォルトの名無しさん:2007/04/05(木) 07:52:43
すみません
class A
class B < A
があったとします

classAでもBでもメソッドhoge1,hoge2があったとします
classBのメソッドhoge1でclassAのメソッドhoge2を呼ぶにはどうすればいいのでしょ?
普通にhoge2を呼ぶと、classBで定義したhoge2がよばれますよね?
superだけかくと、classAのhoge1が呼ばれるし
なんか、方法あるのかにゃ?
326デフォルトの名無しさん:2007/04/05(木) 08:37:38
>>325
aliasを使えばいいかと
class B < A
 alias hoge2_s hoge2
 def hoge1
  hoge2_s
 end
 def hoge2
 end
end
327デフォルトの名無しさん:2007/04/05(木) 08:41:56
多分継承してること自体がおかしい。
328デフォルトの名無しさん:2007/04/05(木) 08:43:08
方法1 あとからclass Aのhoge2に別名を付ける。
方法2 UnboundMethodオブジェクトを取り出して呼ぶ。

後者は
hoge2 = A.instance_method(:hoge2)
hoge2.bind(b).call

329デフォルトの名無しさん:2007/04/05(木) 09:16:35
# ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-freebsd6]
class C
 attr_reader :n
 def a=(x)
  @n = x + 1
 end
 alias b a=
end
c = C.new
p c.a = 3 # 3
p c.n # 4
p c.b(3) # 4
p c.n # 4

C#a= と C#b は同じメソッドなのに、何故返値が違うのでしょうか?
330デフォルトの名無しさん:2007/04/05(木) 09:21:51
>>329
知っててやってるんだと思うが、代入式に見えるメソッド呼び出しの式の値は右辺の値を返す。
331デフォルトの名無しさん:2007/04/05(木) 09:33:34
>>330
多分そうだろうとは思ったのですが、念のため訊いてみた次第です。
ありがとうございました。

しかしなんでこんな仕様なんでしょうか?
妙なバグを防ぐ為なのだろうけど、あまり嬉しくないような……
332デフォルトの名無しさん:2007/04/05(木) 10:04:40
>>331
要するに、=つきメソッドはアクセサとして定義しなさい、ということだろう。
333デフォルトの名無しさん:2007/04/05(木) 11:15:54
揚げ足取りが多いな。それほど他の言語の廚が脅威に感じてくれてる表れか。書籍もたくさんでて売り場面積も広がったしなあ。

数ギガのファイルをfilereadで処理させたら凄くメモり喰うのは、用途が間違ってるのか(w
334デフォルトの名無しさん:2007/04/05(木) 11:25:37
揚げ足取りが見つからない俺
335デフォルトの名無しさん:2007/04/05(木) 12:05:20
数ギガのファイルをfilereadで処理させたら凄くメモり喰うのは、用途が間違ってる以前に、
根本的に勉強が足りな過ぎだと思う。
336デフォルトの名無しさん:2007/04/05(木) 13:23:03
>325
B#hoge2でsuper呼ぶか、そもそもBでhoge2をオーバライドしなけりゃいいんでね?
337デフォルトの名無しさん:2007/04/05(木) 15:01:05
>>327 のレスが普通にスルーされてるみたいだけど、
A も B もいじって構わないのであれば、設計を見直した方が良いように思う。
継承自体はおかしくないかもしれないけど、リファクタリングはすべきかと。
338MoonWolf ◆MoonWdLnkQ :2007/04/05(木) 15:42:39
>>333
全体がメモリ上に欲しいなら仕方ないのかも知れないが、
たいていは数MBずつ小分けにして読み込むかインデックスを
作って部分的にアクセスするようにすれば解決する。
339デフォルトの名無しさん:2007/04/05(木) 16:52:28
325の設計が悪いと思う前に、
self(というかメソッドディスパッチ)に細工のしにくいCommon Lispとかならともかく、
Rubyでこのsuperの仕様はないだろうに…とMatzのセンスのほうを疑うのは俺だけか?
340デフォルトの名無しさん:2007/04/05(木) 17:24:45
もうちょっと詳しく
341デフォルトの名無しさん:2007/04/05(木) 19:21:28
プログラム作ってみました見てください!

print(1)
sleep(2)
print(2)
sleep(2)
print(3)
sleep(2)
print('だあああああああああああああああああああ')

どうですかね??
342デフォルトの名無しさん:2007/04/05(木) 19:23:39
30分前にはじめました
これからがんばります
343デフォルトの名無しさん:2007/04/05(木) 21:12:27
c++暦が長いruby初心者からすると
B::hoge2がA::hoge2を呼び出して、その他にB専用の追加処理をするのは、ごく自然な行為に見える。

と思ったら、B::hoge1がA::hoge2を呼ぶのかよ…
344デフォルトの名無しさん:2007/04/05(木) 21:45:08
>>325
A#hoge2とB#hoge1に共通の処理を、モジュールMにメソッドとして実装する。
MをAとB両者にincludeして、A#hoge2とB#hoge1はそれを利用して実装する。

>>343
>B::hoge2
それだとクラスメソッド(C++でいうstaticメソッド)を意味する。
しかもB.hoge2っていう表記のほうが好まれる。::はクラス内の定数を参照したり
するときに使うが吉だと思う。
ふつーのメソッドは、実際の呼び出し方と違うけどB#hoge2って書くのが慣習。

345デフォルトの名無しさん:2007/04/05(木) 21:52:53
>>344
自己レス。
>C++でいうstaticメソッド
やべぇうろ覚え、Javaと混ざってる鴨
346325:2007/04/05(木) 21:54:01
皆様レスありがとうございます。
instance_methodを使う方法で旨いことできました。

ちなみに、私の質問は純粋に興味から生まれた物であり、実際にその様なclassを実装しているわけではありません
設計に関する議論をしてくださった方にはご迷惑をおかけしました

しかし、おかげさまで、UnboundMethodなどについても理解が深まりました

ruby軽く勉強中の身なのですが、やはり深く勉強するには動かし方を表面的に学ぶだけではなく、マニュアルなどを読み込むことが必要だとあらためて感じました

これからも、お世話になるかもしれませんが、よろぴくおねがいしますにゃん
347デフォルトの名無しさん:2007/04/05(木) 22:22:12
最後の最後の一言が気にくわない。
348デフォルトの名無しさん:2007/04/05(木) 23:20:03
>>347
想像力を駆使しろ。
         ,-、            ,.-、
        ./:::::\          /::::::ヽ
       /::::::::::::;ゝ--──-- 、._/::::::::::::::|
       /,.-‐''"´          \:::::::::::|
     / /           \ ヽ、::::|
    /    ●         ●     ヽ|
     l   , , ,                     l
    .|        (_人__丿  """     |
     l        ヽノ            l
    ` 、  /⌒⌒i   /⌒ヽ        /
      `/    |   |    \    /

これからも、お世話になるかもしれませんが、よろぴくおねがいしますにゃん
349デフォルトの名無しさん:2007/04/06(金) 09:19:11
ttp://www.ruby-lang.org/ja/man/?cmd=view;name=Date
>valid_date? (year, mon, mday[, start])
>正しい暦日付であれば、相当するユリウス日を返します。そうでないなら、偽を返します。

実際は存在しない日付は偽(false)じゃなくnilが帰ってくる。仕様が変わった?
それとも環境によって変わるのかな。
350デフォルトの名無しさん:2007/04/06(金) 10:18:29
>349
レポジトリを見てみたが、登場当初から nil を返すコードな気がする。
ドキュメントの間違いだろう。
351デフォルトの名無しさん:2007/04/06(金) 12:37:35
>>349
Rubyで「偽」って言ったらnilとfalseのことなんだから、
間違いではないんじゃね?
352デフォルトの名無しさん:2007/04/06(金) 13:03:46
マニュアルや解説で偽って言うの禁止

ttp://www.ruby-lang.org/ja/man/?cmd=view;name=trap%3A%3A%BF%BF%B5%B6%C3%CD

っていうか gi? っていうメソッド作れ
353デフォルトの名無しさん:2007/04/06(金) 19:34:25
hoge.gi? # -> joe
354デフォルトの名無しさん:2007/04/06(金) 21:13:51
ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32]

require 'tk'
TkButton.new(nil, 'text'=>'exit', 'command'=>proc{exit}).pack
Tk.mainloop

を実行すると

---------------------------
ruby.exe - コンポーネントが見つかりません
---------------------------
tk84.dll が見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールし直すとこの問題は解決される場合があります。
---------------------------
OK
---------------------------

c:/bin/ruby/lib/ruby/1.8/i386-mswin32/tcltklib.so: 126: 指定されたモジュールが見
つかりません。 - c:/bin/ruby/lib/ruby/1.8/i386-mswin32/tcltklib.so (LoadError)

from c:/bin/ruby/lib/ruby/1.8/tk.rb:7
from c:/home/test/test.rb:1:in `require'
from c:/home/test/test.rb:1

というエラーが出ます。
TK使う場合何か特別なセットアップが必要ですか?
355デフォルトの名無しさん:2007/04/06(金) 21:39:37
ActiveTclでも入れて味噌
http://www.activestate.com/products/activetcl/
356デフォルトの名無しさん:2007/04/06(金) 22:44:58
環境変数 TCL_LIBRARY と TK_LIBRARY かな?
357デフォルトの名無しさん:2007/04/06(金) 22:55:03
Tcl/Tkが別途インストールされて無いだけじゃね?
358デフォルトの名無しさん:2007/04/07(土) 00:36:50
メールでの日本語Subjectをつくるのに一番無難な方法って何ですか?
359デフォルトの名無しさん:2007/04/07(土) 00:53:36
.tojis
360デフォルトの名無しさん:2007/04/07(土) 01:18:34
>>315
> ってばあっちゃが言ってた

迷信。
361デフォルトの名無しさん:2007/04/07(土) 02:06:38
>>354
俺も昔同じ状況になった。
WinXP なんだが、ActiveTcl インスコして
tcl\bin にパス通したら出なくなった。
362デフォルトの名無しさん:2007/04/07(土) 06:17:27
>>359
最近それでも表示されるよな…
363デフォルトの名無しさん:2007/04/07(土) 13:43:16
ShiftJISでも結構平気

日本語投げてもASCIIだけを投げても一発でうまく変換するメソッドは作られてないんじゃなかろうか
364デフォルトの名無しさん:2007/04/07(土) 15:41:03
tmail…
365デフォルトの名無しさん:2007/04/07(土) 16:20:21
NKFである程度はできるだろ…

irb> subject='RFC2047ではヘッダフィールドは1行76文字以内(改行含む)でなければならない…ってNKF自身が76文字で改行してるじゃん…'

irb> puts NKF.nkf('-EM',subject)
=?ISO-2022-JP?B?UkZDMjA0NxskQiRHJE8lWCVDJUAlVSUjITwlayVJJE8bKEIxGyRCOVQbKEI3Ng==?=
=?ISO-2022-JP?B?GyRCSjg7ejBKRmIhSjJ+OVQ0XiRgIUskRyRKJDEkbCRQJEokaSRKGyhC?=
=?ISO-2022-JP?B?GyRCJCQhRCRDJEYbKEJOS0YbJEI8Kz9IJCwbKEI3NhskQko4O3obKEI=?=
=?ISO-2022-JP?B?GyRCJEcyfjlUJDckRiRrJDgkYyRzIUQbKEI=?=
366デフォルトの名無しさん:2007/04/07(土) 19:01:32
こいつを実行するとIllegal instructionというエラーが出て
ruby(1.8.6)が落ちてしまうんですが、どうしたもんでしょう。

def until_catch(*symbols)
 raise LocalJumpError, 'no block given' unless block_given?
 symbols = [symbols] if symbols.kind_of? Symbol

 pr = proc { loop{ yield } }
 symbols.reverse_each { |sym|
  pr = proc {
   catch(sym) { pr.call }
  }
 }
 pr.call
end

until_catch(:a,:b,:c,:d) { p(r = rand); throw :b if r < 0.3 }
367366:2007/04/07(土) 19:15:55
すいません、スタックフレーム作ったら解決しました。
なんか悪い事をしたときには例外が上がるもんだと思っていたので、
突然インタプリタが落ちたのに動揺してしまって……

どうやら再帰の無限ループになってたみたいですね。
irb(main):001:0> def f(x) f x; end; f 0
Illegal instruction
$

以下、修正版です。
def until_catch(*symbols)
 raise LocalJumpError, 'no block given' unless block_given?
 symbols = [symbols] if symbols.kind_of? Symbol
 procs = Array.new(symbols.size + 1)

 procs << proc { loop{ yield } }
 symbols.reverse_each { |sym|
  procs << proc {
   catch(sym) { procs.pop.call }
  }
 }
 procs.pop.call
end
368デフォルトの名無しさん:2007/04/08(日) 17:24:19
Rubyでプロセスを新規生成しないWebアプリケーション環境はありますか?
そのような環境ではENVなどの定数の環境変数はどのような扱いになるのでしょうか?
(同一プロセスでクライアント毎に異なる定数を使うことが可能?)
369デフォルトの名無しさん:2007/04/09(月) 11:21:23
結局Thread.forkはなんなのかよくわからないな。
Thread.startとの差がソースを読んでもよくわからないが、
実行すると差がある。なんでだ?
370デフォルトの名無しさん:2007/04/09(月) 11:26:18
>>368
サーバ関連の知識を基礎から学習した方がいいと思われ
371デフォルトの名無しさん:2007/04/09(月) 15:16:02
>>368
CGIとの対比でいっているなら mod_ruby または FastCGI

ENVについては、ユーザからのリクエストごとに再設定されるだけ。
Javaのようにスレッドで処理されるわけじゃない。
372デフォルトの名無しさん:2007/04/09(月) 17:10:36
>>369
> 実行すると差がある。なんでだ?

どんな差?
373デフォルトの名無しさん:2007/04/09(月) 17:47:00
前者はギュイーンって感じだけど
後者はビンビンって感じ
374デフォルトの名無しさん:2007/04/09(月) 18:07:56
ファイルの最後の行だけを読み取りたいと思ってます。
ファイルサイズが大きくなると単純にreadlineの繰り返しじゃ重そうなので、

1.ファイルのEOF一歩手前までシーク
2.一文字読み取り
3.\r or \nならreadline
4.そうじゃないなら一文字分手前にシーク(2から繰り返し)

って処理にしようと思いました。

File.open('./result.txt'){|f|
f.seek(-2, IO::SEEK_END)
until (c = f.getc).to_s =~ /\r|\n/
puts f.pos
f.seek(-2, IO::SEEK_CUR)
end
}

posメソッドでシーク位置を確認しているのですが、
f.seek(-2, IO::SEEK_END)
だとシーク位置が変わらず、
f.seek(-3, IO::SEEK_END)
だとシーク位置が2ずつ下がっていくと言う摩訶不思議な現象が起こっています。

原因が分かる方いらっしゃいましたら教えてください。
あと、「せっかくだから俺ならこうするぜ」みたいなのもあったらぜひぜひおねがいします。
375デフォルトの名無しさん:2007/04/09(月) 18:25:01
漏れなら真っ先に File::open がバイナリモードかどうかを疑う。
376デフォルトの名無しさん:2007/04/09(月) 20:38:46
>>370 ( ゚д゚)、

>>371
新たにプロセスを生成せずにRubyスクリプトを実行している場合定数やグローバル変数はどうなるのでしょうか?
CGIでグローバル変数を使用していた場合mod_rubyに移行することはできないのでしょうか?
377デフォルトの名無しさん:2007/04/09(月) 22:14:00
だから、わかってるならわかってるように言葉や表現を交えて質問しろ
何を意図してるのかはわからんでもない気はするんだが、そんな推測に頭使いたくないから賢いとこ見せてくれ
378デフォルトの名無しさん:2007/04/09(月) 23:19:57
馬鹿以外には理解できる記述を、既にきちんと成功させております。
それでもなお理解できない馬鹿の「馬鹿な俺にも理解できるように書け」という馬鹿要望は
当然ながら無視させていただきます。
379デフォルトの名無しさん:2007/04/10(火) 07:20:48
>>376
あんたの推測通り、定数やグローバル変数や、あとクラス変数とかはそのまま引き継がれる。
これらに依存したCGIスクリプトはmod_rubyではうまく動かない可能性が高い。

>>377-378
ここは初心者スレ。初心者に我慢強く相手することができるやつだけがくればいい。
おまえらのようなやつはここにくるな。本スレだけみとけ。
380デフォルトの名無しさん:2007/04/10(火) 08:33:17
>>376
定数は変更されないはずだから、これは問題になることはないだろうね。
グローバル変数やクラス変数も、使い方によってはセーフかもしれないけど、まあふつうはアウトだな。
あと、ファイル関係とセッション関係も気をつけた方がいい。
ファイルを開いたまま閉じてなかったら、CGIでは動いてもmod_rubyではちゃんと動かない。
セッションを閉じる前に例外が発生すると、セッションファイルがロックされたまま閉じられずに残るから、次にアクセスされたときにセッションファイルが開けずにはまった。

>>378-379
春休みだなあ。>>1をよく読めな。
381デフォルトの名無しさん:2007/04/10(火) 08:34:25
ごめん、>>377-378だった
382デフォルトの名無しさん:2007/04/10(火) 11:13:44
一発で読めない程度の複雑さの正規表現を変数に入れとくことにしました
たとえばHTMLからAmazonのURLをscanして取り出すときに使う正規表現です

 ・ re_amazon_url
 ・ amazon_url_re
 ・ re_scan_amazon

どんな変数名がわかりやすいっすかね
383デフォルトの名無しさん:2007/04/10(火) 13:26:39
>382
俺なら一番目。
好みで言えばre_ではなくregex_だが、まあ分かればいいわな。
384MoonWolf ◆MoonWdLnkQ :2007/04/10(火) 13:38:31
RE_Amazon_URL
385デフォルトの名無しさん:2007/04/10(火) 15:12:21
scanは違うよな。
正規表現は「対象を一言で言い表したもの」に過ぎないわけで、
scanはその正規表現を使う側の視点なんだから。
386デフォルトの名無しさん:2007/04/10(火) 15:20:07
標準rssパーサーを使用して"http://pickup.yahoo.co.jp/rss/index.xml"
の最新記事のみを取り出したいのですが、
どうも初心者にわかり易い記事が見つかりません。
わたしは、記事URLかサンプルコードの記述を欲しています。

387デフォルトの名無しさん:2007/04/10(火) 15:50:58
>>386
「ruby rss」でぐぐれ。最初のページにチュートリアルがある。
以下サンプルコード

#$KCODE = 'utf8'
require 'open-uri'
require 'rss'

url = 'http://pickup.yahoo.co.jp/rss/index.xml'
s = open(url) { |f| f.read() }
rss = RSS::Parser.parse(s, false)
item = rss.channel.items[0]
puts "title: #{item.title}"
puts "link: #{item.link}"
puts "description: #{item.description}"
388デフォルトの名無しさん:2007/04/10(火) 16:15:01
>>374
こっちは-2で動いたよ。環境:MacOS X 10.4, Ruby 1.8.6
s = ''
File.open(filename) do |f|
  f.seek(-2, IO::SEEK_END)
  until (c = f.getc) == ?¥n || c == ?¥r
    #puts f.pos
    s << c.chr
    f.seek(-2, IO::SEEK_CUR)
  end
end
puts s.reverse
389386:2007/04/10(火) 16:52:41
>>387
ズバリ教えてくれてありがとう。
もし宝くじを買う習慣がないのなら、次回に二枚買ってみてね。
390デフォルトの名無しさん:2007/04/10(火) 17:03:45
>>382
re_ ってつけるのも本質的にはどうよって感じはするけどな

マッチしたあと何が残るのかがわかるような名前にする…と思う
scanナントカ とか ナントカsplit とかは悩みたくない時に時々使う

「正規表現のとこがエディタで表示が横に長くなるから」というだけの理由で
「html.scan(re)」とかにして意味もなく変数 re に囲い出すこともあるがよい子は真似してはイカン
391デフォルトの名無しさん:2007/04/10(火) 18:10:57
>>390
> 「正規表現のとこがエディタで表示が横に長くなるから」というだけの理由で

それ重要。よい子は x オプションを適切に使いこなします。
392デフォルトの名無しさん:2007/04/10(火) 21:14:07
すんません、質問です。
どっちともStringオブジェクトのはずなんですけど
URLに引数を渡した方は正規表現が使えません…
CGIがらみなんでアレなんですけど、何故なんでしょうか?

[コード]
------------------
require 'cgi'
Cgi = CGI.new

str = Cgi['str']
if str == ''
str = 'test'
end
Cgi.out{
#str.class.to_s
str[/es/]
}

script.rb → es
script.rb?str=test → 何も表示されない…

"str.class.to_s"でチェックすると
どちらも間違いなく"String"となっている。
393デフォルトの名無しさん:2007/04/10(火) 21:33:29
cgi[...] って同名パラメータの配列じゃね?
394392:2007/04/10(火) 21:35:53
>>393
str = Cgi['str'][0]

忘れてました…orz
ありがとうございました。
395デフォルトの名無しさん:2007/04/10(火) 21:40:20
でも、これで「Array」にならないのは何故??
Cgi['str'].class.to_s
396デフォルトの名無しさん:2007/04/10(火) 21:48:42
cgi.rbの[]の定義追いかけてたらわけわからんくなった。
397デフォルトの名無しさん:2007/04/10(火) 21:54:45
cgi[key]とやると、
まず該当名のパラメータ(配列) @params[key] を見付ける。
基本的にこの配列の先頭要素のStringが返るのだが、その前にこの
Stringに対してValueというモジュールのメソッドを特異メソッドして
定義し、また、@params[key] 配列をこの Stringに付随させてから返している。

Valueでは [] を定義しているので、[/REGEX/]という記法は本来の
Stringとは動作が変わってしまうようだ。
この[]によって、配列の残り部分にアクセスすることが可能になって
いる。

398デフォルトの名無しさん:2007/04/10(火) 22:19:28
というか、インスタンスを定数に入れるのやめようぜ…
399デフォルトの名無しさん:2007/04/10(火) 22:24:17
わかったような、わからないような…
とにかく面倒臭い事になってるという事はわかった。
400デフォルトの名無しさん:2007/04/10(火) 22:49:16
cgi[]で返ってくるのは確かに String だが、正規表現を引数に取れる
String#[]ではない別の[]が定義されてているので、元質問のコードは
思ったように動かなかった、ということだな。
401デフォルトの名無しさん:2007/04/10(火) 22:57:16
ふむふむ…
しかし紛らわしいなぁ…
それならいっそ別のクラス名にしてくれてた方がいいのに…
402デフォルトの名無しさん:2007/04/10(火) 23:00:36
これからパラメータにアクセスする時は
必ず、cgi[key][0] ってする事だね。
403MoonWolf ◆MoonWdLnkQ :2007/04/10(火) 23:51:11
cgi.rb読む人が増えているこの時期、またセキュリティホール
見つかるんじゃないか?

# cgi.rbよりwebrick/cgi.rbのほうが分かりやすくていいなぁ
404デフォルトの名無しさん:2007/04/11(水) 00:23:28
cgi.rb はなにか鶴の一声で絶滅させないといかんと思う
今まで本当によく頑張ったが、いかんせん安普請だ
表現は酷だが、飛び立つには足かせになりかねん
405デフォルトの名無しさん:2007/04/11(水) 00:31:52
おれもそう思う。cgi.rbはとってもお世話になったが、
あちこちに破綻がありすぎる。

がこれを前提にしているライブラリがたくさんあることも事実なんだよね。
葬り去るにはあまりにも影響がでかい。
406デフォルトの名無しさん:2007/04/11(水) 00:38:23
クロージャのありがたみって実際なんなんでしょ?
java界隈にいても、ruby勉強しててもクロージャのありがたみを布教してくれる方が多いのですが、いまいちよくわかりません
それと、rubyのクロージャって他とは何か違うのですか?
407デフォルトの名無しさん:2007/04/11(水) 07:50:00
>>379-380
ありがとうございました
408デフォルトの名無しさん:2007/04/11(水) 09:21:51
>>406
Javaのクロージャってなーに?
Java7の話?
クロージャはクロージャでしょ。
409デフォルトの名無しさん:2007/04/11(水) 10:52:35
C#やDelphiでGUIアプリ組んでイベントハンドラ書きまくってればその恩恵を受けることが出来るかもな。
410デフォルトの名無しさん:2007/04/11(水) 11:59:38
コンソールでメニューを作るライブラリってないでしょうか?
w3mのオプション画面のcharsetの設定でやってるような
メニューを作りたいんですが、かなり大変そうなんで…
411デフォルトの名無しさん:2007/04/11(水) 12:09:01

 ま た 端 末 制 御 か

保証はしないが curses でぐぐれ
412デフォルトの名無しさん:2007/04/11(水) 12:25:52
CGI.paramsとCGI.escapeHTMLとCGI.encodeしか使ってない

ソースからそこだけコピペしたら全体の起動時間短縮できるかな
413デフォルトの名無しさん:2007/04/11(水) 16:04:44
Time型って2038年以降扱えないはずだけど、
サーバーが64bit版なら機能したりする?
2038年以降も入ったかいう報告があるんだけど。
OS依存なのかな、ここの仕様は。
414デフォルトの名無しさん:2007/04/11(水) 16:09:22
>>413
まずはリファレンスマニュアル見れと。

> Time オブジェクトが格納可能な時刻の範囲は環境によって異なります。
415デフォルトの名無しさん:2007/04/11(水) 16:15:08
本当にごめんなさい。なんで読み落としたんだろう・・・
416デフォルトの名無しさん:2007/04/11(水) 21:30:25
URL踏んだ人のIPをひたすら晒していくCGIってどう書けばいいの?
417デフォルトの名無しさん:2007/04/11(水) 21:55:43
#!/usr/local/bin/ruby
puts "Content-Type: text/plain\n\n#{ENV['REMOTE_ADDR']}"
418デフォルトの名無しさん:2007/04/11(水) 21:57:53
USER_AGENTとかも表示すればワンクリサイトを作るのも簡単だねっ。

419デフォルトの名無しさん:2007/04/11(水) 22:16:15
ワンクリといえば、昔(90年代)
ダイヤルアップ接続が普通だった時代
知らぬ間にQ2に接続されて、法外な料金請求された苦い過去を思い出す。
知識もないのにエロサイト見てた自分が悪いんだけどw
420デフォルトの名無しさん:2007/04/11(水) 22:17:54
#!/usr/local/bin/ruby
require 'cgi'

CGI.new.out{'HTTP'}
421デフォルトの名無しさん:2007/04/12(木) 01:41:20
>>408
そうですSE7の話です
自分はよくわかっていませんが

どっかにクロージャのありがたみについて詳しく解説しているページないかにゃ?
rubyのコードが付いてればなおありがたい
422デフォルトの名無しさん:2007/04/12(木) 10:01:52
>>421
ttp://capsctrl.que.jp/kdmsnr/wiki/bliki/?Closure

Javaで単純に考えると、メソッドを1個だけ持つインタフェースは軒並クロージャで置き換え可能だと思うが型はどうなるんだか。
クロージャを受け取れるメソッドと、クロージャを呼び出すときの引数と、返り値も型が欲しいな。

クロージャで欲しいのは、ブロックによる名前空間の分断、クロージャ自体の可搬性、変数束縛、あたりか。
変数束縛以外は匿名クラスと一緒と思う。コンストラクタかセッタで代用は可能だが…。
http://www.itmedia.co.jp/enterprise/articles/0703/29/news069.html
今までのAPIを無視していいなら、関数ポインタを導入すればいいのかもしれない。

(new File("/foo/bar")){|File f| new StringTokenizer(new FileReader(f)){|StringTokenizer t| switch(t.next()){...}}}
型付きRubyか。
423デフォルトの名無しさん:2007/04/12(木) 14:14:06
.rbっていう拡張子がタイプしにくくて嫌なんだけど、みんなは気にならないの?
424デフォルトの名無しさん:2007/04/12(木) 14:24:46
5分ほど息を止めてみるともっと楽になるよ
425デフォルトの名無しさん:2007/04/12(木) 14:44:10
どうもRubyコミュニティはいかんな。
ちょっとでもスタイルに疑問を呈されると、寒くてネチャネチャしたリプライが来る。
426デフォルトの名無しさん:2007/04/12(木) 15:39:52
まだ拡張子つけてるのかよ。
shebangとemacs modeで児童判別させるのがプロ
427デフォルトの名無しさん:2007/04/12(木) 16:06:01
>>426
Rubyスクリプトかどうか確かめるのにわざわざファイルの本文にアクセスさせる気?
アホくさ

ファイル先頭に128バイトくらい確保して判別するほうがマシだ
428デフォルトの名無しさん:2007/04/12(木) 16:19:37
>>422
この前D言語スレでそんな妄想をみんなでしてたぜ
429デフォルトの名無しさん:2007/04/12(木) 19:37:47
>>423
逆にどんな拡張子が良いんだ?
.rbyとかだったら俺泣いちゃうぞ
430デフォルトの名無しさん:2007/04/12(木) 20:32:05
.omaz
431デフォルトの名無しさん:2007/04/12(木) 20:37:34
>>429
あのさ、".rb"に難があるかどうかという以前の問題として、
タイプの話をしてるときに元の字をそのまま残した例を挙げてもなんにもならないだろう。
432デフォルトの名無しさん:2007/04/12(木) 21:08:12
左人差し指を上下に動かしてタイプするのが面倒だという話なので

  .ff

とか

  .jj

とか
そういうのが望まれてるんだと思われる
433MoonWolf ◆MoonWdLnkQ :2007/04/12(木) 21:10:22
>>423
気にしようが気にしまいが.rbから他の拡張子に変わることはないだろう?
画期的に打ちやすい拡張子をみつけて啓蒙していくしか道はないだろうな。
とりあえずタイプしやすい拡張子として.fってのはどうかな?
.xrbは打ちづらくて挫折したw
434デフォルトの名無しさん:2007/04/12(木) 21:34:47
打ちやすさだけならruのほうが上だけど、俺の感覚だとbが無いと締まらない。
まぁplのほうが打ちにくいし、rbで十分だな、俺は。

>>432
あんたbを人差し指でタイプするの?
435デフォルトの名無しさん:2007/04/12(木) 22:17:13
>>434
Querty配列では 4 R F V と 5 T G B の列は左手の人差し指でタイプするものだが。
436デフォルトの名無しさん:2007/04/12(木) 22:18:08

   ど う で も い い
 
437デフォルトの名無しさん:2007/04/12(木) 22:29:18
.r
438デフォルトの名無しさん:2007/04/12(木) 22:55:34
どうでもいいことに口挟むためにわざわざ
スペース右スペース右スペース右スペース右スペース
ってお前・・・
439デフォルトの名無しさん:2007/04/13(金) 00:07:13
rbよりもrubyの方がリズミカルに打てて気持ちいいと思う
440デフォルトの名無しさん:2007/04/13(金) 00:26:52
>>439
確かに。
ruby って打つときはタ、タンって感じだよな。
perlはタタタンでpython はタ、タ、タタン。

つーかpython打ちにくすぎ。
441デフォルトの名無しさん:2007/04/13(金) 00:31:07
>>440
その三つの中では ruby が一番打ちやすいな。
442デフォルトの名無しさん:2007/04/13(金) 00:35:33
左右交互なのも打ちやすさに影響してるかな
443デフォルトの名無しさん:2007/04/13(金) 00:53:45
質問なんですが、rubyでスレッド5個くらい作って、net/httpやopen-uriで複数の大きなファイルをダウンロードすると、CPU使用率が100%回りっぱなしになってしまいます。
巷のダウンロードソフトは複数スレッドでも極めて低いCPU使用率でダウンロードし続けることができることを考えると、できればrubyでもそうあってほしいと思います。
どうすればもっと静かにダウンロードさせることができるでしょうか?
環境はwinxpでruby1.8.5です。
444デフォルトの名無しさん:2007/04/13(金) 01:05:40
なんでCPU使用率が上がるかを考えればいいんと違うかな
445デフォルトの名無しさん:2007/04/13(金) 01:08:52
Windowsのスレッドだからかね

net/httpやらopen-uriやらはデータをメモリに全部食うような気がする
446デフォルトの名無しさん:2007/04/13(金) 01:39:07
ユーザースレッドだからね
447デフォルトの名無しさん:2007/04/13(金) 05:12:58
>>443
WindowsのスレッドとRubyのスレッドは根本的に異なっているので、解決は難しいかも。
簡単なサンプルコードをみせてくれないか?
448MoonWolf ◆MoonWdLnkQ :2007/04/13(金) 06:50:12
スレッドじゃなくて別プロセスにしてDRbでプロセス間通信させたほうが
軽いんじゃないか?
449デフォルトの名無しさん:2007/04/13(金) 09:37:17
.by

…もっとPythonぽいのないかな?
450デフォルトの名無しさん:2007/04/13(金) 09:50:17
.(ry
451デフォルトの名無しさん:2007/04/13(金) 09:50:51
隔離スレでやれ
452デフォルトの名無しさん:2007/04/13(金) 10:33:29
つーか、.rb で十分打ちやすい。
453デフォルトの名無しさん:2007/04/13(金) 10:55:57
PerlのXML::Simpleのドキュメントは
man XML::Simple
で見れます。
rexml
のドキュメントを同じようにみるにはどうすればよいでしょうか?
ちなみに、
locate man | grep -i rexml
で何もひっかかりませんでした。
454デフォルトの名無しさん:2007/04/13(金) 11:04:58
針がいっぱいついてそうなレスだな
455デフォルトの名無しさん:2007/04/13(金) 11:29:02
自力で作成とインストールが必要だが日本語マニュアルが表示されるのがReFe
ttp://www.ruby-lang.org/ja/man/?cmd=view;name=ReFe

もしかしたらインストールパッケージが存在するかもしれないのが英語マニュアルのみのri
ttp://www.ruby-lang.org/ja/man/?cmd=view;name=ri

スクリプト言語のライブラリやらなにやらがmanで表示されること自体が特殊事象
456453:2007/04/13(金) 12:38:33
>>455
ありがとうございます。
インストールしました。便利になりました。

>スクリプト言語のライブラリやらなにやらがmanで表示されること自体が特殊事象

そうですねW
457デフォルトの名無しさん:2007/04/13(金) 13:08:06
奇妙なクセはあるけど,それさえつかめば十分 普通に使えそう
ttp://www.okisoft.co.jp/esc/prolog/in-ruby.html
458デフォルトの名無しさん:2007/04/13(金) 15:08:03
>>440
ruby あたたあたあた
perl あたたたた
python あたあたあたたたた

俺のながでばperlがぶごべろばっ
459デフォルトの名無しさん:2007/04/13(金) 16:52:02
Rubyを貶した文章は色々あったけど、中でも嫌味度ナンバーワンじゃね?>>457
460デフォルトの名無しさん:2007/04/13(金) 16:57:36
そうですね
461デフォルトの名無しさん:2007/04/13(金) 17:19:05
誹謗のためにあさって向いてないぶん悪質だな!


っていうか嫌味っていうか普通に使いにくいわかりにくいとこに文句つけてるだけじゃん…
Rubyは完璧だと言ってる人ってそうそう居ないと思うし非難のための捏造敵だと思うぞ
462MoonWolf ◆MoonWdLnkQ :2007/04/13(金) 17:25:17
回避策とか代替案があるとか、改善できるところならいいが
「もう直しようがないだろう」みたいなとこをつつくのはちょっとな。

# そういう意味ではM17Nとかcgi.rbとかRuby2.0仕様とか
# そういう点を付くのは叩く側としてはコストが低くて良いねw
463デフォルトの名無しさん:2007/04/13(金) 17:43:03
日本人は足の引っ張りあい大好きですから!!!!!!!!!!!!!!!!!w
464デフォルトの名無しさん:2007/04/13(金) 17:43:57
ここもDelスレみたいになってきたな。
住民もかぶってそうだしある意味当然か。
465デフォルトの名無しさん:2007/04/13(金) 17:45:56
Delスレなんて言われてもわかんぽっぽ
466デフォルトの名無しさん:2007/04/13(金) 17:57:32
RubyにはPerlのリファレンスのようなものありますか?
467デフォルトの名無しさん:2007/04/13(金) 18:00:03
Perlのリファレンスってなに?

電子的なマニュアル?
網羅的で薄い書籍?
体系化されたマニュアルシステム?
468デフォルトの名無しさん:2007/04/13(金) 18:10:58
あ、ごめんなさい。
たとえばPerlで、ハッシュに対するリファレンスは
%EtoJ = { 'dog' => '犬' }
に対して
$hush_ref=\%hush
で定義されるものです。
配列、スカラーに対しても同じように定義されます。
関数に渡すときにリファレンス渡しをするとCのポインタのように便利です。
469デフォルトの名無しさん:2007/04/13(金) 18:27:07
>468
Rubyの変数が保持するのは参照だから
ハッシュを変数に入れてるならそのまま渡せばOK

ただし変数に再び代入すると参照先が書き変わってしまうので
内容を更新する場合は各要素にアクセスするかreplaceを使うこと
470デフォルトの名無しさん:2007/04/13(金) 18:46:11
>>462
rubyのイテレータが打たれ弱いというのは直しようがないんですか?
471469:2007/04/13(金) 18:50:14
# 例
def func(h)
  h['key1'] = 'Good'
  h['key2'] = 'bye'
  h = {'key1'=>'How', 'key2'=>'much'} # ここで h の参照先が変わり元の hash にアクセスできなくなる
  h['key2'] = 'many'
end

hash = {'key1'=>'Hello', 'key2'=>'world'}
func(hash)
p hash

# 結果 => {"key1"=>"Good", "key2"=>"bye"}
472MoonWolf ◆MoonWdLnkQ :2007/04/13(金) 19:17:06
外部イテレータをほとんど標準で提供していなかったあたりが
厳しいなぁ。
内部イテレータから外部イテレータの書き換えは、大変だしねぇ。
Enumerable#zipって使えたことある?

メソッド名の衝突が起こりはじめたらヤバイ。
Classboxだかselector namespaceって実装されるのいつよ?
473MoonWolf ◆MoonWdLnkQ :2007/04/13(金) 19:19:55
>>469
Hash#update(other)も使えるね。
キーの削除ができないけど更新と追加はできる。
474468:2007/04/13(金) 20:38:28
>>469
なるほど。わかりました。
関数の引数にした場合も参照が渡されるんですね。

>>473
参考になりました。ありがとうございます。
475デフォルトの名無しさん:2007/04/14(土) 01:29:09
>>471
…これ地味にヤバくね?

適当にハッシュでデータを保持してて
適当に長いメソッド内の途中でfuncに別途切り出しして
適当にハッシュだから切り出したメソッド内ではhやhashでいいやとか

そういうことってときどきあったりしない?
476MoonWolf ◆MoonWdLnkQ :2007/04/14(土) 01:35:14
>>475
変数hの参照先が変わるのはfuncメソッドのスコープの中だけ。
呼び出し元の変数hashの参照先はかわらん。
replaceしたなら値が変わることはあるけどね。
477デフォルトの名無しさん:2007/04/14(土) 02:01:57
>>475
def func(h)
  h['key1'] = 'Good'           # h.id=111
  h['key2'] = 'bye'            # h.id=111
  h = {'key1'=>'How', 'key2'=>'much'} # hash.id=222
  h['key2'] = 'many'           # h.id=222
end

hash = {'key1'=>'Hello', 'key2'=>'world'} # hash.id=111
func(hash)
p hash                    # hash.id=111

 #=> 現在の「idが111」の内容、つまり key1 が 'Good' で key2 が 'bye' が表示される


途中に 「h = {'key1'=>'How', 'key2'=>'much'}」 があるから奇異に写るかもしれないけど、
いわゆる昔から言われてる参照に要注意という問題に過ぎない

h=Hash.new   # h.id=111
h={['one']=>'1'}  # h.id=222
478443:2007/04/14(土) 08:31:56
レスくれた皆さん、ありがとうございます。
返事遅れて申し訳ないです。

>>444
できれば、なぜCPU使用率が上がるのか知りたいです。

>>445,446,447
Winじゃ難しいっぽいですか・・・。

>>448
DRbですか。自分にはまだ難しそうですが、時間ができたら試してみます。
479デフォルトの名無しさん:2007/04/14(土) 08:40:24
>>478
だから自分で書いた簡単なサンプルコードをみせてみろといってるでしょ
話はそれからだ
480443:2007/04/14(土) 08:52:03
>>447
雰囲気だけですが、こんな感じです。
それぞれのスレッドは1つのファイルをダウンロードするのに専念させてます。
require 'net/http'; Net::HTTP.version_1_2
require 'uri'
require 'set'
def download url
 uri = URI(url); http = Net::HTTP.new(uri.host, uri.port)
 http.request_get(uri.path + '?' + uri.query) {|res|
  open(出力ファイル名, 'wb') {|out|
   res.read_body {|chunk| out.write chunk}
  }
 }
end
thr_set = Set[] # ダウンロード中スレッドを入れるためのSet
N = 5 # スレッドの最大個数
[ダウンロードするURL].each {|url|
 sleep(1) until thr_set.size < N # スレッドの個数が多すぎなくなるまで寝る
 thr_set << Thread.start {
  download url # ダウンロード
  thr_set.delete Thread.current # 終わったらSetから削除
 }
}
thr_set.each {|thr| thr.join} # メインスレッドが終了しないように、稼働中のスレッドを待つ
481デフォルトの名無しさん:2007/04/14(土) 10:17:59
>>477
前から気にはなっていたが面倒で放置してたバグがいっこ取れた

その問題は聞いてはいたんだが実地でピンと来るまでには至ってなかったみたい
482デフォルトの名無しさん:2007/04/14(土) 12:26:30
class A
  def initialize(h); @h=h; end
  def run
    B.new(@h)
    C.new(@h)
  end
end

class B
  def initialize(h); @h=h; add; end
  def add
    @h['B']='Bだよ'
  end
end

class C
  def initialize(h); @h=h; add; end
  def add
    @h['C']='Cだよ'
  end
end

h={'A'=>'Aだよ'}
A.new(h).run
p h

#=> {"A"=>"Aだよ", "B"=>"Bだよ", "C"=>"Cだよ"}

がーん
483デフォルトの名無しさん:2007/04/14(土) 12:28:02
どこががーん?
484デフォルトの名無しさん:2007/04/14(土) 12:44:26
クラス B や クラス C で @h を扱う際に、「元の」 h には影響しないイメージがあるんだろ
新規インスタンス内で @h に「なった」時点で前とは別物、みたいな
どこのクラスで"代入"しても元の値が変わるなんて昔の言語のグローバル変数みたいな動作だし

気を遣いたくない、イメージ通りの動作をさせたいのなら initialize のときに必ず dup しておくようにするしかないな
485デフォルトの名無しさん:2007/04/14(土) 13:03:49
>>484
はいはい、そうです

h={'A'=>'Aだよ'}
h=A.new(h).run
p h

みたいに再代入になってる(A.runの最後でreturn @hとか書いてある)ならわかるんですが、
別オブジェクトの別メソッド実行しただけなのにhが変わるってなにそれ、みたいな

みんなこの動作に依存してクラスとかメソッドとか書いてるのかな
慣れて判断するのにしばらくかかりそう
486デフォルトの名無しさん:2007/04/14(土) 13:17:57
変数とオブジェクトの区別が付くようにならないとね。
487デフォルトの名無しさん:2007/04/14(土) 13:19:31
>>486
それは関係ないと思う
488デフォルトの名無しさん:2007/04/14(土) 13:22:45
>>485
別にメソッドの呼び出し前後で、hは同じオブジェクトを指してるんだから問題ないじゃん。
ただオブジェクトの内容が変わっただけの話で。
489デフォルトの名無しさん:2007/04/14(土) 13:34:09
>>487
関係なくもないとは思うが、変数とオブジェクトの区別をつけただけでは
これは間違うような気がする

 巷の値の代入と同じ記号かつ同じ文法だが
 実際は代入(コピー)ではなくてただのオブジェクトの参照記号である

というような理解をしないとどうにもならないと思う
問題は = の役割かと思われ
490デフォルトの名無しさん:2007/04/14(土) 13:40:55
>>485
あー危惧は理解した

 hash={てきとうな内容}

 不慣れなクラス::不慣れなメソッド(hash)

 p hash #=> hashの中身が変わってる…

こういうことが起こると嫌だなってことか
491デフォルトの名無しさん:2007/04/14(土) 13:45:14
そんなあなたに
つ freeze
492デフォルトの名無しさん:2007/04/14(土) 13:49:42
>>491
can't modify frozen hash
493デフォルトの名無しさん:2007/04/14(土) 13:55:38
例外のおかげで、変更して欲しくないものが勝手に変更されそうになっている危険が検出されたってわけね
494デフォルトの名無しさん:2007/04/14(土) 14:21:52
てゆーか、cloneして渡すんじゃ駄目なのか?
495デフォルトの名無しさん:2007/04/14(土) 14:40:55
ハッシュが巨大じゃないなら別にいいんじゃね?
まあ現実問題、どっかのライブラリのメソッドで、ハッシュを引数にとって中で変更するようなものはまずないし、しかもどっかのメソッドに渡したハッシュを後で使うシチュエーションもほとんどない。
496デフォルトの名無しさん:2007/04/14(土) 15:23:40
> どっかのメソッドに渡したハッシュを後で使うシチュエーションもほとんどない
↓以下死屍累々
497デフォルトの名無しさん:2007/04/14(土) 18:57:16
もうぼろぼろです。
498デフォルトの名無しさん:2007/04/14(土) 22:50:13
なんか>>200の再来だな
499デフォルトの名無しさん:2007/04/14(土) 23:01:01
>>495はハッシュをどういう用途で使ってるのかちょっと気になる
500デフォルトの名無しさん:2007/04/15(日) 00:02:32
>499
いわゆる「名前付き引数」専門、とか
501デフォルトの名無しさん:2007/04/15(日) 00:31:55
まあライブラリのメソッドでは、名前付き引数とコンテナの生成くらいしかハッシュを渡す機会もないかもな
502デフォルトの名無しさん:2007/04/15(日) 00:36:21
生のハッシュは
日常の気合入れたくないスクリプトや
自作でごそごそするでかいだけのスクリプトで
えいやーと使うのに合ってるな
503デフォルトの名無しさん:2007/04/15(日) 02:02:55
hash = {}
while gets do
  hash[$_] = true
end
puts hash.size
504デフォルトの名無しさん:2007/04/15(日) 02:19:59
uniq | wc -l
ってこと?
505デフォルトの名無しさん:2007/04/15(日) 03:26:02
しつもん。
hashにkeyがあったときに起きる例外ErrorTestが起きたときの
hashの中身を知りたいです。

class ErrorTest < StandardError
  attr_accessor :data
end

begin
  hash={'key'=>'value'}
  if hash.has_key?('key') then
    err=ErrorTest.new('適当なエラーメッセージ')
    err.data=hash
    raise err
  end
rescue ErrorTest => ex
  puts "例外発生時のデータは#{ex.data.inspect}です!"
end

これで問題ないでしょか。
506デフォルトの名無しさん:2007/04/15(日) 04:06:21
STDIN(,STDOUT,STDERR)と$stdin(,$stdout,$stderr)の使い分けがいまいちピンとこないのです。
- STDIN が定数で $stdin が変数なのはわかる
- 定数には再代入できなくて変数には再代入できるのもわかる
- 標準入力先を変更したければ STDIN.reopen(...) なり $stdin = IO.open(...) すればよい
マニュアル読むと「子プロセスにもリダイレクトの影響を与えたたいという要件がなければ」
どっちでもよさげなかんじなのですが… $stdin にファイルじゃないオブジェクトを代入する(これはSTDINではできないことですよね)と嬉しいことがある?
507デフォルトの名無しさん:2007/04/15(日) 04:49:29
>>505
別にそれでいいとは思うけど、ErrorTest の initialize で @data を初期化する方がいいんじゃないかと思ったりもする。
508デフォルトの名無しさん:2007/04/15(日) 09:45:47
raiseの第1引数は
・文字列もしくは
・exceptionメッセージに対して例外を返すオブジェクト(例外クラス)だな。

Exceptionインスタンスもexceptionメッセージを持っているが、
自身と同じインスタンスを複製して返すので二度手間になるから
raise ErrorTest, "メッセ" がオススメ。


509デフォルトの名無しさん:2007/04/15(日) 09:47:00
失礼。例外オブジェクトがメッセージ以外に属性を持つなら、
インスタンスを作って渡すべきだな。
510デフォルトの名無しさん:2007/04/15(日) 13:45:32
x = [1, 2, 3, 4, 5]
p x
p x.inject(0) {|result, x| result + x}
p x
これを実行すると、以下が出力されました。
[1, 2, 3, 4, 5]
15
5
そこで、以下のように思ったのですが正しいでしょうか?
1. ローカル変数とブロックローカル変数は同じ名前空間を共用する
2. defでメソッドを定義するときは定義ごとに別の名前空間が用意される
511デフォルトの名無しさん:2007/04/15(日) 13:49:45
ブロックで使われる前に名前が登場したローカル変数は、
ブロック内でそのまま見える。
ブロック内で初めて登場したローカル変数はブロック内のみで有効。

実はこの仕様はRubyの混乱を呼ぶ点の代表選手で、将来的には変わる可能性がある。
512デフォルトの名無しさん:2007/04/15(日) 14:09:01
考え分けるの面倒だから、if の結果で変数の初期値決めるときにも
if 文の前に str=String.new とかいちいち書いてる
513デフォルトの名無しさん:2007/04/15(日) 14:12:40
ブロック内から外側が見えるようになってるのは、クロージャとつじつまを合わせるためだろうね。
でも、ブロックの引数だけはブロック内ローカルであってほしいと思ったことは何度かあるな。
514デフォルトの名無しさん:2007/04/15(日) 14:26:22
質問

 「実行中の自分のファイルパスあるいはディレクトリパス」

を知る方法はありますか?
別なディレクトリでスクリプトを実行したときも
自分と同じディレクトリにあるファイルをrequireしたいです

ふつーに require 'lib.rb' と書いただけでは、
「カレントディレクトリにlib.rbはありません」というエラーになります
515デフォルトの名無しさん:2007/04/15(日) 14:31:37
>>514
$0
$PROGRAM_NAME (ruby 1.8 feature)
516デフォルトの名無しさん:2007/04/15(日) 14:31:40
>>512
if~else~endのどの√でも確実に何かを代入するのなら、newせんでも、
str = nil でいいぜ。

>>514

$:.unshift(File.dirname(__FILE__))
517510:2007/04/15(日) 14:36:45
>>511-513
Rubyはスコープがかややこしいですね。有難うございました。
518デフォルトの名無しさん:2007/04/15(日) 14:39:49
>>507
class ErrorTest < StandardError
def initialize(msg='')
@message=msg
@data=Hash.new
end
attr_accessor :data, :message
end

こうですかよくわかりません!
なんか途端に書くの増えましたな

うん、なんとかします多謝
519デフォルトの名無しさん:2007/04/15(日) 15:07:50
> 実はこの仕様はRubyの混乱を呼ぶ点の代表選手で、将来的には変わる可能性がある。

そして新たな混乱を呼ぶ。
520デフォルトの名無しさん:2007/04/15(日) 15:08:40
>>514
オプションとかRUBYLIB環境変数でlib.rbのパス渡すんじゃだめなん?
521デフォルトの名無しさん:2007/04/15(日) 15:30:18
コードアシストしてくれる開発環境ってないんでしょうか?
522デフォルトの名無しさん:2007/04/15(日) 15:41:45
>>513
ちょっと確認。
ブロック内で使って変数は、ブロックローカルなのに、
ブロック内引数は、外側からも見えるの?
523デフォルトの名無しさん:2007/04/15(日) 15:53:54
>522
irb(main):001:0> a = 1
=> 1
irb(main):002:0> 1.times{ a = 0 }
=> 1
irb(main):003:0> a
=> 0
irb(main):004:0> 1.times{ b = 0 }
=> 1
irb(main):005:0> b
NameError: undefined local variable or method `b' for main:Object
from (irb):5
aは外の変数を参照、bはブロックローカル。
このルールはブロック引数も同じ。

こういう挙動がややこしいから、ブロックローカルのルールを変更しようという話が出ている。
524デフォルトの名無しさん:2007/04/15(日) 17:52:36
>>523がまったく自然だと思うのは俺がruby脳に侵されているせいか?
525デフォルトの名無しさん:2007/04/15(日) 18:16:18
いや、仕様上はある程度は自然で直感的だと思う

ブロックかどうか判別しにくい文とかがたくさんあるのが原因なのかも
each do 〜 end はブロックだけど if 〜 end はブロックじゃないとか
526デフォルトの名無しさん:2007/04/15(日) 18:44:48
>>480
試してみたけど、ふつうにうまく動いたよ。
CPU利用率が100%になるなんてことはなかった。
環境:MacOS X 10.4 Tiger, Ruby1.8.6, intel mac
527524:2007/04/15(日) 18:49:52
>>525 納得。たしかにそれはやっかいだ。
528デフォルトの名無しさん:2007/04/15(日) 18:52:41
>>525
おれは、どちらかというと門外漢なんだけど、むしろ、そっちをどうにかしてほしいと思う。
529デフォルトの名無しさん:2007/04/15(日) 19:00:40
>>480
もとの>>443をみると、Windowsの話だったねごめん。
でもRubyのスレッドはユーザーレベルスレッドだから、OSに関係なく動作するはずだな。
Macでうまくうごくなら、Windowsでも同じように動くはずなんだが。
530デフォルトの名無しさん:2007/04/15(日) 19:11:10
>>518
せっかくStandardErrorをけいしょうしているんだから、それを使わないと。
class ErrorTest < StandardError
 def initialize(msg='', data=nil)
  super(msg)
  @data = data
 end
 attr_accessor :data
end

err = ErrorTest.new('foobar', 123)
p err.message #=> "foobar"
531デフォルトの名無しさん:2007/04/15(日) 19:12:08
>>513
>でも、ブロックの引数だけはブロック内ローカルであってほしいと思ったことは何度かあるな。

はげどー
532443:2007/04/15(日) 23:40:44
>>526
わざわざ試してくれたんですか。どうもありがとうございます。
手元のPCはノーパだしCeleronだからかもしれないですけど、自分のとこだと以下のようになりました。
スレッド1個 → 0〜20%、スレッド2個 → 10〜40%、スレッド3個 → 40〜80%、スレッド4個 → 60〜90%、スレッド5個 → 70〜100%、スレッド6個 → 100%
マシンの性能がかなり色濃く出てしまうのかもしれないです。
近頃はハイレベルなハカーはみんなMAC使ってるのでうらやましいっす。
533デフォルトの名無しさん:2007/04/16(月) 02:29:48
>>511,517,519

もう変わってる。

c:\home>ruby -v inj.rb
ruby 1.9.0 (2007-03-05 patchlevel 0) [i386-mswin32_71]
warning: shadowing outer local variable - x
[1, 2, 3, 4, 5]
15
[1, 2, 3, 4, 5]

c:\home>ruby185 inj.rb
ruby 1.8.5 (2006-08-25) [i386-mswin32]
[1, 2, 3, 4, 5]
15
5
534デフォルトの名無しさん:2007/04/16(月) 02:33:57
もう変わってるじゃなくて、「1.9ではいまのところ変えてる」んじゃないのか?
それとも確定?
535デフォルトの名無しさん:2007/04/16(月) 03:33:48
Rubyで簡単な直線とか点とかが描画したいのですが、何か良い方法はありますか?
例えば、そういう事をするのに便利なGUIライブラリとか。
ウィンドウが簡単に出せて、その中に、単純な図形とかを描画できればいいのですが。
536デフォルトの名無しさん:2007/04/16(月) 03:44:43
>>534
ruby-dev 29861 と 29863 のやり取りみると確定のような気がするんだけど?
537デフォルトの名無しさん:2007/04/16(月) 03:47:16
Rubyをある程度覚えるとどんなことが出来るようになるのでしょうか?
大学の講義でRubyのさわりだけやったのでおもしろそうなことができるのであれば
このままRubyの勉強を続けてみようと思います。
538デフォルトの名無しさん:2007/04/16(月) 04:33:38
>>537
東大生?
539デフォルトの名無しさん:2007/04/16(月) 04:43:37
なんかブロックローカルの話、こんな風にも触れられてたみたいね
http://www.ruby-lang.org/ja/man/?cmd=view;name=ruby+1.9+feature#a2005-03-09
http://www.rubyist.net/~matz/20050309.html#p03

2年も前だったのか・・・
540デフォルトの名無しさん:2007/04/16(月) 08:11:41
>>535
GUIライブラリが欲しいなら
ruby-tk
wxruby
ruby-gnome2
libxm
あたり。

Graphicsライブラリがほしいなら
http://raa.ruby-lang.org/

http://rubyforge.org/
で「graphic」で検索してみて。
Flash用のライブラリもあったはず。
541デフォルトの名無しさん:2007/04/16(月) 09:09:39
>>532
それ、なんかスレッド関係なくない?
CPUの負荷が高いのは、Rubyのスレッドを使っているからじゃなくて、
単にRubyが遅いからだけのように見える。
速いマシンを借りてみて、同じように負荷が高くなるか実験してみるといいんだけど。
542デフォルトの名無しさん:2007/04/16(月) 09:31:33
STDINで使えるメソッドを調べたいのですが、マニュアルないですか?
リファレンスのSTDINのページ見ても、編集されてないみたいですが・・・
543デフォルトの名無しさん:2007/04/16(月) 09:46:24
>>542
p STDIN.class
を進める
544デフォルトの名無しさん:2007/04/16(月) 10:33:50
dictにはget(key, value)という大変便利なメソッドがあります。
dct = { 'foo':1, 'bar':2 }
dct.get('baz', None) #=> None

同じものがlistにないでしょうか。
lst = [1,2,3]
i = 4
lst.get(i, None) #=> None

今は
def getvalue(lst, i, value):
 if 0 <= i < len(lst):
  return lst[i]
 else:
  return value
という関数を定義しているのですが、標準でそういう関数があれば教えてください。
545デフォルトの名無しさん:2007/04/16(月) 10:34:21
ごめんなさい、誤爆でした。
546デフォルトの名無しさん:2007/04/16(月) 10:36:54
>>543
おお、IOですね。
そういう風に調べるのか・・・

Rubyリファレンスマニュアル - IO
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=IO
547535:2007/04/16(月) 11:30:14
>>540
情報どうもです!感謝いたします!
548デフォルトの名無しさん:2007/04/16(月) 15:29:12
>>543
p IO.methods.size
p STDIN.methods.size
は違うよ。
549デフォルトの名無しさん:2007/04/16(月) 15:39:17
>>548
そりゃ別のクラスのインスタンスなんだから違っていて当然。
550デフォルトの名無しさん:2007/04/16(月) 15:48:24
>>549
>そりゃ別のクラスのインスタンスなんだから違っていて当然。
だから>>542の質問に対して>>543は不親切じゃないか?って話なんだが。
551デフォルトの名無しさん:2007/04/16(月) 16:04:23
>>550
なんで? ていうか>>542は理解しているのに今更そんなことを言って何の意味があるんだ?
不親切ではあるまい。STDINが指している先のオブジェクトのクラスがわかれば
調べようがあるだろう。>>542が理解しているという意味はこのことだ。

それに、
> そりゃ別のクラスのインスタンスなんだから違っていて当然。
の意味がお前さんには理解できていないように見受けられるが。
552デフォルトの名無しさん:2007/04/16(月) 16:12:53
>>551
>>542は本当に理解してるか?理解してるなら良いけど、
IOクラスのメソッドが全部使えると思ってないか?
IOクラスに載ってないメソッドがあることわかってるか?
553デフォルトの名無しさん:2007/04/16(月) 16:16:06
>>552
あのさ
>p IO.methods.size
で得られるメソッドの数って、クラスClassのオブジェクトIOが持つメソッドの数なんだけど。
>p STDIN.methods.size
で得られるメソッドの数はクラスIOに属するオブジェクトが持つメソッドの数なんだよ。

ここまで言わないとわからない?
554デフォルトの名無しさん:2007/04/16(月) 16:54:01
>>553
それがわかっててなんでそんなに粘着するのかな?
IOとSTDINのメソッドは重なる部分が多いが完全には一致していない。
そしてIOにないメソッドがSTDINにはある。ここまでは良いよね?
>>542はIOではなくSTDINで使えるメソッドを調べたいんだから
>>542にとって>>548の書き込みは得になっても損はしないと思うんだが
なにがそんなに気に入らないんだ?
555デフォルトの名無しさん:2007/04/16(月) 17:10:30
間違えたなどということはあってはならんのだよ
たとえ無名での書き込みでもな
556デフォルトの名無しさん:2007/04/16(月) 17:46:43
「今この瞬間だけ世界の王になった気になって楽しんでるのに
俺の現実的な不完全性を指摘するなこの野郎」
ということでしょう。
557デフォルトの名無しさん:2007/04/16(月) 17:54:29
文字列中の特定の文字列(たくさん種類がある)を消したいです

 ・ 適当にgsubを連ねる
 ・ gsub1個に超長い正規表現

どっちが妥当でしょうか
558デフォルトの名無しさん:2007/04/16(月) 18:00:44
>>557
あーつまり

 str.gsub(/ABC/,'').gsub(/DEF/,'').gsub(/GHI/,'').gsub(/JKL/,'').gsub(/MNO/,'')



 str.gsub(/ABC|DEF|GHI|JKL|MNO/,'')


のどっちがいいかってことね

文句なしに後者
前者は正規表現作ってgsubして正規表現作ってgsubして正規表現作ってgsubしてが無駄

正規表現が長くて入り組んでてカッコばっかで超絶複雑で、
irbで試したら一発で落ちたとかいうのなら一考を要するけど
559デフォルトの名無しさん:2007/04/16(月) 18:09:42
STDIN.methodsにはIOクラスで定義されていないメソッドは1つもないけど、その辺は流れ的にあえて黙っておいたほうがいいのかな?
560デフォルトの名無しさん:2007/04/16(月) 18:17:42
>>559
どんな環境で使ってるんだ?
STDIN.openがあるのか?
それともIO.openが無いのか?
ちなみに俺のところでは
p IO.methods.sizeは94
p STDIN.methods.sizeは119あるぞ。
561デフォルトの名無しさん:2007/04/16(月) 18:21:29
str.gsub( Regex.union(/ABC/, /DEF/, /GHI/, /JKL/), "")
562デフォルトの名無しさん:2007/04/16(月) 18:22:55
>>560
頭を冷やせ
そして、
p IO.class, STDIN.class
しる
563デフォルトの名無しさん:2007/04/16(月) 18:23:47
>>560
そうですか。

p STDIN.methods.size
(0..2).each {|fd| p IO.new(fd).methods.size}
564デフォルトの名無しさん:2007/04/16(月) 18:24:29
クラスIO自体をselfとして呼ぶメソッド群と、
クラスIOのインスタンスをselfとして呼ぶメソッド群は、
当然違うわけだが。
565デフォルトの名無しさん:2007/04/16(月) 18:35:42
>>554
取り敢えず>>551

>> そりゃ別のクラスのインスタンスなんだから違っていて当然。
>の意味がお前さんには理解できていないように見受けられるが。

が理解できてないことはわかった…。
この程度の理解で偉そうに解説しないで欲しいものだ。

・IOはClassクラスのインスタンス
・STDINはIOクラスのインスタンス

ものが違うんだよ。たとえば

・''はStringクラスのインスタンス
・[]はArrayクラスのインスタンス

だったときに「''.methods.sizeと[].methods.sizeは違うよ!!!」と力説されても
「それは当然違うに決まってるじゃないですか」と答えるのと全く同じ意味で

>> そりゃ別のクラスのインスタンスなんだから違っていて当然。

と言ったんだけどな。粘着も何もお前さんが大嘘ついているから、
変な理解が流布しないように一所懸命間違いを正しているんだけどなあ…
566デフォルトの名無しさん:2007/04/16(月) 18:40:04
あと
p STDIN.methods.size, IO.instance_methods.size
をしてみることをお勧めする。
567デフォルトの名無しさん:2007/04/16(月) 19:02:53
>>562
飯食って頭が冷えた。
そして>>562-の言ってる通りの事を言ってるつもりが
まったく通じてないことがわかり落ち込んでいる。
違うものとわかってるから
ほらメソッド数が違うでしょ。だから違うものなんだよ。
と言ってるつもりだったのだが
同じものなのにメソッド数が違うのはおかしい
と言ってるととられていたのか。
568MoonWolf ◆MoonWdLnkQ :2007/04/16(月) 19:40:01
>>557
gsubでの処理の順番によって結果が違う場合もあるから一概には言えない。
"ADEFBGHIC"に対して>>558のgsub処理を行うと消したいはずの
ABCが残ってしまう。
569デフォルトの名無しさん:2007/04/16(月) 20:07:10
外野から失礼。
結局、>>548はなにがいいたかったの?
>>533,565が見ててすごく不憫だ。
570デフォルトの名無しさん:2007/04/16(月) 20:21:14
>>569
548も含めて全員「俺は全部きちんとわかってる。全部お前が悪い」っていいたいんだよ。
571デフォルトの名無しさん:2007/04/16(月) 20:23:49
>>570
>>548以下の間抜けキター
572デフォルトの名無しさん:2007/04/16(月) 20:38:54
>>569
>>542がSTDINのメソッドが知りたいって言ってるのに
STDINのクラスの見方を教えて
STDINがIOだとマニュアルの見方もわからない初心者が考える。
そこで>>548がメソッドの一覧の見方も教えてやれよ。
ほらIOとSTDINは違うだろ。似てるけど違うものなんだよ。
クラスはわかってるんだからあとは考えてね。
ってのを簡単に示したもの。
573デフォルトの名無しさん:2007/04/16(月) 20:43:20
>>567がわけわからん。
『俺の言ってることが誤解されて受け取られたようだ』といいたいんだろうけど、
それじゃあそもそもの>>548がどんな意図をもっていたのかわからん。
>>533,565の受け取り方が誤解というなら、>>548はどのように受け取ってほしかったんだ?

ここは初心者スレなのに、間違った回答や紛らわしい書き方が目立って困る。
しかもそれを指摘されたら逆切れしたり言い訳したり。おまえはTBSかと。
574デフォルトの名無しさん:2007/04/16(月) 20:49:43
>>552
> IOクラスのメソッドが全部使えると思ってないか?
> IOクラスに載ってないメソッドがあることわかってるか?

>>554
> IOとSTDINのメソッドは重なる部分が多いが完全には一致していない。
> そしてIOにないメソッドがSTDINにはある。ここまでは良いよね?

まあこの辺の発言も考慮すると、IO.methods.sizeとSTDIN.methods.sizeだけ比べてみて、「あれ、STDIN.methodsのほうが少し多いぞw」とか考えたのではないかと思われ。
少なくとも、これら2つが「似て非なるもの」ではなく、「全く別物」だということに気付いていない様子は伺われる。
575デフォルトの名無しさん:2007/04/16(月) 21:58:13
>>572

>>>542がSTDINのメソッドが知りたいって言ってるのに
>STDINのクラスの見方を教えて
>STDINがIOだとマニュアルの見方もわからない初心者が考える。

ここが謎。
あるオブジェクトが何のクラスのインスタンスなのか判れば、
そのクラスで定義されてるメソッドを見ればいいだろ。IOでいいじゃん。
STDINが参照するオブジェクトに特異メソッドなんて別に定義されてないし。


576デフォルトの名無しさん:2007/04/16(月) 22:57:41
なんか、俺の質問で荒れてる・・・('A`) (荒れてるわけじゃないのか?)
STDINは、IO派生してて別にメソッドもあるんですねぇ・・・


577デフォルトの名無しさん:2007/04/16(月) 23:07:02
ところで、別の質問いいですか?

<hoge moge="1234" hage="5678">・・・(以下長い文字列)
のmogeの1234(数字で可変)だけ置換するエレガントな書き方はないですか?

puts '<hoge moge="1234" hage="5678">・・・'.gsub(/(<hoge moge=")(\d+)(" hage=)/) { "#{$1}#{$2.to_i * 2}#{$3}" }

だと、(<hoge moge=")とか(" hage=)がなんか、しょーもないなーって感じなので
578デフォルトの名無しさん:2007/04/16(月) 23:13:41
>>577
HTMLに似てるのでHTML用語を使うけど、
そのmoge属性はhoge要素にしか出てこないの?
あと属性値を括るのはダブルクオートだけと仮定していいの?
579デフォルトの名無しさん:2007/04/16(月) 23:26:05
肯定後読み先読みでできるかも?
580デフォルトの名無しさん:2007/04/16(月) 23:56:31
>>577
puts '<hoge moge="1234" hage="5678">・・<hoge moge="1234" hage="5678">・'.gsub(/(<hoge moge="\d+" hage=)/) { $1.sub(/(\d+)/){"#{$1.to_i * 2}" }}
あんまりかわらないかな?
581デフォルトの名無しさん:2007/04/17(火) 00:59:40
C#からrubyを実行したいのですが、可能でしょうか?
(ruby_run();を実行したい)
ruby_run自体実行した事が無いので、勘違い入ってるかもしれませんが、分かる方お願いします。
582名無し@沢村:2007/04/17(火) 01:21:15
おみゃーらー♪
Rubyはつまらんぞー!
おみゃーたー、『肥えた語』つー言語があるの知ってる?
おりは知ってるよ。
おりがつくった言語よ。これからh『肥えた語』の時代よ。
URLはここよ↓
http://www.geocities.jp/hontamagod/
感想を頼むなー♪
583デフォルトの名無しさん:2007/04/17(火) 05:19:21
>>582
おっ久しぶりにみたな。
ずっと姿を眩ませてたみたいだけど。
584デフォルトの名無しさん:2007/04/17(火) 05:54:07
>>582
制限や奇怪な仕様が多すぎる…
これなら素直にCを使った方がいいような…
585デフォルトの名無しさん:2007/04/17(火) 10:11:27
俺はアドレス見た瞬間に要らないと思った
586デフォルトの名無しさん:2007/04/17(火) 11:00:44
REXML::Document.write("test.xml", 0)
でファイルに書き出すと、
#<NoMethodError: undefined method `write' for 53000968:Fixnum>
なエラーになるんだが、なんか情報ないですか?

環境:
win2000sp4
ruby 1.8.5 (2006-08-25) [i386-mswin32]
587586:2007/04/17(火) 11:03:42
ちょ、間違えた。省略しすぎた。。。orz

doc = REXML::Document.new(File.new("open.xml"), "r")
doc.write(File.new("test.xml", "w"), 0)

こんな感じで。
588デフォルトの名無しさん:2007/04/17(火) 12:20:10
>>578
すみません。HTMLで仮定しているだけで、
文字列のある域だけにまっちし、その文字列の一部だけを書き換えたいというのをあらわしています。

>>580
gsub二重構造ですか、なるほど、その手があるか・・・
589デフォルトの名無しさん:2007/04/17(火) 13:03:58
>>581
実行だけ6.0で作成したら良いんでない?
C#からはそのexeを実行する。
590デフォルトの名無しさん:2007/04/17(火) 22:02:53
>>587

REXML::Document.newの引数はStringかIOであってFileではないが……

doc = REXML::Document.new(File.open("open.xml", "r"))
doc.write(File.open("test.xml", "w"), 0)
なら保存されたぞ。

File.openの返値を変数に持ってないため、明示的にcloseできないので、
exitすることによってcloseさせないとバファリングされたままだな。
591デフォルトの名無しさん:2007/04/17(火) 22:05:04
うお、File は IOのサブクラスか!
592デフォルトの名無しさん:2007/04/17(火) 22:24:26
EXE化でmkexyとexerbの二つをDOSのバッチにしたいのですが
mkexy aaaa.rb
exerb aaaa.exy
をバッチの中身としたときにexerb aaaa.exyをやらないでバッチがおわってしまうのですが
続けて実行させるにはどうすればいいのでしょうか
593デフォルトの名無しさん:2007/04/18(水) 00:02:26
>>592
call mkexy aaaa.rb
594デフォルトの名無しさん:2007/04/18(水) 00:28:52
>593
ありがとううごきました!
ちなみに cmd/c mkexy aaaa.rb でも動いたのですが意味は同じなのかな。
そもそもなんで592だとmkexyはわざわざ次の命令をやらないように
作っているのでしょうか
595デフォルトの名無しさん:2007/04/18(水) 00:41:56
大昔にDOSが「現在実行中のバッチファイル」をスタックして
いなかった名残。バッチAから別のバッチBを呼ぶと、Aを実行中
だったという情報消えるのでBが終わった時点でバッチが終わる。
596デフォルトの名無しさん:2007/04/18(水) 00:43:28
DOSバッチファイルの制限だな

mkexyの実体はexeでもcomでもなくmkexy.batというバッチファイルだ(この認識最重要)
バッチファイル内で普通にバッチファイルを実行するように記述すると
「戻って」来ることができないようになってる
だから>>592では「戻って」こないで1行だけで終了してるわけ

戻って来て次の行を実行したい場合はCALLするのが普通

CMDで新しいシェル起動して実行してもいいけど
597デフォルトの名無しさん:2007/04/18(水) 00:46:10
>>594
> ちなみに cmd/c mkexy aaaa.rb でも動いたのですが意味は同じなのかな。
cmd /c だともう一個 cmd.exe のプロセスが起動する。
call だと呼び出しもとのバッチと同じプロセスで実行するので微妙に違う。

たとえば、呼び出したbatの中で環境変数とかを設定していると cmd /c だと
見えないけどcallだと見えるとか。

今回のケースならどっちでも大差ないと思うよ。
無駄にプロセスを起動しないcallでいいんじゃね。
598デフォルトの名無しさん:2007/04/18(水) 00:49:59
>>596
> mkexy.batというバッチファイルだ(この認識最重要)
んだなす

だからバッチファイルの書き方の基本くらいは学んでおくといい

……のか? 何年前の技術よって感じだが
WSHで置き換わると何年も前から言われてるが全ッ然そんな気配ないな
WSHの次のやつなんだっけ?
599デフォルトの名無しさん:2007/04/18(水) 00:53:43
>WSHの次のやつなんだっけ?

Vista にも搭載が見送られた PowerShell 。
こいつもバッチファイルを駆逐できるだけの利便性はない。
600デフォルトの名無しさん:2007/04/18(水) 01:15:30
スレ違いっぽくなってきたな。
601デフォルトの名無しさん:2007/04/18(水) 01:23:24
話題は閉じただろ
602デフォルトの名無しさん:2007/04/18(水) 10:07:24
class Log < ActiveRecord::Base
end
としていて、

Log.transaction {
いろんな処理
Log.update(id, { :layer_id => layer_id, :layer_name => layer_name })
いろんな処理
}
という処理があります。

たまに(頻繁に発生。必ずではありません)
#<ActiveRecord::Transactions::TransactionError: Transaction aborted>
なエラーにでて、

結果的に、
ruby/hoge.rb:212: [BUG] Segmentation fault
ruby 1.8.5 (2007-03-13) [i386-mswin32]
abnormal program termination

で終了してしまいます。
updateする際の値はエラーチェックしたあとなので、きちんと設定されています。
update_attribute('layer_id', layer_id)との違いもよくわかりませんが、
なんでエラーになるかわかりますでしょうか?
603デフォルトの名無しさん:2007/04/18(水) 14:49:53
>>598
> ……のか? 何年前の技術よって感じだが
mswin版のconfigureは今でもバッチだぞw
もっとも半分以上nmakeだがな。
604デフォルトの名無しさん:2007/04/18(水) 16:13:51
すいません。macOS10.3を使ってて、バージョン1.6.6から1.8.2にしたいんです。
ホームページのソースからインストールで、最後にパスワード入力を要求されるんですが
全角だと入力できても、半角だと入力できません。どなたか分かる方いますでしょうか?


605デフォルトの名無しさん:2007/04/18(水) 17:44:49
手強い
606デフォルトの名無しさん:2007/04/18(水) 21:09:19
>>602
BUGと出る場合、たいていユーザーは悪くない。
607デフォルトの名無しさん:2007/04/19(木) 01:21:42
JSONの勉強をする


…なにやら楽しそうだが利用側のJavaScriptの書き方が眠いし面倒だしでさっぱりわかんね
hashからsnippet経由でJSONに変換した時に限ってFirefoxでは動くのにIE6で動かね

きっとつまんない初心者な理由で動作してないだけなんだろうが見当つかねわけわからんもう寝る知らね
608デフォルトの名無しさん:2007/04/19(木) 01:27:31
そんなん言われても知らんがな

Rubyを普段使うようになってからは
JavaScriptはコピペの域を脱してなんとか自力で書けるようになったと思う
609デフォルトの名無しさん:2007/04/19(木) 08:31:22
ttp://blog.livedoor.jp/dankogai/archives/50812677.html
> まずは、DCONWAY先生の一言から。Loopに関する黄金則です。Perl以外でも有効。
> Reject As many iterations as possible, as early as possible.
> 繰り返しは排除せよ、それもなるべく早い段階で

ブロックつきメソッドが存在意義のRuby脂肪wwwwwwwwwwwwwwwwww


あとなんでもいいがloopとwhile trueの2通りあるのはやめて欲しい
610デフォルトの名無しさん:2007/04/19(木) 08:34:15
そこに書いてあるのはfor文をgrepみたいなリストに対してループする関数に
置きかえる話で、もろRubyならfor文(あまり使わんが)をイテレータに書き換え
る話に見えるんだが。
611デフォルトの名無しさん:2007/04/19(木) 08:47:20
これは、iteration をなんと訳すかによるな
「繰り返し」と正確に訳してしまうと for も each do も入っちまう

「数を数えるだけのループは本質的な枚挙に置き換えよ」ってことだろ
612デフォルトの名無しさん:2007/04/20(金) 09:07:22
grepみたいな挙動を自分で書くことができるのも、rubyの特徴の1つですよね
613デフォルトの名無しさん:2007/04/20(金) 10:26:10
普通の言語ならたいてい自分で書けると思うが
614デフォルトの名無しさん:2007/04/20(金) 10:36:09
なんでも「Rubyならではの素晴らしさ」になってしまうんですよ
Ruby信者のインナースペースでは
615デフォルトの名無しさん:2007/04/20(金) 10:50:56
>>614
「rubyの特徴」→「Rubyならではの素晴らしさ」
なんだ、捏造かこれ。
616デフォルトの名無しさん:2007/04/20(金) 11:09:27
煽り中失礼します
よく考えたらRubyにあんま関係ない質問です

「引数のHTMLデータ(String)を解析し、決まったフォーマットのHashを返す」メソッドがあります
Hashはbookdataという名前の変数に = で代入して利用することにします
bookdata = mymethod(html)
こんな感じです
ちなみにHashのキーは著者とか書名とか出版社とかで、
htmlの対象となるWebページはたくさんあってmymethodは何回も使います

mymethodの名前は何にすればわかりやすいですか?
hash、makehash、html2hash、makedata、parse、parseHTML、booklist、getbookdata
617デフォルトの名無しさん:2007/04/20(金) 12:41:34
html2bookdataかなあ。
618デフォルトの名無しさん:2007/04/20(金) 12:47:20
一般的なやり方ではなさそうだけど、オレなら

class Book
 def self.parse_html(html)
  # 今のところは Hash を返すよ
  # 将来的には Bookクラスのインスタンスに置き換えるつもり
 end
end

bookdata = Book.parse_html(html)

クラス名が Book でいいかどうかは、プログラムの他の部分とのかね合いで。
619デフォルトの名無しさん:2007/04/20(金) 13:38:11
>>616
HTMLを読むのが暗黙の了解ならparseとかto_hashでいいじゃん。
そのHash固有の処理があるなら、>>618のようにクラスにしたほうがいい気がする。
クラスにするなら俺はコンストラクタの引数にすりゃいいと思うが、好きに汁。
620デフォルトの名無しさん:2007/04/20(金) 14:13:15
>>616
Amazonの詳細ページから書名や著者名を抜き出してハッシュを返すよとかそういう動作?

そのクラスで「ナニカからハッシュにする」というメソッドがそれ1個しかないなら
to_hashでいいじゃん?

parse_html_to_hash_as_bookdataとか長いし
621デフォルトの名無しさん:2007/04/20(金) 15:29:27
>>615
捏造ではないですね
単に「カギ括弧でくくったからといってそれがすべて引用なのではない」だけです
622デフォルトの名無しさん:2007/04/20(金) 15:38:12
「ならでは」はどこから来たの〜?
623デフォルトの名無しさん:2007/04/20(金) 15:43:57
Proc#yieldってマニュアルに書いてあるけど、やってみたらそんなメソッドはありませんって言われたよ。
これはどういうこと?>ruby 1.8.5
624デフォルトの名無しさん:2007/04/20(金) 15:44:45
特徴、から来ましたよ。
それがもしあなたのヒステリーに繋がるような面倒を引き起こす単語であるなら、
なんか別のものでも考えましょうか。
625デフォルトの名無しさん:2007/04/20(金) 15:48:38
>>623
# を使った表記は文法上の表記ではなく
説明上の表記に過ぎない
626デフォルトの名無しさん:2007/04/20(金) 15:51:01
エラーになるコード晒せと
627デフォルトの名無しさん:2007/04/20(金) 15:51:24
irb>Proc.yield
NoMethodError: undefined method `yield' for Proc:Class

こんなエラーか?
yieldは実行しただけで効果が見えて楽しいとかそーゆー類のメソッドじゃないぞ
628623:2007/04/20(金) 15:58:25
これでエラーになるんですが・・・
p Proc.new{}.method(:yield)

もしくは
def foo █ block.yield; end
foo {p:ok}

ここの一番下に載ってるのに
http://www.ruby-lang.org/ja/man/?cmd=view;name=Proc
629デフォルトの名無しさん:2007/04/20(金) 16:22:07
630デフォルトの名無しさん:2007/04/20(金) 16:35:15
>>629
あら、なくなってたんですか。
それじゃProc#callで、引数チェックの回避は、*付きの配列にして頑張ることにします。
ありがとうございました。
631デフォルトの名無しさん:2007/04/20(金) 23:16:16
Rubyをある程度覚えたら、
具体的にはどんなことに使えますかね?
特にwinユーザの方に聞きたいんですが、
どのようにRubyを活用されてますか?
632デフォルトの名無しさん:2007/04/20(金) 23:17:00
>>631
HDDの肥やし。
633デフォルトの名無しさん:2007/04/20(金) 23:28:32
>631
テキスト類の処理
dbi突っ込んでちょっとしたDB操作
使い勝手がよくわからんCOMモノの挙動確認(irbでちまちま叩いてみる)

あと最近アフォみたいにでかいCSVを相手にすることが多かったんでfastercsvで万全
634デフォルトの名無しさん:2007/04/20(金) 23:44:00
仕事のルーチンワークに
メールで設計書を送らないといけないので

フォルダのファイル名を全部取得して
圧縮して
定型文書いて
メールを用意する

までやっている。
自動で出してもいいんだろうけど、最後は人の目でチェック。
635デフォルトの名無しさん:2007/04/20(金) 23:49:23
あなたがバッチファイルを書いたことがないのならおそらくRubyは使わない
あなたがこれまでPerlを使ったことがないのならおそらくRubyを使うことはない

使いもしないものに時間割くのやめようぜ
636デフォルトの名無しさん:2007/04/20(金) 23:57:25
Rubyを学んだとたん「仕事」が生まれるわけじゃないからな
637デフォルトの名無しさん:2007/04/21(土) 00:04:04
ちょくちょく小遣いは稼がせてもらってるよ。
638631:2007/04/21(土) 00:13:10
レスありがとうございます。
>テキスト類の処理
テキストエディタの正規表現使った置換えで結構解決しちゃうんですよね
>DB操作〜COMモノの挙動確認
なるほどこれは未知の領域
>CSVを相手に
CSVの操作ならAccessでなんとかなるかなぁ
>メールを用意する
こういった処理はどのような形で実行すると便利ですか?(コマンドライン?バッチ?)
>使いもしないものに時間割くのやめようぜ
まったくもって・・・ でもなぜか面白そうと思ってしまったり
639632:2007/04/21(土) 00:16:16
即答したのにシカトされた。orz
俺の嘘偽りのないRubyの使い方なのに。
640631:2007/04/21(土) 00:17:34
>「仕事」が生まれるわけじゃない
仕事で楽をしたいですね
>ちょくちょく小遣い
詳しく
641631:2007/04/21(土) 00:20:15
>>639
うは、ごめんなさいな。
まぁそうなりそうな予感はあります。
642デフォルトの名無しさん:2007/04/21(土) 01:00:40
>>640
なんかエクセルでたくさんデータを持ってて、それをHTML化したいんですけどー、
なんて仕事がよくある。「ではデータベースにぶち込んでページ生成して」とかいっても、
「なんだかよくわからなくてこわい」とか言うんで静的にHTMLを生成してやるスクリプトを組んで
全ページと言われたとおりの一覧ページを作って収めたりする。

高すぎかなと思いつつ三十万円でいいっすか? といったらOKつったので喜んでやりました。
んで毎年一度更新があってそのたびに十万円もらえることになってる。
このときはスクリプトを走らせてできたものを相手に送るだけ。

こういうお客さんを数軒抱えている。いい小遣い稼ぎになってるよ。
643642:2007/04/21(土) 01:03:36
あーでもこれはRubyだからこそって例じゃあないよね。
別にPerlだってPythonだっていいもんね
644デフォルトの名無しさん:2007/04/21(土) 01:29:54
別に自分にとって書きやすいなら、PerlだってPythonだって、
C++だって、Javaだって、C#だって、LISPだって、
なんだって、チューリング等価で好きな言語を使うがいいさ。
645642:2007/04/21(土) 01:43:12
いや、チューリングマシンでは書きたくないよw
646デフォルトの名無しさん:2007/04/21(土) 02:53:07
> Procが参照している外側のローカル変数は、Procを生成したコンテキストを
> 抜けてしまったら最後、Proc以外からは参照できないから。
>  :
> 厳密には抜け道はあるけれど、その場合はそうと分かるコードになるから大丈夫。
from ttp://idm.s9.xrea.com/ratio/2006/11/14/000541.html

↑にクロージャ内に束縛したローカル変数を、
そのクロージャを介さずにアクセスする方法があると書いてあるんですが、
この「抜け道」というのは具体的にはどういう方法なんでしょうか?
647デフォルトの名無しさん:2007/04/21(土) 03:25:38
>>646
eval使えば外部からローカル変数も操作できるってことじゃね?

def create_counter
 counter = 0
 Proc.new {counter += 1}
end

c = create_counter
p c.call
p c.call
p c.call
p eval('counter += 1000000', c)
648デフォルトの名無しさん:2007/04/21(土) 08:10:32
>>631
筋はよさそうな言語に思えたが
INIファイルは弄れないわREGも駄目だわ
クリップボードにもアクセス不可だわで
標準ライブラリが貧弱すぎてほとんど使ってねーやw
素直にPythonかVB/JScriptかPython使っとけ。
649デフォルトの名無しさん:2007/04/21(土) 08:39:06
ドザはこれだから
650デフォルトの名無しさん:2007/04/21(土) 09:48:17
リソースキット他のツールと組み合わせて使うべし。

クリップボードの内容を変数に読む
open("|cliputil -paste", "r") { |io| text = io.read }

レジストリを読む
open("|REG QUERY HKLM\Software\Microsoft\ResKit\Nt\Setup", "r") { |io| key = io.read }

INIとかHTMLはパースして読み書きする
651デフォルトの名無しさん:2007/04/21(土) 10:03:26
>>647
evalの第2引数にはprocも指定できたんすね。。知らんかった。
ありがとうございます。
652デフォルトの名無しさん:2007/04/21(土) 10:14:57
>>648
registryは標準であるだろ。

ところでpythonって標準でini, registry, clipboardアクセスできるの?
win32all いれなきゃだめだと思ってたけど。
653デフォルトの名無しさん:2007/04/21(土) 10:28:44
RubyはちょっとこったことやろうとするとWin32API呼びまくりになるのがマンドクセ
654デフォルトの名無しさん:2007/04/21(土) 10:52:04
ネコに馬車引かせるような真似するな
馬車は馬に任せろ
655デフォルトの名無しさん:2007/04/21(土) 15:44:45
大体Matzも「Rubyは快適な自転車を目指す」って言ってるしね。
言語はやはり適材適所でしょ。
656デフォルトの名無しさん:2007/04/21(土) 16:05:10
具体的にどんな場面に適しているのか思い浮かばない。
657デフォルトの名無しさん:2007/04/21(土) 17:35:41
シェルスクリプトより複雑な用途は
大体適してるんじゃね(Windowsはのぞく)
658デフォルトの名無しさん:2007/04/21(土) 17:42:09
ていうか、使い道がないなら使わなきゃいいじゃん
659デフォルトの名無しさん:2007/04/21(土) 18:20:18
今日はブックマークから不達になってるところを取り除くのに
書き捨てRubyスクリプトを使った。
660デフォルトの名無しさん:2007/04/21(土) 18:40:21
研究用データを加工処理するのに使いまくってるな。
661デフォルトの名無しさん:2007/04/21(土) 20:44:41
質問します。
今、配列 ary にキーが入っているとして

hash = {}
ary.each do |key|
  hash[key] = MyClass.new
end

ってワンライナーで書けないでしょうか?
662デフォルトの名無しさん:2007/04/21(土) 21:01:47
hash = ary.inject({}){|h,k| h[k] = MyClass.new; h }
663デフォルトの名無しさん:2007/04/21(土) 21:33:00
mysql で下のコードがうまくいきません。

meibo.uniq.each{ |val|
db.query("insert into member(name) values (val)")
naiyou.push(val)
}

naiyouの配列にはデータがあるのですが、DBへインサートできません。
(空データがはいります・・)

どなたかご教授ください。
664デフォルトの名無しさん:2007/04/21(土) 21:42:49
文字列のマニュアル嫁
665デフォルトの名無しさん:2007/04/21(土) 21:51:28
とりあえずちゃんとSQL文ができてるか確かめてみろ
puts "insert into member(name) values (val)"
666663:2007/04/21(土) 22:19:28
>>664
>>665

ありがとうございます!
("insert into member(name) values ("+ name + ")" )
で解決しました。

なんかスマートじゃない感じが。
667デフォルトの名無しさん:2007/04/21(土) 22:25:28
演算子に === や <=> があるのですがどういう機能なのでしょうか
668デフォルトの名無しさん:2007/04/21(土) 22:31:21
>>666
------------------------
str="もじれつ"
puts "strの中身はstrだよ"

strの中身はstrだよ
------------------------
str="もじれつ"
puts "strの中身は" + str + "だよ"

strの中身はもじれつだよ
------------------------
str="もじれつ"
puts "strの中身は#{str}だよ"

strの中身はもじれつだよ
------------------------
669デフォルトの名無しさん:2007/04/21(土) 22:36:47
>>666
("insert into member(name) values (#{val})" )
670デフォルトの名無しさん:2007/04/21(土) 22:39:12
>>667
どっちも基本的に裏側で使う。
===:
 case文で case a; when b とあるときに b === a として使われる。
 大抵は==やkind_of?の働きをする。
<=>:
 大小に従って -1, 0, 1 のいずれかを返す。比較不可ならnilを返す。
 sortなどはこれを実装してないと動いてくれない。
・・・と期待されている。(全部メソッドなので定義は自由)
671670:2007/04/21(土) 22:40:31
===がぜんぜん違った。falseかtrueかnilだ。ごめん。
672666:2007/04/21(土) 23:07:01
>>668
>>669

ありがとうございます。
変数展開がすっきりしました。

puts ("insert into member(name) values (#{val})" )
db.query("insert into member(name) values (#{val})" )

をするとエラーになります。
Mysql::Error
Unknown column 'なまえ' in 'field list'

デバッグプリントしたものをSQLコンソールで
insert into member(name) values ('なまえ')

すると正常にテーブルに書き込まれます。
うーん、解らない・・
673デフォルトの名無しさん:2007/04/21(土) 23:09:37
>>670-671
感謝
674666:2007/04/21(土) 23:44:57
db.query("insert into member(name) values (#{val})" )
ではなく
db.query("insert into member(name) values (\'#{val}\')")
でうまくいきました。

プレースホルダはできないのかな?
675デフォルトの名無しさん:2007/04/22(日) 00:48:15
valが既知ならいいけど、外部から貰ってきたりすると
#{}で展開するのはもろにSQLインジェクションの餌食だからねぇ。

生のRuby/MySQL API的には、quote / escape_string というメソッドで
安全にしてから埋め込めということらしい。

DBI版だとプレースホルダあるけど。
676666:2007/04/22(日) 01:00:10
>SQLインジェクションの餌食だからねぇ。
ですよね。

quote / escape_stringを使ってみます!
677デフォルトの名無しさん:2007/04/22(日) 02:04:45
>662
なるほど…inject は盲点でした。
というより、inject はいつも盲点で、上手く使える方が羨ましい…
ありがとうございました!
678デフォルトの名無しさん:2007/04/22(日) 05:29:50
elseとifが合体したのはelsifですが、elseとunlessが合体したものってありますか?
679デフォルトの名無しさん:2007/04/22(日) 09:50:01
execで外部プロセスを実行するときに
拡張子に関連付けされているアプリケーションを
自動的に選択したいのですがどうすれば良いでしょうか?

foo.txt があった場合に
メモ帳が関連付けされているならメモ帳
秀丸が関連付けされている場合なら秀丸で開く

そういう動作を期待しています
680デフォルトの名無しさん:2007/04/22(日) 09:51:28
require 'Win32API'
shellexecute = Win32API.new('shell32.dll','ShellExecuteA',%w(p p p p p i),'i')
shellexecute.call(0, 'open', 'foo.txt', 0, 0, 1)
681デフォルトの名無しさん:2007/04/22(日) 10:00:36
`start foo.txt`
682デフォルトの名無しさん:2007/04/22(日) 11:05:52
>>680
こんな事ができるんですね。
ありがとうございます
何をしてるのか理解するのに
1時間ぐらい掛かりましたがなんとかわかりました。
>>681
exec('start x:\foo.txt') だと
sh: start: command not found

exec('start x:/foo.txt') だと
test.rb:11:in `exec': No such file or directory - start x:/foo.txt (Errno::ENOENT)

のエラーになってしまいました。
その位置にファイルがあることは確認しています
683デフォルトの名無しさん:2007/04/22(日) 11:14:15
startはdirのようにコマンドプロンプトの内部コマンドなのかな。
もしそうなら cmd.exe /c start 〜 かも。
684デフォルトの名無しさん:2007/04/22(日) 11:16:52
cmd /c foo.txt だけでもちゃんと関連付けにしたがって開けてくれるっぽい
685デフォルトの名無しさん:2007/04/22(日) 11:26:20
>>683-684
両方ともうまく動きました。ありがとうございます
686デフォルトの名無しさん:2007/04/22(日) 11:47:19
windows環境で globを用いて Unicode の
ファイル、フォルダ名を扱うことは出来ますか?

ruby -Ku
$KCODE = "UTF8" を指定しても
Unicodeを含むパス情報を取得できませんでした
687デフォルトの名無しさん:2007/04/22(日) 13:06:18
>>678
elsif(! (b)) しかないなあ。
あるいは、
elsif(b); else
か。
688デフォルトの名無しさん:2007/04/22(日) 13:09:14
unless foo

elsunles bar

end
とかやられても意味わからんし・・・w
689デフォルトの名無しさん:2007/04/22(日) 13:39:49
>>686
今のところできない。
690デフォルトの名無しさん:2007/04/22(日) 15:08:41
injectのブロックって do 〜 end で指定できないの?

>ruby -ve "p [1,2,3].inject({}){|h,k| h[k] = k; h}"
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
{1=>1, 2=>2, 3=>3}

>ruby -ve "p [1,2,3].inject({}) do |h,k| h[k] = k; h end"
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
-e:1:in `inject': no block given (LocalJumpError)
from -e:1:in `each'
from -e:1:in `inject'
from -e:1
691690:2007/04/22(日) 15:26:53
>>690 すんません、自己解決。
ってゆうか、これから出来るってのは確認した。
なぜかはイマイチ不明だけど。なんかの優先順位の関係?

>ruby -ve "p([1,2,3].inject({}) do |h,k| h[k] = k; h end)"
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
{1=>1, 2=>2, 3=>3}

>ruby -ve "[1,2,3].inject({}) do |h,k| h[k] = k; h; end.inspect.display"
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
{1=>1, 2=>2, 3=>3}

>ruby -ve "a = [1,2,3].inject({}) do |h,k| h[k] = k; h; end; p a"
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
{1=>1, 2=>2, 3=>3}
692デフォルトの名無しさん:2007/04/22(日) 15:33:39
いまのところ、{}とdo endは優先度が違うね。
同じにしようという声もあったと思う。

693デフォルトの名無しさん:2007/04/22(日) 15:38:09
いつどこで?
694デフォルトの名無しさん:2007/04/22(日) 15:53:11
>>689
残念です。
ありがとうございました
695デフォルトの名無しさん:2007/04/22(日) 16:31:28
>>686
関連して、Windows環境で、日本語フォルダがglobで列挙できないことがあるのが、
なんとかならないかなあ。
なんか、過去ログにも誰か同じ問題聞いてた気がするけど。

再現コード書いてみるか・・・
696デフォルトの名無しさん:2007/04/22(日) 19:33:16
>>695

#!ruby -Ks
require 'pp'
puts "$KCODE = #{$KCODE}"
puts

FILES = [
"test",
"ああああああああああああああああああああああああああああああああああ\
ああああああああああああああああああああああああああああああああああ\
ああああああああああああああああああああああああああああああああああ\
ああああああああああああああああああああああああ.mpg.txt",
"表が怖い",
"噂のソフト",
"ハニリイト"
]

# create files
FILES.each do |file|
next if File.exist?(file)
open(file, "w") {|f| f.write file}
end

=begin
697デフォルトの名無しさん:2007/04/22(日) 19:34:22
=end

# glob test
Result = Struct.new(:name, :is_enumerable, :size)
results = Array.new(FILES.size) do |i|
Result.new(FILES[i], false, FILES[i].size)
end
Dir::glob("*") do |f|
i = FILES.index(f)
if i
result = results[i]
result.is_enumerable = true
end
end

# print result
results.each {|result| pp result }

-------------
結果、test以外どれも列挙できない。
これ、かなり致命的だと思うんだけど、どこに報告すればいい?
698デフォルトの名無しさん:2007/04/22(日) 19:35:24
>>695
インデントくずれた orz

#!ruby -Ks
require 'pp'
puts "$KCODE = #{$KCODE}"
puts

FILES = [
  "test",
  "ああああああああああああああああああああああああああああああああああ\
ああああああああああああああああああああああああああああああああああ\
ああああああああああああああああああああああああああああああああああ\
ああああああああああああああああああああああああ.mpg.txt",
  "表が怖い",
  "噂のソフト",
  "ハニリイト"
]

# create files
FILES.each do |file|
  next if File.exist?(file)
  open(file, "w") {|f| f.write file}
end
=begin

699>>698 続き:2007/04/22(日) 19:37:42
=end

# glob test
Result = Struct.new(:name, :is_enumerable, :size)
results = Array.new(FILES.size) do |i|
  Result.new(FILES[i], false, FILES[i].size)
end
Dir::glob("*") do |f|
  i = FILES.index(f)
  if i
    result = results[i]
    result.is_enumerable = true
  end
end

# print result
results.each {|result| pp result }

700698:2007/04/22(日) 19:39:15
手元の環境では、$KCODE=SJISです。
$KCODE=SJISでないと、「表が怖い」とかのファイル名が生成時に化けるので注意です。
701デフォルトの名無しさん:2007/04/22(日) 20:57:02
うーん、長すぎるファイル名(ああああ...)がFindNextFileを失敗させてるねぇ。
GetLastErrorを見てないから、そこで列挙が止まっちゃう、と。

win32/win32.c
1505: while (FindNextFile(fh, &fd)) {

1505: while (FindNextFile(fh, &fd) || GetLastError() == ERROR_MORE_DATA) {
にすればとりあえず(あああ...)以外はtrueになるけど
702698:2007/04/22(日) 21:16:19
>>701
長すぎる文字列が失敗させているんですかね?
と思って、ああああをコメントアウトしてみたんですけど、
Falseになるな・・・
703デフォルトの名無しさん:2007/04/22(日) 21:17:23
ファイルは消した?
704698:2007/04/22(日) 21:19:51
>>702
ああああああのファイル消し忘れてた orz
あああああをコメントアウトして、ファイル消したら、trueになりました。

確かに、あああああああああ だけが悪影響を与えているようですね。

表が怖い、噂のソフトは、一見文字化け絡みでFalseなのかと思われたが、関係ない。
705686:2007/04/22(日) 23:39:41
何度もすいません

globを使わなくて良いので
特定のディレクトリ配下にあるファイル名を
Unicodeに対応して取得するにはどうすれば良いのでしょうか?
706デフォルトの名無しさん:2007/04/22(日) 23:59:09
>>705

require 'kconv'
ret = Dir.glob("特定のディレクトリ以下/*").map{ |f|
f.kconv(Kconv::UTF8, Kconv::SJIS)
}
707デフォルトの名無しさん:2007/04/23(月) 00:00:43
>>697
メールアドレスさらしてもいいなら、ruby-dev になげるのがいいんじゃなかろうか。

http://rubyforge.org/tracker/?atid=1698&group_id=426&func=browse

上のアドレスから報告するというのもできると思うけど、日本語は多分使えないと思う。
まあ多分関係者がここを見ているとは思うけど、プッシュできるなら
したほうがいいと思う。


708デフォルトの名無しさん:2007/04/23(月) 00:12:28
話をぶった切ってすみません。

最近rubyをemacsで書き始めたのでruby-mode.elを入れました。シン
タクスハイライティングはできたのですが、オートインデントはど
うしたらいいんでしょう?

前に使ってたRDT(だったかeclipseのやつ)はコードを後から自動
整形する機能があったんですが、そういうのってemacsでも可能でしょ
うか?
709デフォルトの名無しさん:2007/04/23(月) 00:36:20
すれ違い
710デフォルトの名無しさん:2007/04/23(月) 00:42:53
・TABキーを押すと、カーソルがどこにあっても適切なインデントを行う。
(インデントすべきところをしていなければするし、しすぎていれば戻す)

・C-j (M-x ruby-reindent-then-newline-and-indent) を使うと、
改行後にインデントを行う。(RETURNでそうしたいならC-mにバインド)

・ファイル全体のインデントは
C-x h (M-x mark-whole-buffer) してから
C-M-backslash (M-x indent-region)
711デフォルトの名無しさん:2007/04/23(月) 02:56:35
>>710に付け加えて
字下げの契機になる行(メソッド開始のdefがある行とか、ifの行)に
カーソルを持って行ってM-C-qでそのブロック内のインデントを調整
712デフォルトの名無しさん:2007/04/23(月) 07:15:04
>>710, 711

ちゃんと色々あるんですねー。感動しました。
これならガシガシ使っていける気がします。

常識/スレ違い失礼しました!
713デフォルトの名無しさん:2007/04/23(月) 10:36:02
おはようございます。特異クラスについてよく理解できないところがあるので宜しければ教えてください。

現状の認識では特異クラスとはある特定のオブジェクトに対してのみクラス構造を拡張?すると言うものです。
乱暴に言うと特異メソッドとかいちいち個別に書いてると関連が分かりづらいから一括りにしちゃおうよ、的な…。

ttp://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=FAQ%3A%3A%A5%AF%A5%E9%A5%B9%A1%A2%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB;em=%C6%C3%B0%DB%A5%AF%A5%E9%A5%B9#a6.2e6.20.c6.c3.b0.db.a5.af.a5.e9.a5.b9.a4.c8.a4.cf.b2.bf.a4.c7.a4.b9.a4.ab

ここのサンプルソースで書かれているようなものは理解出来ています。

ですが、Railsや他のソースを眺めているとたまに出てくる、

class Hoge
 class << self
  
  def foo
   .....
  end
 end
end

のような例がよく分からないのです。
これってただ単にクラスメソッドをまとめて定義している、程度の理解でも差し支えないのでしょうか?
これだと理解がかなり浅い気がするのですが。。
714デフォルトの名無しさん:2007/04/23(月) 15:24:22
皆さんRailsの開発環境って何使ってますか?
715デフォルトの名無しさん:2007/04/23(月) 17:14:06
>>713
それで合ってるよ。
716デフォルトの名無しさん:2007/04/23(月) 20:49:54
>>714
Emacs + emacs-rails
717デフォルトの名無しさん:2007/04/23(月) 20:59:02
2GB以上のファイルサイズが正しく収得出来ないんですけど
なにかいい方法ありませんか?
718デフォルトの名無しさん:2007/04/23(月) 21:03:10
>>717
OSを変えてみる
719デフォルトの名無しさん:2007/04/23(月) 21:34:40
>>718
今XPなんですけど
たとえばLINUX上からNTFSをマウントすれば
Rubyは正しいファイルサイズを返すんですか?
それならVPCになにか入れてみようかな。
720デフォルトの名無しさん:2007/04/23(月) 21:35:57
>>714
TextMateもしくはvim
721デフォルトの名無しさん:2007/04/23(月) 21:37:20
FindFirstFileでも呼んどけ
挙動がおかしかったらWin32API直呼び。マジお勧め
722デフォルトの名無しさん:2007/04/23(月) 22:13:50
KCODEがutf8ならW系APIを読むように
win32.cでも改造してみるか(w
723デフォルトの名無しさん:2007/04/23(月) 22:35:56
>>719
今のところWindows版のlarge file supportは1.9のみ。
724デフォルトの名無しさん:2007/04/23(月) 22:43:38
Rakeの作者のブログにこんな話がありました。。

desc "This task will do something"
task :do_something do ... end

というコメント書式は格好よくないから

-- "This task will do something"
task :do_something do ... end

みたいにしようかなー(Ada + Smalltalkぽい)
こうしたらできるし

class String
def -@
desc self
0
end
end

で、質問です。上のコードのdef -@の部分ってどういうシンタクス
ですか? 関数定義部の@には何か特別の機能でもあるのでしょうか?
(ちなみにRakeのコメント書式を実際に上のようにすることは思い
とどまったそうです。)

725デフォルトの名無しさん:2007/04/23(月) 23:01:58
単項マイナス演算子を定義するときの専用表現。
726デフォルトの名無しさん:2007/04/23(月) 23:13:40
>>725

ありがとうございました。分かりました。
超基本的な質問ですみませんでした。
727デフォルトの名無しさん:2007/04/23(月) 23:27:14
ruby/tkで将棋を作ってみたいんですが、
参考になるコードはないでしょうか。
検索していると、オセロのコードが昔はあったようですが
今は入手不可のようです。
GUI部分がどうしても上手く作れないのでよろしくお願いします。
728デフォルトの名無しさん:2007/04/24(火) 00:52:02
>>727
「14歳からはじめるRuby」って本にオセロの作り方のってたぉ
14歳はだいぶオーバーしてしまったが、この本は分かりやすくていいw
729デフォルトの名無しさん:2007/04/24(火) 01:58:06
Rubyの「$KCODE」って名前が好きになれないんだよな。
先進のオブジェクト指向だとか言ってて国際化はi18nではくl10nかよと。

単なるオーバーライドで$KCODEも有効で良いから$LANGとぁ$LOCALEに
ならんのかね?

ちなみにnkfとかktermとかjcodeなんてえのも嫌い(名前が)。
もう主要OSはこぞってUnicode系になってるんだし。
730デフォルトの名無しさん:2007/04/24(火) 02:39:38
日本語フォルダなんて使うのが、面倒な原因だと思うけどな。

マクだとツールボックスだかのマカ専用API直呼び出しなのだろうか。
なんかその辺の環境依存的なプログラミング手法(ヲレ関数で包めとか)を決めて推奨したほうが後で揉めるより良いと思う。



ところでAとBがあって、
1) A == B
2) A < B
3) A > B
の3パターンの処理を行う時って、おまいらならどう記述する?
if A == B then
 ...
elsif A < B then
 ...
elsif A > B then
 ...
end
ってなんか見た目分かりにくくていまいちな気がするが、どうよ?
731デフォルトの名無しさん:2007/04/24(火) 03:07:04
>>730
俺ならそれは

case
when A == B
when A < B
when A > B
end

になるな
732デフォルトの名無しさん:2007/04/24(火) 04:45:36
ヲレロケールとヲレラングで包めば良いのでは?
ヲレi18nでいいじゃん。

まだRFCではメールはiso2022jpダッタと思う。utf8になってたっけ?
733デフォルトの名無しさん:2007/04/24(火) 08:33:33
>>728
これですか?

14歳からはじめるRubyインターネットプログラミング教室
http://www.amazon.co.jp/dp/4899771827
734デフォルトの名無しさん:2007/04/24(火) 09:15:43
>>730
case A <=> B
when 0
 ...
when -1
 ...
when +1
 ...
end
735デフォルトの名無しさん:2007/04/24(火) 09:30:31
で、実際のところどれが速いの?
736デフォルトの名無しさん:2007/04/24(火) 10:53:03
caseなら変わらないのでは?
記述の違いだけだろうし。
737デフォルトの名無しさん:2007/04/24(火) 12:05:42
実行ボトルネック上に実質的な差はないと思う
ココをチューニング対象にするならCで書き直したほうがいい
738デフォルトの名無しさん:2007/04/24(火) 13:20:15
> 日本語フォルダなんて使うのが、面倒な原因だと思うけどな。
世界の人、全員がプログラマならそういえるんだけどな。
739デフォルトの名無しさん:2007/04/24(火) 13:31:49
>世界の人、全員がプログラマならそういえるんだけどな。
んなのかんけーねーよ。
音楽CDとかの分類にもはや必須だから
避けろといってるほうがアホ。
Rubyの糞実装を糊塗するために珍説振りまかないように。
740デフォルトの名無しさん:2007/04/24(火) 14:49:25
↑読解力に欠けたバカ
741デフォルトの名無しさん:2007/04/24(火) 17:38:59
ということにしたいけど、うまいこじつけは思いつかなかった740
742デフォルトの名無しさん:2007/04/24(火) 18:15:19
>>741
お前アホすぎw 738をよく読めよw

2回指摘されて分からなかったら日本人じゃねぇよw
743デフォルトの名無しさん:2007/04/24(火) 18:25:10
別にどうでもいいや。どっちもバカってことで。
744デフォルトの名無しさん:2007/04/24(火) 18:26:44
>>742カワイソス・・・・
745デフォルトの名無しさん:2007/04/24(火) 18:27:03
悔しいからって別人の振りして「どっちもバカ」って本当にアホすぎだな。
どうでもいいならそもそもレスしないだろ。
746デフォルトの名無しさん:2007/04/24(火) 18:28:02
>>744
日本語が分からないお前が一番かわいそうだよ…
747デフォルトの名無しさん:2007/04/24(火) 19:42:36
ダウンロード販売の音楽ファイルも最近は英数が多いけどな。
MP3タグだけ日本語表示で良いじゃん。
748デフォルトの名無しさん:2007/04/24(火) 19:45:31
ま、いまだにフォルダで管理とか原始的なことやってるんだからしょうがないんじゃね?
749デフォルトの名無しさん:2007/04/24(火) 19:47:13
>ダウンロード販売の音楽ファイルも最近は英数が多いけどな。
ヨーロッパの音源だとUNICODEが多かったりするんだが。
750デフォルトの名無しさん:2007/04/24(火) 19:55:38
英数が多い、の反論として
Unicodeが多い、とか意味不明じゃないか。
751デフォルトの名無しさん:2007/04/24(火) 19:57:51
結論
ASCII以外はRuby非推奨
英語圏以外はRuby非推奨
752デフォルトの名無しさん:2007/04/24(火) 19:58:58
>>751
違うな。お前にはRuby非推奨だ。
753デフォルトの名無しさん:2007/04/24(火) 20:08:09
>>750
Rubyが糞なのでファイル名は英数にして、タグに日本語名つけて回避しろとか抜かしているわけで。
754デフォルトの名無しさん:2007/04/24(火) 20:30:35
まぁ信者の心持ちとしては正しいといえるかもしれないね。
でも、「Ruby様に合わせて、コレとかアレとかソレは頑張って避けるようにしましょう」ってのは、
信者以外には通用しない話の持って生き方ではある。
布教マニュアルに不備があるというところかね。
755デフォルトの名無しさん:2007/04/24(火) 20:42:00
>>754
カルト宗教としては押し付けは普通だろう
756728:2007/04/24(火) 20:49:57
>>733
それです
初心者向けだけど、参考になるかもです
757デフォルトの名無しさん:2007/04/24(火) 21:00:33
>>753
はぁ?お前のそのレスも、
ヨーロッパの音源だとUNICODEが多い、
が意味不明という反論になってないけど?
758デフォルトの名無しさん:2007/04/24(火) 21:37:21
本スレの流れを持ち込まないで下さい
759デフォルトの名無しさん:2007/04/24(火) 22:10:14
ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32]

require "open-uri"
できねーのですが
760デフォルトの名無しさん:2007/04/24(火) 22:12:22
open-uri.rb自体はあるのか?
$: の値はどうなっているか?
出来ないと判断した際何かメッセージは出たか?
761デフォルトの名無しさん:2007/04/25(水) 02:05:51
環境
D:\Programming\koshi>ruby -v
ruby 1.8.5 (2006-12-04 patchlevel 5000) [i386-mswin32]

目的
Ruby's WWW::Mechanizeを使いたい
http://mono.kmc.gr.jp/~yhara/w/?Ruby-WWW-Mechanize

やったこと
WWW::MechanizeのtgzをDL、ruby setup.rbでインストール OK

WWW::Mechanizeのサンプルを実行したら、require 'rubygems'でエラー
D:\Programming\koshi>ruby spider.rb
spider.rb:3:in `require': no such file to load -- rubygems (LoadError) from spider.rb:3

'rubygems'のzipをDL、ruby setup.rbでインストール NG
zlib.dllがありません ダイアログが表示された


やるきなくした
762デフォルトの名無しさん:2007/04/25(水) 02:23:52
>>761
Rubyは何で入れた?

OneClickInstallerで入れろ。
gemsも入る。
gems入る→gem install mechanize で mechanize も入る → 終了

Rubyでライブラリ入れるときは、基本gemsで入れるから、
gemsは入れとけ
763デフォルトの名無しさん:2007/04/25(水) 02:57:05
Ruby Quiz
http://cuzic.net/ruby-quiz/ruby-quiz011.html
を見ているのですが

ここの、第3問 の答えって間違ってませんか?

def do1 a; a.concat [2,3]; end
def do2 a; a = a + [2,3]; end
a1 = a2 = [1,2]
do1(a1);p a1 #=> [1,2,2,3]
do2(a2);p a2 #=> [1,2,2,3] ←ここが違う

do2(a2);p a2 は、[1,2,2,3,2,3]になると思うのですが・・・
764デフォルトの名無しさん:2007/04/25(水) 02:57:18
日本語フォルダが扱えない馬鹿は英数で回避すればって教えでしょ。
教えを守れない香具師は、パールでも好きな宗教に趣旨替えすれば良い。

ユニコードの英数部分ってアスキーとコンパチで実にうまく出来てたりするしねえ。
だから欧米は、アスキーもユニコードも大差なく扱える。結局は英数使っとくのが楽。

日本語の読み書きできないなら、英語で読み書きすれば意思疎通できるよって話。
日本語の読み書きしたいなら、日本語の勉強と(rubyでも)日本語を扱う方法の勉強をすれば良い。
765デフォルトの名無しさん:2007/04/25(水) 03:30:08
execとsystemと``の違いは何でしょうか?
766デフォルトの名無しさん:2007/04/25(水) 05:58:54
RubyがPythonに取って代わられたのは闇の組織が関係していると思われます。
皆さんはご存じないかもしれませんが、Rubyは光の組織と関係があるのですよ。
767デフォルトの名無しさん:2007/04/25(水) 08:40:48
>>756
サンクス。
本屋で見てみます。
768デフォルトの名無しさん:2007/04/25(水) 09:17:23
>>763
その中で、ひとつだけ他とIDが違うArrayオブジェクトがあるんだが、どれかわかるか?



Array#concatは新しい配列を作らずに既存の配列に追加する。
でも、array = array + [なんとか] は
既存の array と [なんとか] を結合して新しい配列オブジェクト array を生成する。
ここのイコール記号は「足して既存の配列に書き戻す」ような動作に見えるが、Rubyでは違う。

似たような勘違いに属する、直感に反する例としては、

i=0
10.times do
i += 1
puts i.object_id
end

3
5
7
9
11
13
15
17
19
21

こんなんもある。+= するたびに新しいオブジェクトになってる。
769デフォルトの名無しさん:2007/04/25(水) 09:26:49
答になってなかった。あーつまりだな

def do2 a; a = a + [2,3]; end

これの左辺の a は「新しい」 a で、誰からも参照されてないんだよ。
do2 では 引数の a は変化してない。

def do1 a
p a.object_id
a.concat [2,3]
p a.object_id
end

def do2 a
p a.object_id
a = a + [2,3]
p a.object_id
end

a1 = a2 = [1,2]
do1(a1)
p a1.object_id
p a1
do2(a2)
p a2.object_id
p a2


これに書き直して動かしてみな。do2の最後で表示する5つ目のIDだけが違うはずだから。
770デフォルトの名無しさん:2007/04/25(水) 09:56:07
ここ初心者スレだっけ…

原因は = というよりは + だと思う
マニュアルには「内容を繋げた新しい配列(や文字列)を返します」とかしれっと書いてあるが

   新しいオブジェクトを作って返します

と明示的に書いて欲しいもんだ
よく言われるけど、「足す」だけなら concat や << の使用の検討をお勧めする

   return デカい文字列1 + デカい文字列2

だと超デカい第3の文字列ができてしまうが

   return デカい文字列1 << デカい文字列2

だとでかい文字列1が超デカくなるだけなのでこちらのほうが一般的にはマシ
(ただし、デカい文字列1の指すオブジェクトの中身が変化してしまうのでそのへんは注意)

<< や concat は初心者の人にイマイチ受けがよくないんだが、使い分ける癖はつけたほうが後々お得
771デフォルトの名無しさん:2007/04/25(水) 13:02:06
>>769
うーん、うまくいかない・・・

> ruby -v
ruby 1.8.5 (2006-08-25) [i386-mswin32]


def do1(a)
  puts "do1 a.object_id = #{a.object_id}"
  a.concat [2,3]
  p a
  puts "do1 a.object_id = #{a.object_id}"
end

def do2(a)
  puts "do2 a.object_id = #{a.object_id}"
  a = a + [2,3]
  p a
  puts "do2 a.object_id = #{a.object_id}"
end

a1 = a2 = [1,2]
do1 a1
puts "a1.object_id = #{a1.object_id}"
p a1
puts

do1 a2
puts "a2.object_id = #{a2.object_id}"
p a2
772デフォルトの名無しさん:2007/04/25(水) 13:03:44
do1 a.object_id = 21719210
[1, 2, 2, 3]
do1 a.object_id = 21719210
a1.object_id = 21719210
[1, 2, 2, 3]

do1 a.object_id = 21719210
[1, 2, 2, 3, 2, 3]
do1 a.object_id = 21719210
a2.object_id = 21719210
[1, 2, 2, 3, 2, 3]

になってしまう・・・
773デフォルトの名無しさん:2007/04/25(水) 13:04:43
あ、ごめww
> do1 a2
> puts "a2.object_id = #{a2.object_id}"
> p a2

do2 a2だった・・・
こうすると、ちゃんと、do2の最後だけ違いますね

do1 a.object_id = 21719210
[1, 2, 2, 3]
do1 a.object_id = 21719210
a1.object_id = 21719210
[1, 2, 2, 3]

do2 a.object_id = 21719210
[1, 2, 2, 3, 2, 3]
do2 a.object_id = 21718210
a2.object_id = 21719210
[1, 2, 2, 3]
774デフォルトの名無しさん:2007/04/25(水) 14:16:15
class Module
def attr_boolean_accessor(*names)
names.each { |name|
module_eval <<-EOF
def #{name}?; @name; end
def #{name}=(val); @name = !!val; end
EOF
}
end
end

こういうのが標準で欲しいなあ。
775デフォルトの名無しさん:2007/04/25(水) 15:39:38
loop_with_index が標準で欲しいなあ。
776デフォルトの名無しさん:2007/04/25(水) 16:25:15
2chの要望は絶対に受け入れられないの法則
777デフォルトの名無しさん:2007/04/25(水) 16:44:23
にちゃんには開発者は居なくてユーザだけだからね。
彼らはメール読んだりオフ会に出てきて話して飯食ったりにちゃん読んだりするより、プログラム書いてる方が楽しい人たちだし。
778デフォルトの名無しさん:2007/04/25(水) 17:11:49
「わかったふり」なんか受け入れても意味ないしね。
受け入れて欲しかったら、もうちょっと修行を積んで、まともな案を出せるようになればいい。
779デフォルトの名無しさん:2007/04/25(水) 21:02:31
にちゃんはMLとかオフ会で話せない愚痴を書く場所だからなぁ
780デフォルトの名無しさん:2007/04/25(水) 21:21:09
でも初心者スレは質問とか回答する場所じゃね?
愚痴は本スレやモルモンスレの方が適切かと
781デフォルトの名無しさん:2007/04/25(水) 21:28:28
>>765

system
引数のプログラムを実行する。
単に他のプログラムを実行したいならコレ。

``
ほぼsystemと同じだが、実行したプログラムの標準出力の内容を文字列とし
て返す。

exec
自プロセスで動かすコードを置きかえる。

最後だけ分かりにくいだろうな。

今自プロセスではRubyインタプリタが何らかのスクリプトを実行している
(そこにexecが書いてある)わけだが、execすると、プロセスに搭載している
コード(=Rubyインタプリタ)の代わりに別のコードを実行する。
動いているコード自体をすげ替えるので、execに成功すると、exec先で終了
しても、再びRubyインタプリタに戻って来ることはない。

forkしてexecというUNIXのプロセス生成&実行の仕組みは学んでみると
面白いかもよ。
782デフォルトの名無しさん:2007/04/25(水) 21:42:27
Hash#eachなどのブロック内で自分自身の値を変更するようなイテレータはありませんか?

見つからないので今のところ
temp = {}
hash.each{|k,v| temp.store(k,do_hoge(v)}
hash = temp

と代用しているのですが、なぜだか涙が止まりません。
783デフォルトの名無しさん:2007/04/25(水) 21:43:53
>>781
exec 'notepad.exe'
p 'notepad closed'

ってすると "notepad closed" が表示されないのを確認しました。
何に使うんだろうと思いましたが、UNIXやLinux系の流儀ですか…
機会があったら学んでみます。

ありがとうございました。
784デフォルトの名無しさん:2007/04/25(水) 21:49:49
>>783
「forkして」を読み飛ばしてるだろ
そこがミソなんだよ
785デフォルトの名無しさん:2007/04/25(水) 22:03:03
>>782
言われてみれば Hash#map! は無いんだな

hash.each {|k
v| hash[k] = do_hoge(v) }

あたりで。変態的な方法としては

hash.merge!(hash) {|k
v1
v2| do_hoge(v1) }

とかどうよ
786785:2007/04/25(水) 22:09:19
ごめん書き直し。

> hash.each {|k
> v| hash[k] = do_hoge(v) }

hash.each {|k, v| hash[k] = do_hoge(v) }

> hash.merge!(hash) {|k
> v1
> v2| do_hoge(v1) }

hash.merge!(hash) {|k, v1, v2| do_hoge(v1) }
787デフォルトの名無しさん:2007/04/25(水) 22:09:25
>782
あまり美しくないが、
hash.merge!(hash){|k,v| do_hoge(v)}
とかかな。

Hash#map! をこの定義にしておくと幸せになれそうだが……。

class Hash
def map!()
self.merge!(self) {|k,v| yield(k,v) }
end
end
788787:2007/04/25(水) 22:09:57
あら、かぶっちゃった。
789デフォルトの名無しさん:2007/04/25(水) 22:12:51
たしかwindowsのrubyは、cygwin版にしかforkがないんだよな。
790デフォルトの名無しさん:2007/04/25(水) 23:51:51
def func=
#なんだかの処理
end

上記のような関数を作ったところ、エラーにはなりません
しかし、
func= と書いても、 func=適当な値 と適当な値を入れてもエラーになります

def func=
end
みたいなメソッドは定義できるのに使用できないのでしょうか?

すなおに
def func
end
と書けとは言わないでください

実験してみたところ、?とか!は質問形式や、レシーバに変更を与えない場合につけてもなんとも無いみたいですが、=だけは別なのでしょうか?
791デフォルトの名無しさん:2007/04/26(木) 00:26:10
$ cat test.rb
def func=
puts "func= is called"
end
func=1
$ ruby test.rb
$

何もエラーは出ない。
ただし、メソッドfunc=が呼ばれるのではなく、
ローカル変数funcへの代入が行われている。

どんなエラーになるの?

=付きのメソッドが作れるのはアクセサ関係のせいだろう。
792デフォルトの名無しさん:2007/04/26(木) 00:29:11
インスタンスメソッドの場合はこうなる。

class Hoge
def func=
puts "func= is called"
end
end

hoge = Hoge.new
hoge.func=1

test.rb8:in `func=': wrong number of arguments (1 for 0) (ArgumentError)
from test.rb:8

obj.method=arg の形は
obj.method=(arg) と解釈されるので、method=は引数を1つとる
形で定義されていなければならない。
793705:2007/04/26(木) 06:36:34
>>706
試してみましたがUnicode部分が????になってしまいます
やはり>>721さんが言われる通りWin32API呼ぶしかないんでしょうか?
794デフォルトの名無しさん:2007/04/26(木) 08:30:09
>>791->>792
レスありがとうございます
たしかに、func=5とobj.func=5で動作違いますね

>>791さんの言うとおりそれだと、エラーが出ませんでした
しかし、私は>>792さんのように書いていたので、>>792さんがお書きになられたエラーがでました
ただし、>>791の場合でもself.func=5とか書くとwrong number of arguments (1 for 0)になってしまいます


代入演算子=の挙動は
func=

obj.func=
でちがうのでしょうか?

マニュアル熟読すればわかるのでしょうか?
795デフォルトの名無しさん:2007/04/26(木) 08:32:56
ちょい、質問
メソッド内のクラスおよびモジュールの定義はなぜ禁止されてるんだ?(あまり、必要ないと言えば無いが、クラスは必要あるときもありますよね)
あと、シングルトンのクラスだけはOKて本当か?

なんで、そんな風になっちまったんだ?
796デフォルトの名無しさん:2007/04/26(木) 09:22:04
>>794
def func= x # Kernelモジュールのインスタンスメソッド
puts "func= #{x}"
end
self.func = 1 # selfはmain(Objectクラスのインスタンス)

>>795
たぶん君の必要としている「メソッド内のみのクラス」はシングルトンメソッド(特異メソッドのこと)でほぼできる。
デザパタのシングルトンじゃないでしょ。
797デフォルトの名無しさん:2007/04/26(木) 10:15:48
>>785,787
ブロック内部で呼び出し元?のハッシュを上書きするのは
なんだか変態チックなのでmerge!を使うのがよさそうですねー。
ありがとうございます。
798デフォルトの名無しさん:2007/04/28(土) 08:01:41
Singletonのメリットがよくわからない

class Hoge
include Singleton
def fuga()
end
end
Hoge.instance.fuga

これは

class Hoge
def self.fuga()
end
end
Hoge.fuga

とかけばいいんじゃないの?
799デフォルトの名無しさん:2007/04/28(土) 11:27:29
シングルトンは、インスタンスがたかだか1つであることを保証するもの。
インスタンスを全く作る必要がないケースなら不要。
800デフォルトの名無しさん:2007/04/28(土) 11:35:50
俺は>798じゃないがJavaの時から「要るのかこれ?」って疑問はあるな。
(Javaもクラスフィールド・クラスメソッドは使える)

インスタンスが1つであることを保証するなら
別にインスタンス作る必要も無いんじゃねーの?ってさ。
801デフォルトの名無しさん:2007/04/28(土) 11:43:20
JavaとかC++だとクラスをオブジェクトとして扱えないからたまに必要かな
Rubyじゃいらないな
802デフォルトの名無しさん:2007/04/28(土) 12:28:34
機械的に何度もnewを呼ばれるようなプログラムで便利とかそういうもんなんだろうと思って
シングルトンの項は流し読みしてたんだがなにかマズいんだろか
803デフォルトの名無しさん:2007/04/28(土) 12:32:44
rubyってコンストラクタ(initialize)オーバーロードできないの?
クラスで
def initialize(x)

end

def initialize(x, y)

end
ってやって

X.new(a)ってやったら引数が足りないって怒られたんだけど。
804デフォルトの名無しさん:2007/04/28(土) 12:41:22
805デフォルトの名無しさん:2007/04/28(土) 12:51:06
テストとか作ってる人いる?
やっぱできるようになると開発効率違う?
806デフォルトの名無しさん:2007/04/28(土) 13:03:05
>>803
そもそもRubyはオーバーロードが無いから
その定義はオーバーライド扱い。

その場合、子クラスのinitializeは
引数1つでも2つでも良いように定義して
引数1つなら親クラスのinitalizeを呼ぶようにすればOK。
807デフォルトの名無しさん:2007/04/28(土) 13:05:08
>>806
頭良いですね
定番処理?
808デフォルトの名無しさん:2007/04/28(土) 13:13:55
>>800
Javaではクラスインスタンス変数は使えない。
809デフォルトの名無しさん:2007/04/28(土) 14:27:22
MonoStateパターンというのもあるようですね。
状態は全てクラス変数で持ち、インスタンス変数を持たない。
=> いくらインスタンスを作っても構わない、ということかな。

元祖Wiki http://c2.com/cgi/wiki?MonostatePattern
810デフォルトの名無しさん:2007/04/28(土) 15:25:03
>>805
面倒は面倒だけどやっぱバグ減るよ。
811デフォルトの名無しさん:2007/04/29(日) 03:52:57
マヌケな質問でしたらすみませんが、
インスタンスのフィールドを「追加」不能にする方法はありますか?

何がしたいのかというと、
スペルミスが原因で
フィールドの変更をするつもりが
フィールドの追加になってしまう、
という状態を避けたいのです。

そこで initialize で
フィールドの初期化だけでもしておいて、
最後にインスタンスへの
フィールド追加を不能にできれば…と思いました。
812デフォルトの名無しさん:2007/04/29(日) 07:22:35
ユーザーに自由にRubyコードを追加させるとかそういうアグレッシブなスクリプトか何かか?
813デフォルトの名無しさん:2007/04/29(日) 08:53:11
>>811
そんなことは無理だと思うけど、set_trace_funcを使えばできなくもない気がする。
set_trace_funcについてはマニュアルを見てくれ
814811:2007/04/29(日) 09:55:45
>>812
いえいえ、そうではなく例えば…
class Class1
def initialize
@count = 0
end

def do_something
if ...
@conut = 0 #スペルミス!!
end
end
end


という時に実行時エラーなどで、
自動的にスペルミスが発見できるような
仕組みが欲しいのです。
そのために利用できるフィールドは全て
initialize で初期化して、それ以外はエラーに
できないかな、と。


>>813
set_trace_func についてどうもです。
まだ Ruby 始めたばっかりで
どう使うのか分かりませんが勉強します。
815811:2007/04/29(日) 09:57:01
あ、インデントが…orz

class Class1
 def initialize
  @count = 0
 end
 
 def do_something
  if ...
   @conut = 0 #スペルミス!!
  end
 end
end

です。
816デフォルトの名無しさん:2007/04/29(日) 10:36:00
諦めてテスト書きまくってあとはエディタの補完つかえばいいよ
817デフォルトの名無しさん:2007/04/29(日) 10:43:40
>>811
できなかないが、

それがやりたきゃrubyを使うなという類の要望だな。
変数の明示的宣言を極力排除するというのがmatzのある種のこだわりであり
rubyのアイデンティティでもある。
818デフォルトの名無しさん:2007/04/29(日) 11:45:16
Rubyのコンセプトではないし、本質的に考えてもそのスクリプト自体に負わせる仕事でもないよな
「そのスクリプトが正しいか調査するスクリプト」を作って本番稼動前に通せば用は足りる

ということでTestUnitでも作れ
あとコード補完機能のあるエディタでも使え
819デフォルトの名無しさん:2007/04/29(日) 11:56:21
p hoge if $DEBUG とかが大量にあるスクリプトは無駄だし作り方としてもイカンよな

でも楽なんだよ
820デフォルトの名無しさん:2007/04/29(日) 13:22:31
def なんとか
(foo,bar,baz) = Array.new, Array.new, Array.new
foo = 10文字位のメソッドチェーン
bar = 10文字位のメソッドチェーン
baz = 10文字位のメソッドチェーン

   :
   :

end

これって
「(foo,bar,baz) =Array.new, Array.new, Array.new の部分いらねーよバカ」
って思われる確率高いですか?
fooとbarとbazは名前から配列オブジェクトだということは見当がつきません
821デフォルトの名無しさん:2007/04/29(日) 13:31:59
高い
822デフォルトの名無しさん:2007/04/29(日) 13:48:20
>>820
型についての情報を記述したいということかな?
その書き方だと混乱する人が多いと思うから
# foo, bar, and baz are array
とコメントするか、
arr = 10文字位のメソッドチェーン
foo = arr
とするのがよろしいかと。
823デフォルトの名無しさん:2007/04/29(日) 13:52:10
>>820
明らかに無意味。
Array.newで初期化したからって他のものを代入できなくなるわけではない。

> fooとbarとbazは名前から配列オブジェクトだということは見当がつきません
配列かどうかが重要ならそういう名前にしろ。
でももっと重要な意味があるならそっちを優先しろ。
824デフォルトの名無しさん:2007/04/29(日) 13:52:25
>>814
スペルミス対策ということなら、直接 @var を使わずに self.var と self.var= を使えばいいんじゃないかな。
これなら実行時にエラーが出る。
accessorを定義していない場合は使えないけど。
825デフォルトの名無しさん:2007/04/29(日) 13:54:54
便乗だけど、じゃあ「与えられた配列からHTMLのテーブルを作って返す」メソッドで

def hoge_table(arr)
html=String.new
html << '<table>'
    …
end

とか書くのも読みにくいなと思われてる?
html='<table>' から始めたほうがいい?
826デフォルトの名無しさん:2007/04/29(日) 14:03:27
String.new とか Array.new とか Hash.new とかは普段使わないほうがいいよな
なにか特別な目的があって初めて使う程度がいいかと思われ

いちいち hoge = String.new とか hoge = nil とかしなくても
  = で指した瞬間から「そのオブジェクトだけをさししめすあたらしいへんすう」になるわけだし、
Ruby では明示的に new する積極的な意味はない、と思う

個人的にはいちいち new したくなる気持ちはわからんでもないんだが
827デフォルトの名無しさん:2007/04/29(日) 14:15:27
俺も、なんかinitializeあたりで明示したくなるんだよな
828デフォルトの名無しさん:2007/04/29(日) 14:16:42
String.newと書くくらいなら
html = ''
と書くなぁ。

>>825に限れば、erbを使えば、

erb = ERB.new(<<EOF, $SAFE, '%')
<table>
% ary.each do |a|
<tr><th><%= a[0] %></th><td><%= a[1] %></td></tr>
% end
</table>
EOF

return erb.result

みたいなのでもいけるかな。

829デフォルトの名無しさん:2007/04/29(日) 14:17:13
てゆーか、新しさを醸し出すならせめて
str = String.new('ほげほげ')
とか
arr = Array.new([1,2,3,4,5]) # <ruby 1.7 feature>
とか書いて欲しい

そうすればなんとなく伝わるぞ
たぶん

無駄さ加減も際立つので、これを続けてればある日から書かなくなる…と思う
830デフォルトの名無しさん:2007/04/29(日) 14:19:29
マッチした数というのはどうやって得られるのでしょうか?
例えば、hoge moge foo bar hoge mage
という文字列があって、hogeの数を知りたいのですが
831デフォルトの名無しさん:2007/04/29(日) 14:22:01
>>827

 ・ そのクラスに存在するインスタンス変数は initialize で全部 new する
 ・ そのメソッドで return する変数は def の直後に明示的に new する

病気
832デフォルトの名無しさん:2007/04/29(日) 14:25:06
/hoge/i =~ "hoge moge foo bar hoge mage"
p $~.size

だと、1になってしまいますよね?
833デフォルトの名無しさん:2007/04/29(日) 14:25:43
メモリ効率を気にしないでいいなら
str.scan(/hoge/).size

数を数えるためだけに配列が作られるのが嫌なら
count = 0
str.scan(/hoge) { count += 1 }
# ゼロで初期化するのが嫌ならenum_forとinjectで書き換え。
834デフォルトの名無しさん:2007/04/29(日) 14:27:30
む、
/(hoge)/ =~ "hoge..."
だと2になるな。
835デフォルトの名無しさん:2007/04/29(日) 14:29:25
>>833
puts "hoge moge foo bar hoge mage".scan(/hoge/).size

でいけました。
どもです。
836デフォルトの名無しさん:2007/04/29(日) 14:31:19
>>834
部分文字列という概念がある

/(foo)(bar)(BAZ)?/ =~ "foobarbaz"
p $~.to_a # => ["foobar", "foo", "bar", nil]

はっきり言ってわけわかめ
素直にscanしたほうがいい
837デフォルトの名無しさん:2007/04/29(日) 14:31:20
>>834
一応、解決はしたのですが、>>834はなんで、2になるんですかね?
()つけると、1回目のマッチで終わらないんですかね?
838デフォルトの名無しさん:2007/04/29(日) 14:32:26
>>836 おお、ありがとう
839デフォルトの名無しさん:2007/04/29(日) 14:45:21
>>825
html = String.new じゃなくて html = '' で始めればいい。
>>820の場合は foo = Array.new と初期化したあと、そのarrayは使われていないから、この初期化自体が無駄。
しかし>>825の場合は html = String.new したあとその string は使われているわけだから、無駄ではない。
840デフォルトの名無しさん:2007/04/29(日) 14:51:19
>>820
は、無意味だよなあ。
Rubyは変数定義を極力しないという設計だからなあ。
ただ、他の言語で言う変数定義して明示したい場合は、
変数名でカバーするしかないだろう。
841デフォルトの名無しさん:2007/04/29(日) 14:52:41
>>820は「10文字くらいのメソッドチェーン」で配列が返ってくるんじゃねえの
foo = Array.new とかするような人は foo には絶対に配列入れるだろ

Array を new する場合はサイズを指定するかfillする詰め物を指定するかのどっちかが普通だから
new だけされてもなんだかなという気はする
foo = [] と書かれたほうがまだマシかもしれん
842デフォルトの名無しさん:2007/04/29(日) 14:59:39
foo[0] = 何か などと(直後に)する場合には
foo = [] とか foo = Array.new とかの意味はあると思う(Hashも同様)

foo = 配列を返す何か とする場合は foo = Array.new は意味薄いかと
書き方論だけで言うなら

# アレでナニな配列をfooに
foo = 配列を返す何か

とコメント付きでいきなり代入書いたほうが「わかりやすい」と思う

Stringの場合はちょっと事情違うかも
843デフォルトの名無しさん:2007/04/29(日) 15:03:07
変数名を複数形にするとかな。
羊や鯉のリストを返すんだって人は別の命名を考えてくれ。
844デフォルトの名無しさん:2007/04/29(日) 15:11:09
>>842
そうだな。
プログラムとして意味があるかどうかというよりは、単にわかりやすさの話だとは思うんだが(w
俺がそういうのでnewするのはたまにRegexpでやるくらいかな。
少なくとも、事前にStringやArrayをnewするのは「ふつーではない」とは思う。
845デフォルトの名無しさん:2007/04/29(日) 15:46:55
>>843
存在しなくても sheeps, carps を使うんだ!
846デフォルトの名無しさん:2007/04/29(日) 17:50:36
漢字変換のプログラム書いてた時、いい変数名が思い浮かばず
okuriganas = ... # 送り仮名の配列
みたいになって悲しくなったことを思い出した
847デフォルトの名無しさん:2007/04/29(日) 18:13:24
与えられた配列の各要素をキー、その出現回数を値とするHashを求める
簡潔な方法があったら教えてください。

a = [3,5,3,1,5,5]
h = Hash.new(0)
a.each {|x| h[x] += 1 }

というのを考えたのですが、これだとhを初期化しているのがなんかださい。
collectとか使って1行でスパッと求める方法はないでしょうか。
848デフォルトの名無しさん:2007/04/29(日) 18:30:50
a.inject(Hash.new(0)) {|h, e| h[e] += 1; h }
より簡潔なのは思いつかなかった。
849デフォルトの名無しさん:2007/04/29(日) 18:31:48
inject万能だな…困ったときはinjectか?
850デフォルトの名無しさん:2007/04/29(日) 18:35:39
require 'active_support'

h = a.group_by{|k| k}
h.each{|k,v| h[k]=v.size}

もうちっと工夫の余地はないかのう……
851デフォルトの名無しさん:2007/04/29(日) 18:41:57
group_byしたあとにmapすると、Hashじゃないけど、
連想リスト(associative list)にすることはできるな。

alist = a.group_by{|k|k}.map{|k,v| [k, v.size]} # .sort
=> [[5, 3], [1, 1], [3, 2]] # => [[1, 1], [3, 2], [5, 3]]

探すときは assoc, rassoc を使う。線形検索なので性能的な期待はナシで。
852デフォルトの名無しさん:2007/04/29(日) 18:44:58
せんせー、最初のが一番わかりやすいでーっす
853MoonWolf ◆MoonWdLnkQ :2007/04/29(日) 18:53:31
>>848
簡潔か?
後で読むときに悩むから>>847程度でいいよ。
hの初期化は変数宣言と同じようなもんだから問題なし。
854デフォルトの名無しさん:2007/04/29(日) 18:57:22
とゆーか
> 与えられた配列の各要素をキー、その出現回数を値とするHash
これ自体がとってもわかりにくいと思われ

出現回数が必要になった時点でその場で数えるとか
あるいは素直に{'data'=>arr, 'count'=> N}とか
そういう構造にしたほうが見通しがいいと思う
855デフォルトの名無しさん:2007/04/29(日) 19:09:45
>>849
というか元のinjectやらreduceやらfoldやらの
折り畳み関数の概念が秀逸なのかもしれん
856デフォルトの名無しさん:2007/04/29(日) 19:11:34
面妖な構造のハッシュを見ると初心者っぽくて和む
857デフォルトの名無しさん:2007/04/29(日) 19:31:07
>>855
元というなら、injectではなくinject:into:だ。
858デフォルトの名無しさん:2007/04/29(日) 21:45:29
>>721
未だにUnicode特有の文字列を含むファイルの処理に困っている>>686です。

FindFirstFileW を 呼べばいい事はわかったんですが
呼び方がわからず躓いてしまっています

調べてわかった所まで書かせて頂きますと、

FindFirstFileWの第一引数は対象のパス
第二引数はデータを格納する構造体
メンバは
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
WCHAR cFileName[260];
WCHAR cAlternateFileName[14];
対応するpackテンプレート文字列はどうすれば特定できるのかわかりませんでした…。
-----
肝心のコード書ける所まで書いてみました
require 'Win32API'
obj = Win32API.new('kernel32.dll','FindFirstFileW',%w(p p),'i')
obj.call("X:\\*", ?)

わからない所は 構造体を Array.pack を使って置き換える部分と
そのデータの扱い方そのものです

誰か動かし方ご教授願えませんでしょうか…。
859MoonWolf ◆MoonWdLnkQ :2007/04/29(日) 22:37:45
>>858
W系APIはUCS-2なのでUconvとか使わないと駄目。
860デフォルトの名無しさん:2007/04/29(日) 23:41:35
クックブック見たけど面白かった
レシピブックは「ふーん」だけどクックブックは「へー」って感じ
ひさしぶりに読んで何か作りたくなる本
861847:2007/04/29(日) 23:41:42
みなさんありがとうございます。
>>848 injectはこんな使い方ができるんですね。
解読に20秒くらいかかりましたが、ちょっと感動しました。
group_by(というかActiveSupport)も知らなかったので参考になりました。

もともとやりたかったのは(情報が後出しになってすみません)、
アンケートデータのようなものを集計して、回答回数が多い順に
データと回答回数をCSV形式で出力することだったんですが、
思いついたのが以下のコードで、

a = [3,5,3,1,5,5]
h = Hash.new(0)
a.each {|x| h[x] += 1 }
h.keys.sort_by {|k| h[k]}.reverse.each {|x| puts "#{x}, #{h[x]}"}

2,3行目を一行にできれば、その後ろに4行目を続けて全部で一行になるのにと思ったのでした。
でもよく考えるとsort_byでh自身を参照してるので一度hを作らないとダメですね。
ていうか4行目もなんかダサい気がします。
ハッシュをソートしたりする場合はハッシュではなく
>>851のように連想リストを使う方がよいのかもしれません。
862デフォルトの名無しさん:2007/04/30(月) 00:12:04
ActiveSupport の blank? と Symbol#to_proc 大好き。
863デフォルトの名無しさん:2007/04/30(月) 00:20:44
クックブックは面白そうなことがちょこちょこ書いてあるんだがちと高いな
立ち読みして記憶するにはボリュームあり過ぎだし困ったもんだ


…わかったよお金の暇見て買うよ
864デフォルトの名無しさん:2007/04/30(月) 00:22:07
ちなみにいくら?
865デフォルトの名無しさん:2007/04/30(月) 00:22:45
procとかyieldとかあのへんはさっぱりわかんない
もしかしたら役に立つかもしれないと思ってマニュアルは見るんだけど
何書いてあるかわかんないし
866デフォルトの名無しさん:2007/04/30(月) 00:25:16
>>864
ttp://www.amazon.co.jp/dp/4873113245/
4095円

オライリーの厚めの解説本としては高いほうじゃないんだがね…
867デフォルトの名無しさん:2007/04/30(月) 00:29:07
>>860
あれ読んで作りたくなるかなぁ。
たしかにJavaはフレームワークが複雑になってるけど
RubyはRails以外なにもないじゃん。
Webアプリケーション作るだけが仕事じゃないからねぇ。
実際今のlispブームと同じで一時的な集団逃避妄想にすぎない。
868デフォルトの名無しさん:2007/04/30(月) 00:30:20
>>861
ハッシュじゃないとダメなの?

a = [3,5,3,1,5,5]
l = a.uniq.sort.reverse
l.each {|x| puts "#{x} #{(a.reject{|y|x!=y}).size}"}
869デフォルトの名無しさん:2007/04/30(月) 00:37:10
とりあえず、Dir.glob, Dir.openあたりを
UTF-8に対応させてみたけど、要る?
870デフォルトの名無しさん:2007/04/30(月) 00:37:36
>>867
Railsの話を持ち出してるのは君だけだぞ
871868:2007/04/30(月) 00:42:33
あゴメン、すげー勘違いしてた
872デフォルトの名無しさん:2007/04/30(月) 00:42:49
>>861
> でもよく考えるとsort_byでh自身を参照してるので一度hを作らないとダメですね。
h.sort_by {|k, v| v}.reverse_each {|k, v| puts "#{k}, #{k}"}

> ハッシュをソートしたりする場合はハッシュではなく
> >>851のように連想リストを使う方がよいのかもしれません。
実際にはsortやsort_byで連想リストに変換されるんだが。
873デフォルトの名無しさん:2007/04/30(月) 00:46:00
>>858
codepage 65001 ってのがUTF-8らしいんだが、どうもシステム全体の設定を変
えないとUTF-8で返って来たりしないようだな。
874デフォルトの名無しさん:2007/04/30(月) 00:51:39
hashにhogeっていうキーが無い場合に何かしたいです
hash['hoge']は値''を取り得ますのでhash['hoge'].empty?は駄目です

unless hash.has_key?('hoge')

より

if hash['hoge'].nil?

のほうがわかりやすいですよね
875デフォルトの名無しさん:2007/04/30(月) 00:56:46
unlessでも別に分かりにくくはないので「よね」と言われても困るが、
それこそActiveSupportのblank?の定義を貰ってくれば?
876デフォルトの名無しさん:2007/04/30(月) 00:59:57
hash['hoge'] が絶対に nil にならないなら後者でもいいかと
str = nil のまま hash['hoge'] = str されるとか

そーゆー罠みたいな細かいことを考えなくていいのが前者
? つきのメソッドと unless の組み合わせは慣れないと読み下しにくいけどな
877デフォルトの名無しさん:2007/04/30(月) 02:13:07
>873
プロセス単位くらいでACPを変更できるならそれで
おわったんだろうけどね。
http://www.ocs-htn.com/ruby/
こういう手段しか使えない俺
878858:2007/04/30(月) 02:51:05
レスくれた方ありがとうございます
>>859
どこかに動かしてるサンプルないでしょうか?
どの段階でuconvの機能を使えば良いかわかりません…。
>>869
とても、とても、とても欲しいです。
>>873
そういう事しないと返ってこないですか…。
879デフォルトの名無しさん:2007/04/30(月) 03:21:40
>>868
アルゴリズムとしてとても遅い。真似すべきではない。
880デフォルトの名無しさん:2007/04/30(月) 05:48:35
>>865
きみがあほなだけ
881デフォルトの名無しさん:2007/04/30(月) 09:09:44
そんなんで優越感得られるなんて君の世の中はずいぶん狭いな
882デフォルトの名無しさん:2007/04/30(月) 09:33:41
そーゆーこと言うとどっかのスレみたく「学校ではプログラマですが何か?」とか
そういうレスが返って来るからやめといたほうが…
883デフォルトの名無しさん:2007/04/30(月) 09:50:18
>>868
これはシンプル!>>879さんのいうように、実行速度を確認してから
採用を判断したいと思います。

>>872
Hashでsortが使える、というかEnumerableで使えるすべての関数を
使えることに今気付きました。(^^;
あと連想リスト、というか二次元配列のeachってブロックのパラメータを複数指定して、
a = [[1,2,3],[4,5,6],[7,8,9]]
a.each{|x,y,z| p "#{x},#{y},#{z}"}
みたいなことができるんですね。びっくりです。勉強になりました。
884デフォルトの名無しさん:2007/04/30(月) 10:13:41
>>870
本読んでないでしょ。「Java to Ruby」の話を持ち出されたので、その内容に書いてあるrailsの話をだしたまで
885811:2007/04/30(月) 12:54:40
遅レスすいません。
変数宣言の件、どうもでした。
スペルミスしまくってしまう人間なので
ちょっとしたもの作るときのことも考えると、
自分は Ruby 使うことができなさそうっす。
Perl から PHP, Python, Ruby のどれに流れようかと
迷ってましたが、また Perl に戻るしかないのか…orz
御目汚し失礼しました。
886デフォルトの名無しさん:2007/04/30(月) 13:05:03
「Perlを使っているから自分で作った変数すらスペルミスをしっ放し」なんだということに
早めに気づいたほうがいいと思う
887811:2007/04/30(月) 13:39:56
>>886
スクリプトを書いているときに
スペルミスをしないように意識することはそんなに重要なんでしょうか?
ミスしないほうがいいに決まってるんですが、
そこに気を張っていると疲れてきてしまうような気がして…。
「ミスしたら教えてくれる」と「ミスしても教えてくれない」って
大きい気がしています。みんなあんまりスペルミスしないのかなぁ。
ってこれスレ違いでしょうか?
もし、こういう話題でいいスレあったら誘導して頂けたら
ありがたいです。
888デフォルトの名無しさん:2007/04/30(月) 13:49:12
eclipse
889デフォルトの名無しさん:2007/04/30(月) 14:21:02
Emacs使いならdabbrevとか
890デフォルトの名無しさん:2007/04/30(月) 14:25:17
vi使いなら





m9(^Д^)
891デフォルトの名無しさん:2007/04/30(月) 14:30:26
マンセーでなーーんも考えてない奴らはともかく、matzはミススペルはしないんだろうな。
でなきゃ、こんな仕様に好んでするわきゃない。
892デフォルトの名無しさん:2007/04/30(月) 14:35:34
ミススペルを自動で直してくれる言語処理系は存在しない。
それはデバグ機能とかエディタとかIDEのお仕事。
893デフォルトの名無しさん:2007/04/30(月) 14:37:51
なんか意味不明なネタで盛り上がっているようだが
クラスって使うもんで作るもんじゃないだろ。
常識的に考えて・・・
894デフォルトの名無しさん:2007/04/30(月) 14:40:55
その変数やメソッドが「未使用」や“未定義”であるかどうかを調べるのは
Rubyパーサ本体の仕事ではないと考えたんだろうね

わからんでもないが

つか別に現状でもできなくはないだろ
895デフォルトの名無しさん:2007/04/30(月) 14:41:56
えっおいらは

foobar.rb
---
class Foobar
...
end

if $0 == __FILE__ then
Foobar.new.exec
end
---
とかよくやるけどなあ。
896デフォルトの名無しさん:2007/04/30(月) 14:44:29
そもそもの問題として、Rubyのinitializeにそんな特殊な権限はねーよ
897デフォルトの名無しさん:2007/04/30(月) 15:18:53
つか、matzがインスタンスにインスタンス変数が追加される時のフックのためのAPIを用意しててくれれば
済むはなし。こういうのが必要にされるという想像力が、絶望的に欠けてるんだよなあ。あのヒトには…。
898デフォルトの名無しさん:2007/04/30(月) 15:52:04
なら、要求すれば?
899デフォルトの名無しさん:2007/04/30(月) 16:22:29
論理的に必要性が説得できればつけてくれるよ。
900デフォルトの名無しさん:2007/04/30(月) 16:35:11
901デフォルトの名無しさん:2007/04/30(月) 17:12:14
というか、要求が通るとおらない以前にここでぼやいてるだけじゃねーか。
matzに見えるところでやれよう。
902デフォルトの名無しさん:2007/04/30(月) 17:14:38
Meadowでirbshを動かせてる人いますか?

M-x irbshとすると

irb(main):001:0>

というプロンプトがでて、行頭にスペースを入れると、

irb(*SHELL*):001:0>

となるので、irbshの起動はできているのですが、
プロンプトに式を入力してEnterキーを押しても、式が評価されず、
改行が挿入されてしまうだけの動作になってしまいます。
途中で無茶な入力をすると、

NameError: undefined local variable or method `' for main:Object

とでて、プロンプトが復帰しますが、動作は変わりません。

---
環境:
Meadow 3
ruby 1.8.6(One-Click Ruby Installer)
irbsh 1.0
irb 0.9.5

903デフォルトの名無しさん:2007/04/30(月) 19:07:15
>>901
matzはここ見てるから
ここで話題になったらもう駄目
904デフォルトの名無しさん:2007/04/30(月) 19:13:22
>891
長いことプログラミングやってると間違えなくなってくるからなぁ。
それでも、稀にハマることはあるが。

あんまり広い範囲に影響するような変数を極力作らない。
1画面に収まるような場所同士の変数名は間違えたとき判りやすい。


どーにも心配なら、

class << vars = nil
  attr_accessor :a, :b, :c
end

とかやって、全ての変数を vars.変数名= の形で扱うとかどうよ。
そうすれば、アクセサの定義されてない vars.d= は例外になる。
905デフォルトの名無しさん:2007/04/30(月) 19:18:18
>>903
自信ありげだな。
906904:2007/04/30(月) 19:18:34
ああ、この場合はインスタンス変数の話だからこうか

class MyClass
def initialize
@vars = nil
class << @vars
attr_accessor :a, :b, :c, :d
end
end
def test
@vars.a = 1
@vars.b = 1
@vars.c = 1
@vars.d = 1
@vars.e = 1
end
end
obj = MyClass.new
obj.test

test09.rb:13:in `test': undefined method `e=' for nil:NilClass (NoMethodError)
from test09.rb:17
907デフォルトの名無しさん:2007/04/30(月) 20:09:28
nilに特異メソッド定義するなよ
908デフォルトの名無しさん:2007/04/30(月) 20:52:16
>>906
つか、お前、もう、いいから。
909デフォルトの名無しさん:2007/04/30(月) 20:57:17
Matzを追い出すなんてw
910811:2007/04/30(月) 21:03:14
色々ご教授頂きありがとうございます。

>>888
RDT とかですか?
そうですね。書くときのミスを減らすって意味では
いいかもしれませんよね。
Perl の use 'local' みたいなものがあったら
もっと嬉しいですけど。

>>891
後半の部分、これが全てのような気がします。
私みたいなオマヌケには使えないのかもしれません。
イテレータとかミキシンとか楽しそうなんですが…残念。


>>906
これなら簡単にできそう、と思いました。
でも、いきなりこれ書いたら多くの Ruby 使いさんは
???ってなってしまうんでしょうね。

Ruby も Rails も面白そうで本を読みつつ頑張ってますが、
私が入れそうな世界じゃないのかも…面白そうなのに(つдT
911デフォルトの名無しさん:2007/04/30(月) 21:09:22
                    ,. --―…、
                  /    /:. \
                ./    /::::::::::. ヽ
                ‘ー--一'´ \:::::::.  ',
                        ヽ:::::.  !
            /⌒丶   ,. .-.''.´ . .',::::  |` 丶、
           /    !:::::..\/ . . . . . \.L__ l. . . \
           |   |――/. /、 . . . . . . .ヽ . ヽ . . . .ヽ
           |   j  /. ./ \.ヽ . . . . .'., . . . . . . .',
           |   /  |. . l   \_. . . . ',. . . . . . ..|
           |  /   |:.._l     ´\ . . . . !. . . . . . .|
           l   /   .|´.l _     ,r7jヽ,. .:.r ‐、 . . ...|
           |_,ノ    |. .!イト、    弋:ソ!. ..|  〉 . .:.|
                 |.小 ヾ'    , , , |:!. |! イ. . . ..|
                 |. |..ハ'''        |リ!.|l . !. . . . |
                 |. | |. ヽ、,-_ _ -' ''|.!ヽ.|:.. . . .|
                 |. | |! . . ._ -'     |l  ヽ:.:. . .|
                 |._| > ''         |!   ', . ...|
            __r‐'7 ̄!.               !:. .:.|
       ,r=―フ/  |  |     _ ,, --      !:. .:.|
      /__/   |   l  l  _. - '          /l. . .|
  _r''厂\     !   ! l ''            / !i . !
 //     \    |   !:人              /  i i:リ
./|    ヽ_        ヽ!个‐'           /    i i
| .!       \    __/l /             /
∨\       /   /_l /            /
. |  \rへ _/ヽー '   ∨          /

912デフォルトの名無しさん:2007/04/30(月) 21:28:07
>>906
class << @vars
attr_accessor :a, :b, :c, :d
end

配列オブジェクトに後から要素(フィ-ルド)を追加できるのね。
class << @vars の "<<" の記号って ruby だと良く使われる
ものなの?それともあまり一般的ではないのかな?結構素敵だとおもた。
913デフォルトの名無しさん:2007/04/30(月) 21:30:00
>>911
詳細をkwsk
914811:2007/04/30(月) 21:32:26
>>906
配列オブジェクト…?ってどこからそう思われたんでしょうか?
@ ってインスタンス変数のプレフィックスだと思ってたんですが…。
915811:2007/04/30(月) 21:33:56
× >>906
>>912
です。
916デフォルトの名無しさん:2007/04/30(月) 22:28:31
>>914
クラス定数 ABC = ['A','B','C']
クラス変数 @@value = 1
グローバル変数 $x += 1
インスタンス変数 @vars = nil

perl スカラー変数,配列変数 => 接頭辞($,@)
ruby グローバル変数, インスタンス変数 => 接頭辞($,@)

インスタンス変数に後付けで幾つかのフィールドを設定する
配列オブジェクトとか訳わからんこと言ってごめんなさい ><

Rubyの文法あれこれ
http://www.altum.jp/math/ruby/15.html
http://ja.wikipedia.org/wiki/Ruby 「attr_readerはRubyにおけるメタプログラミングの例であり…」

あんま慣れてない言語だと勝手がわからんとです orz
917デフォルトの名無しさん:2007/05/01(火) 00:48:21
>>887
その考えはただしいけど、Rubyでは直接サポートされてないからしかたない。
できるのはせいぜい @x ではなくて self.x をつかうぐらい。これならスペルミスしたときに実行時エラーになる。
あと、rubyを-wつきで実行すると、値を設定されていないインスタンス変数を参照したときに警告が出る。
918デフォルトの名無しさん:2007/05/01(火) 07:44:00
> rubyを-wつきで実行すると、値を設定されていないインスタンス変数を参照したときに警告が出る。
これで十分。
919デフォルトの名無しさん:2007/05/01(火) 10:39:00
変数を宣言するようにしてれば
920デフォルトの名無しさん:2007/05/01(火) 11:04:43
>>918
-wをつけても、タイプミスしたインスタンス変数への代入は警告が出ないから、十分ではない。ないよりはましという程度。
921811:2007/05/01(火) 13:36:21
>>917
>>920
そうなんです。代入でタイポしたら終わりなのであんまり意味ないんです。
私は今朝も遊びでちょろちょろ書いてたらスペルミスして
怒られてしまうようなヘタレだったので、
>>>888
さんが言われるように eclipse がいいのかもしれませんね。
あれはあれで . 打ってすぐに補完、
というわけに行かないので面倒ですけど。
922デフォルトの名無しさん:2007/05/01(火) 13:42:24
インターフェイスとか抽象メソッドみたいな仕組みはどうやって実現する?
923デフォルトの名無しさん:2007/05/01(火) 13:50:15
製作中にエラーを一度でも起こしたら誰かに殺されるとかいう用途にはRubyは向かない

Rubyを「その言語」のように矯正しようとせずに素直に他の言語使うんだな
924デフォルトの名無しさん:2007/05/01(火) 13:52:25
かつての型なし言語逝ってよしスレみたいな流れだな・・・
925デフォルトの名無しさん:2007/05/01(火) 14:08:00
>>884
「Ruby クックブック」と「Java から Ruby へ」を混同してない?
926gost :2007/05/01(火) 14:13:22
符号なし整数型の変数 n が、4の倍数であれば、"n is ROUND(4)"、
>> 4の倍数で無ければ、"n is not ROUND(4)" を出力するプログラム
条件:一切の条件分岐文を使ってはならない
927デフォルトの名無しさん:2007/05/01(火) 14:16:57
>>922
メソッドfooを持っていれば基底クラスやインターフェース関係なく
どんなオブジェクトもfooを持つものとして統一的に扱えるから
そんなものは不要ってことになってるらしい。
928デフォルトの名無しさん:2007/05/01(火) 14:19:08
生成した SQL が (意味的に) 等価かどうかテストするのに良い方法って無いすかね?

actual = "SELECT * FROM foo WHERE baz = 'qux' AND bar = 42;"
expected = "SELECT * FROM foo WHERE bar = 42 AND baz = 'qux';"
assert_same_sql(expected, target) # => pass

みたいな。
929デフォルトの名無しさん:2007/05/01(火) 14:19:17
930デフォルトの名無しさん:2007/05/01(火) 14:25:03
if n % 4 == 0 then
puts "#{n} is ROUND(4)"
else
puts "#{n} is NOT ROUND(4)"
end

条件分岐文使ってないよ
931デフォルトの名無しさん:2007/05/01(火) 14:25:10
def r4(n)
print "n is #{["not ", ""][((n>>2)&1)]}Round(4)"
end
932デフォルトの名無しさん:2007/05/01(火) 14:29:52
>>930
Rubyのifは文ではなく式だからね…
設問的には「ifやunlessや三項式を使ってはならない」と正確に書くべきだな
933デフォルトの名無しさん:2007/05/01(火) 14:43:32
「一切」というと、print内部で条件分岐が含まれてたりするのは
問題になるのかね?
934デフォルトの名無しさん:2007/05/01(火) 14:48:03
Rubyで記述されてなけりゃOKなんじゃね
935デフォルトの名無しさん:2007/05/01(火) 14:49:08
無理してレスしなくていいんだよ?
936デフォルトの名無しさん:2007/05/01(火) 14:58:48
じゃあ無視すれば?
937デフォルトの名無しさん:2007/05/01(火) 15:19:36
>>927
プラグインみたいなのを作るときに、「このメソッド実装してね」ってのはどうやるの?
938gost :2007/05/01(火) 15:19:43
def r4(n) ?
c言語?

939デフォルトの名無しさん:2007/05/01(火) 15:28:18
>>937
ドキュメントに明記
実装し忘れたらそのメソッドを呼び出した時点でエラー
やりたきゃプラグイン登録時にmethodsでも調べてチェック
いじょ
940デフォルトの名無しさん:2007/05/01(火) 15:29:55
>>937
raise NotImplementedError
941デフォルトの名無しさん:2007/05/01(火) 16:04:52
>>926
s=['','not','not','not']
6.times{|n| puts "#{n} is #{s[n%4]} ROUND(4)"}
942デフォルトの名無しさん:2007/05/02(水) 00:01:13
RAAにあるnet-hatenaを使いたいのですが、インストール方法がわかりません。
当方の環境はMacOSXですが、Win向けでもかまいません。
ご教授お願いします。
943デフォルトの名無しさん:2007/05/02(水) 01:16:16
ほほう
944デフォルトの名無しさん:2007/05/02(水) 02:32:30
def printer(str)
 puts str
end

def caller(path, func)
 Dir::foreach{|file|
  func(file)
 }
end

caller("/", printer)
関数ポインタをつかおうと書いたのですがえらーになちゃいます
945デフォルトの名無しさん:2007/05/02(水) 03:49:21
>>944
そういうときはブロックで包んでやる(Dir.foreachにパラメータが必要なので補っておいた)
def printer(str)
  puts str
end

def caller(path, &func)
  Dir::foreach('.'){|file|
    func.call(file)
  }
end

caller("/") do |str|
  printer(str)
end

あと、callerというのは定義済みの関数なので、再定義しない方がいいと思う。
946デフォルトの名無しさん:2007/05/02(水) 03:57:26
「いわゆる関数ポインタ」とか「関数ポインタのようなもの」と表現しないと
Rubyには関数ポインタなんて存在しませんが何か、とかつまんない突っ込み受けそうだ
947945:2007/05/02(水) 04:01:18
突っ込もうかと一瞬だけ思ったけど、言っても詮無いことだと思って言わなかった。
書いたの見てたらブロックで括るのもなんか違うような気がしてきた。
948デフォルトの名無しさん:2007/05/02(水) 04:14:30
「引数」でメソッド渡す場合の一番素直な方法はブロックだと聞いた

関数のポインタを渡す、というイメージとコードの字面のギャップは確かに大きいけど、動作的には真っ当かと…
949デフォルトの名無しさん:2007/05/02(水) 06:34:05
>>946
Ruby信者は初心者スレでもそんな感じだからな。いい読みだ。
950デフォルトの名無しさん:2007/05/02(水) 07:33:10
でも現れませんでしたねw
951デフォルトの名無しさん:2007/05/02(水) 07:41:28
毎度>>946相当の書き込み(それはつまんないんだぞ、という事前の水差し)があれば
信者も興奮しなくて済むんだけどな。
952MoonWolf ◆MoonWdLnkQ :2007/05/02(水) 07:49:13
>>942
インストーラ入れ忘れてました^^;
RAAのほう、更新しておきました。

インストール方法は

$ setup.rb config
$ setup.rb setup
# setup.rb install

または

# setup.rb
953デフォルトの名無しさん:2007/05/02(水) 07:51:05
のわりには、>>946のまえに>>945が書かれてますねw
954デフォルトの名無しさん:2007/05/02(水) 08:00:56
>>953
? それがどうかしたの?
955デフォルトの名無しさん:2007/05/02(水) 08:18:36
>>946を読んでも意味が分からなかったんでしょう。
関数ポインタでやることに一番近いのはprocですかねい。
956デフォルトの名無しさん:2007/05/02(水) 09:12:52
>>944 こーゆーのDO?
def printer(str)
 puts str
end

def mycaller(path, visiter)
 Dir::foreach(path) {|file|
  visiter.call(file)
 }
end

pfunc = proc{|str| printer(str)}
mycaller( path, pfunc )
957デフォルトの名無しさん:2007/05/02(水) 09:22:13
【社会】 囚人が「ソフト開発」、まずは女性受刑者から…日本初“民営刑務所”
http://news22.2ch.net/test/read.cgi/newsplus/1178019675/

> この計画を立ち上げたのは、刑務所まわりの業務に特化したベンチャー企業「プリズニーズ」
>  で、07年5月1日に発表された。同社からSEを2人送り込み、選抜された受刑者60人に対して
>  4ヶ月にわたってプログラミング言語「ルビー(Ruby)」に関する教育を行う。

お前らこの程度だよ
958デフォルトの名無しさん:2007/05/02(水) 09:22:21
def printer(str)
puts str
end

def mycaller(path)
Dir::foreach(path) do |file|
yield(file)
end
end

mycaller(path, &self.method(:printer))

とか。
959デフォルトの名無しさん:2007/05/02(水) 10:32:46
javaでxlsファイルをよみこんでcsvファイルに変換したいのですが・・
2日間悩んでますが、まだ解決しません

960デフォルトの名無しさん:2007/05/02(水) 10:33:21
スレ違いでは
961デフォルトの名無しさん:2007/05/02(水) 11:02:30
ところがrubyでやったら5分で解決しました、とかいう話?
962デフォルトの名無しさん:2007/05/02(水) 11:12:21
なんてったってJavaの10倍の生産性だからな!

正確には「RoRでやれることをJavaで作ろうとすると10倍手間がかかる」だと思うんだが
まあ所詮アオリ言葉だしそのへんは鵜呑みにする人がプギャーだということで放置

Javaコードを吐き出すRubyスクリプトとか誰か作ってないかな
963デフォルトの名無しさん:2007/05/02(水) 11:13:57
実際にコスト比較したケースってあるのかな?
964デフォルトの名無しさん:2007/05/02(水) 11:14:07
はい、次の初心者さんドゾー↓
965デフォルトの名無しさん:2007/05/02(水) 11:26:32
他のファイルにあるクラスを利用する時はどうすればいいのでしょうか?
(C/C++のincludeみたいな事です)
966デフォルトの名無しさん:2007/05/02(水) 11:29:01
require とか include すればいいんじゃね?
後に続くファイル名にはある程度規則があるので気をつけること
967デフォルトの名無しさん:2007/05/02(水) 11:45:50
>>966
requireで出来ました!ありがとうござます
968デフォルトの名無しさん:2007/05/02(水) 11:57:33
>>962
最近試してみて判ったことなんだけど
Java (GWT) >>>> RoR だと思う
969928:2007/05/02(水) 12:08:31
別に SQL に限らなくても良いんですが、
この手のコードジェネレーション的なモジュールのテストって
みんなどうやってるんでしょ?
やらない?
970デフォルトの名無しさん:2007/05/02(水) 12:15:10
RoRのスゴいっぷりはひとえに「どれくらいのものをどれだけの手間で作るか」にかかってると思う
「ある程度以上」を突き抜けるメリットがなんもないからね
通常限界を超えて実装しても、それはおそらく他言語フレームワークよりもいびつで不安定で遅い
971デフォルトの名無しさん:2007/05/02(水) 12:16:09
>>952
作者様ありがとうございます。
今晩、試してみます。
972デフォルトの名無しさん:2007/05/02(水) 18:29:27
>>968
GWT かなり気になってたんですが、
どの辺が RoR よりよかったですか?
973942:2007/05/03(木) 00:26:40
>>952
インストールは無事に済んでいるはずなのですが、
keywordlink.rbのset_keyword_linkメソッドを使おうとしてもライブラリが利用できません。

require 'net/hatena' でもだめ。
requireをなくして Net::Hatena::Diary.set_keyword_link(hoge)でもだめでした。

大変お手数ですが、簡単なサンプルをいただけないでしょうか?
974デフォルトの名無しさん:2007/05/03(木) 01:05:55
Windows で Gyre 使ってみたかったのですが
下記のようなエラーが出てしまいます。
もしかして Windows 環境では Gyre 使えないのでしょうか?

C:\>gem install -y ruby-debug coderay
Bulk updating Gem source index for: http://gems.rubyforge.org
Building native extensions. This could take a while...
ERROR: While executing gem ... (Gem::Installer::ExtensionBuildError)
  ERROR: Failed to build gem native extension.

ruby extconf.rb install -y ruby-debug coderay
can't find header files for ruby.


Gem files will remain installed in C:/usr/local/ruby/lib/ruby/gems/1.8/gems/ruby-debug-base-0.9.3 for inspection.
Results logged to C:/usr/local/ruby/lib/ruby/gems/1.8/gems/ruby-debug-base-0.9.3/ext/gem_make.out
975デフォルトの名無しさん:2007/05/03(木) 01:12:14
>>974
>ERROR: Failed to build gem native extension.

これの意味が分からないなら諦めてくれ。
分かるならとりあえずやってみることを思いつくはずだが。
976デフォルトの名無しさん:2007/05/03(木) 06:43:48
puts "OK!" if(なんたら)

こういうの何っていうの?
『後置条件判定文』とか俺用語で理解するのは
いい加減どうかと思うんだ漏れ orz
977デフォルトの名無しさん:2007/05/03(木) 07:38:57
if修飾子 or 後置if
978デフォルトの名無しさん:2007/05/03(木) 09:08:00
>>977
後置if修飾子 って言わないと普通のif文とごっちゃにならない?
細かいことだけど。というかrubyだとifって文じゃなくて式なの?

プログラムは
C言語しかやったことないからよくわからないです orz
979デフォルトの名無しさん:2007/05/03(木) 09:13:45
ため口で質問してるみたいになってしまってすみません
なんか日本語が不自由だ orz
980デフォルトの名無しさん:2007/05/03(木) 09:23:52
>>978
Rubyのifやcaseは式ですよ。代入も出来ます。

signum =
 if x < y
  -1
 elsif x > y
  1
 else
  0
 end
# 例が悪いか。

class ... endも式です。返すのはnilですが。
981デフォルトの名無しさん:2007/05/03(木) 09:41:07
>>980
なんかシンプルで面白いです。少しあとはじぶんで調べてみようと思います。
ありがとうございました! thx
982デフォルトの名無しさん:2007/05/03(木) 10:20:22
if hoge

end

は式じゃなくて文だよ。
983デフォルトの名無しさん:2007/05/03(木) 10:21:57
式だから、三項演算子で

status = n % 2 == 0 ? 'even' : 'odd'

と書くかわりに

status = if n % 2 == 0 then; 'even'; else; 'odd'; end

と書いても動作するんだよな
984デフォルトの名無しさん:2007/05/03(木) 10:35:45
Win32APIのラッパー書きまくってまとめてあるようなサイトというかライブラリないですか?
985デフォルトの名無しさん:2007/05/03(木) 10:40:52
>>983
文だけど値を持つってだけで、文は文だよ
986デフォルトの名無しさん:2007/05/03(木) 10:50:38
式って覚えてた。そっちの方が覚えやすかったから
987デフォルトの名無しさん:2007/05/03(木) 10:55:54
リファレンスマニュアルに
>if 式は、条件が成立した節(あるいは else 節)の最後に評価し た式の結果を返しま
>す。else 節がなくいずれの条件も成り立たなけれ ば nil を返します。
とかあるんだから式でいいんじゃね?
988デフォルトの名無しさん:2007/05/03(木) 10:58:34
URL忘れた。

http://www.ruby-lang.org/ja/man/?cmd=view;name=%C0%A9%B8%E6%B9%BD%C2%A4#if

まぁWikiなんか論拠にならねーといわれればそれまでだし、parse.yを見ると
stmts(statements)とかあるいう記号があるから文という概念があるのはその
通り。
989デフォルトの名無しさん:2007/05/03(木) 10:59:39
>とかあるいう記号があるから

とかあるから、を
とかいう記号があるから、に直そうとしてミスったのでありますorz
990942:2007/05/03(木) 11:18:56
〉〉952
すいません。自己解決しました。
991デフォルトの名無しさん:2007/05/03(木) 12:38:17
>>980
> class ... endも式です。返すのはnilですが。

p class X; self end
を試してみ。
992デフォルトの名無しさん:2007/05/03(木) 12:46:01
最後に評価した結果が返るのか。
993デフォルトの名無しさん:2007/05/03(木) 13:12:33
バージョンによると思われ。
確か昔のRubyはnil返してた気がするけど?
994デフォルトの名無しさん:2007/05/03(木) 13:49:07
995デフォルトの名無しさん:2007/05/03(木) 14:57:32
>>994
996デフォルトの名無しさん:2007/05/03(木) 15:42:02
>>993
そういわれると、随分前にそんな変更があったような気もするな。
997デフォルトの名無しさん:2007/05/03(木) 15:45:42
全てが式っつーと、なんだか関数型言語っぽいな。
998デフォルトの名無しさん:2007/05/03(木) 17:27:40
class〜endは定義したクラス、
def〜endはUnboundMethodあたりを返すと納得できそうなんだが、
ま、使わないかな。
999デフォルトの名無しさん:2007/05/03(木) 17:30:00
>>998
> class〜endは定義したクラス、
>>991

> def〜endはUnboundMethodあたりを返すと納得できそうなんだが、
> ま、使わないかな。
ほとんどの場合使われないのに、無駄にオブジェクトを作るのもなんだかとい
う気がする。
1000デフォルトの名無しさん:2007/05/03(木) 17:30:33

10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。