Ruby 初心者スレッド Part 20

1デフォルトの名無しさん
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
   【最新安定版の Ruby1.8.6 の使用を強くお勧めします】

関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
 ・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2デフォルトの名無しさん:2008/06/27(金) 01:35:55
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がおすすめでしょうか?

A:
プログラム作成の初心者だったら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
http://www.amazon.co.jp/dp/4797336617/
他の言語経験があるんだったら
「プログラミングRuby 第2版 言語編」
http://www.amazon.co.jp/dp/4274066428/
3デフォルトの名無しさん:2008/06/27(金) 01:36:42
■前スレ
Ruby 初心者スレッド Part 19
http://pc11.2ch.net/test/read.cgi/tech/1208100393/

■関連スレ
Rubyについて Part 31
http://pc11.2ch.net/test/read.cgi/tech/1204466626/

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

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

Ruby on Rails
http://pc11.2ch.net/test/read.cgi/tech/1191381506/

Rubyについて(アンチ専用) Part003
http://pc11.2ch.net/test/read.cgi/tech/1207233348/
4デフォルトの名無しさん:2008/06/27(金) 01:37:14
■公式/非公式関連リンク
Ruby Home Page
http://www.ruby-lang.org/ja/

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デフォルトの名無しさん:2008/06/27(金) 01:38:10
RAA - Ruby Application Archive
http://raa.ruby-lang.org/

RubyForge
http://www.rubyforge.org/
# Rubyのアプリやライブラリが検索できる

日本Rubyの会 公式Wiki
http://jp.rubyist.net/
# メニューに表示されていない埋もれた情報ページ多数

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

Ruby hotlinks 五月雨版(日記や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/

Matzにっき(Ruby作者の日記)
http://www.rubyist.net/~matz/
6デフォルトの名無しさん:2008/06/27(金) 01:38:56
■最近できたWiki
Ruby 初心者スレッド Hiki
http://starlet.s145.xrea.com/ruby/hiki/

Ruby Portal
http://ruby.morphball.net/portal/
7デフォルトの名無しさん:2008/06/28(土) 07:40:53
RoRを使わず、CGIを作ろうと思います
高速化するための方法として、
FastCGI,Mongrel,mod_ruby等ありますが、
Mongrelは、RoRと組み合わせる以外の使い方は資料が少なく敷居が高そうだし、
FastCGIは不安定ということを、ネットでよく目にするし、
mod_rubyは、最終更新日が随分前なので不安があります
何がいいのでしょうか?
8デフォルトの名無しさん:2008/06/28(土) 08:02:16
>>7
Rack + Mongrel とか。
9デフォルトの名無しさん:2008/06/28(土) 22:04:18
uniqに関する質問です。
以下のようなTSVファイルがあったとします。

1 A あ
2 B い
3 A う

一列目、三列目は無視して二列目のアルファベットだけを対象にuniqにしたいんです。
例えば、

1 A あ
2 B い

です。どのようにすればよいでしょうか。
宜しくお願いいたします。
10デフォルトの名無しさん:2008/06/28(土) 22:18:01
uniq_byってないんだっけ
11デフォルトの名無しさん:2008/06/28(土) 22:56:43
mapもcollectもinjectも使いにくそうwクロージャってのがあればいいのかな?

まあメソッド書けばいいんじゃね?だれか採点よろしく

def second_column_uniq(ar)
 hash = {}
 result = []
 ar.each do |row|
  t = row.split(/\t/)[1]
  puts t
  next if hash.has_key?(t)
  hash[t] = 1
  result.push(row)
 end
 result
end

ar = ["1\tA\tあ", "2\tB\tい", "3\tA\tう"]
p second_column_uniq(ar)
129:2008/06/28(土) 23:17:20
>>11
ありがとうございます!!!
自分の技量で書くと、相当複雑で助長になりそうだったので
綺麗な回答を得られて感謝します。
新しく、hashを覚えられて勉強になりました。
13デフォルトの名無しさん:2008/06/28(土) 23:23:46
ar.inject({}) {|h, r| h[/\t([^\t]+)\t/.match(r)[1]] ||= r; h}.values
14デフォルトの名無しさん:2008/06/28(土) 23:34:38
>>11(とほぼ同じ処理)を一行で書くと>>13ってことかな。凄いwww

まあTAB区切りのカラムがいくつあるかわからない場合は、正規表現部分を
少し変える必要がある、かも?
あと、Hashのvalues()だから、順不同になる可能性もあるのかな?

でも、凄えwww
15デフォルトの名無しさん:2008/06/28(土) 23:41:33
1.8 だと順序が保証されないね。
16デフォルトの名無しさん:2008/06/29(日) 02:48:49
rexmlについて質問です。
以下のようなxmlにおいて、personのidにマッチしたentryだけを取得したいと考えています。

<root>
 <person id="111"/>
  <name>hoge</name>
  <entry join="2008-01-01 9:00" leave="2008-01-01 21:00"/>
  <entry join="2008-01-02 7:00"/>
 </person>
 <person id="222"/>
  <name>foo</name>
  <entry join="2008-02-01 10:00" leave="2008-02-01 17:00"/>
  <entry join="2008-02-02 10:30" leave="2008-02-02 18:00"/>
  <entry join="2008-02-03 09:45"/>
 </person>
...
</root>

例えば、111(id)と入力があった場合,以下の値を取得したいです。
<entry join="2008-01-01 9:00" leave="2008-01-01 21:00"/>
<entry join="2008-01-02 7:00"/>


お手数をおかけしますが、よろしくお願いします。
17デフォルトの名無しさん:2008/06/29(日) 03:14:44
<person id="111"/> <-- ここの / はミスだよね?

doc = REXML::Document.new(...)
id = 111
path = %q|/root/person[@id='%d']|
doc.elements[path % id].each do |node|
next unless node.is_a? REXML::Element
next unless node.name == 'entry'
puts node
end
もっと簡単に書けそうだが。

Hpricotだとこんな感じか。
doc = Hpricot.XML(...)
id = 111
puts (doc / :person).find {|psn| psn[:id] == id.to_s } / :entry
1816:2008/06/29(日) 03:55:02
>>17
おおお、取得出来ました!
hpricotでもxmlのparseが出来たんですね、知りませんでした...
しかもrexmlより簡単で分かりやすい(汗
本当にありがとうございました!

仰る通りミスです、すみません(汗 < <person id="111"/> <-- ここの / はミスだよね?
19デフォルトの名無しさん:2008/06/29(日) 14:07:34
>>18
つXPath

p REXML::XPath.match(doc, "//person[@id=#{id}]/entry")
2017:2008/06/29(日) 14:13:04
ぐは、REXMLでも十分簡潔に書けるのね。
2116:2008/06/29(日) 22:01:25
Xpath.matchは知っていたものの、うまく扱う事が出来なくて諦めてました...(汗
>>17,>>19さん本当にありがとうございます!
22デフォルトの名無しさん:2008/06/30(月) 14:37:39
「初めてのRuby」いいね。本の厚みからは考えられないほど中身濃い。
Ruby初心者や俺みたいに知識があやふやな人にとっては特にそうだと思う。
23デフォルトの名無しさん:2008/06/30(月) 15:23:50
Emacsでruby-modeを使っていますが,
ファイルを保存するとき先頭に -*- coding: ほにゃらら -*- がついちゃいます.
これを抑制する方法を教えて下さい
24デフォルトの名無しさん:2008/06/30(月) 15:35:25
付けとけ
25デフォルトの名無しさん:2008/06/30(月) 18:17:42
ピュアRubyのRuby/MySQLを使いたいと思ってます。
自宅Windowsでは正常動作確認できたんですが、レン鯖にアップするとうまく行きません。
MySQLが4.1系なのでパッチを当てて使っています。

エラーメッセージはライブラリ中で投げられたRuntimeErrorで
「Packets out of order: 1<>3」というものです。
Windowsではクエリを発行するたびにこの値が0<>0や1<>1のようにすべて対応していますが
レン鯖では上記エラーのとおりです。

なんとかソースを読んでるのですが、ソケットやパケットのことはからきしで手に負えません・・。
上記1、3の値はソケットから読み込んだ値で、
ライブラリ内では、WinではTCPSocket、UnixではUNIXSocketを使用しています。
また、この数字の変数名はpkt_nrとなっていて、pktはパケットの略だと思うんですが、
nrはパケットの何の略なんでしょうか。。。
正確には2つの数字は@pkt_nrとpkt_nrで、これを比較して異なっているために例外が投げられています。

漠然としてまともに質問にもなってないんですが、なんとなく推測できる方いましたらお願いします。
26デフォルトの名無しさん:2008/06/30(月) 18:40:36
2725:2008/06/30(月) 19:26:31
>>26
ありがとうございます!
エラーメッセージでググったらいろいろ情報があったようです。
その都度違うと思っていた1<>3の部分までお決まりのエラーだったとは・・・
自分の場合Railsではないのですが、多分同じだと思うので
参考にして探ってみようと思いますm(_ _)m
28デフォルトの名無しさん:2008/06/30(月) 21:43:45
Rubyスクリプトを実行するときに管理者権限の昇格を行う方法はありませんでしょうか?
XPで動いていたプログラムが、VistaのUACのせいで動かなくて困っています。

多くのシステムファイルを弄るプログラムでは、
管理者権限を得るために昇格ダイアログを出していますが、
これと同じことをRubyで行う方法はどのようなものがありますでしょうか?
29デフォルトの名無しさん:2008/06/30(月) 21:59:42
manifest置け
30デフォルトの名無しさん:2008/06/30(月) 22:46:42
Vistaなんてのを使う奴が馬鹿
31デフォルトの名無しさん:2008/06/30(月) 23:53:02
>>23
1.9以上が普通になったら必要な記述だから、付けたままにして、
意味のあるコード名を書いておくべし。
コード中にASCIIしか使わないっていうなら別だが。
32デフォルトの名無しさん:2008/07/01(火) 02:02:30
>>30
あなたのお使いのOSがサポート切られたら同じことが言えますか?
33デフォルトの名無しさん:2008/07/01(火) 02:13:27
まあどちらにしてもRubyは関係ないな
Vistaプログラミングの解説でも読むといい
34デフォルトの名無しさん:2008/07/01(火) 04:31:21
% ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]

% cat a.rb
1.upto(10){|i|
if i%2==1
s="aaa"
else
s=s+"bbb"
end
}

% ruby a.rb
a.rb:5: undefined method `+' for nil:NilClass (NoMethodError)
from a.rb:1:in `upto'
from a.rb:1

何故エラーになるのか、判る人いますか?
35デフォルトの名無しさん:2008/07/01(火) 05:18:34
>>34
i が 1 の時(ループの最初回)、未定義の変数 s の値は nil となる
つまり5行目の s=s+"bbb" は s=nil+"bbb" となり # s = nil.+("bbb")
nil に定義されていないメソッド + が呼び出された為に NoMethodError が発生した
36デフォルトの名無しさん:2008/07/01(火) 05:21:41
i=1のとき条件分岐はelse節に入って、s=s+"bbb"が評価される

ところが、この時点でsは未定義
たぶんsがString扱いになって、文字列連結されるのを期待していたんだろうけど
未定義のローカル変数はRubyではniになっちゃう

解決策。RubyにsがStringだってことを教えてやれば良い
s=String.newを書いておくとか
37デフォルトの名無しさん:2008/07/01(火) 05:31:02
いやいやw、i==1でifの条件は満たされるだろう。

1.upto(10){|i|
p i
if i%2==1
s="aaa"
p s
else
s=s+"bbb"
p s
end
}

で、とりあえず動きを見てみれ。
このコード全体の前に
s=""
と書いとけば、おそらく望みの挙動をする。
3836:2008/07/01(火) 05:33:36
あーダメだもう寝ようw
39デフォルトの名無しさん:2008/07/01(火) 06:04:37
>>32
状況も含めて導き出される結論に対して、
別の状況を設定して「この状況下でも同じなのか?」とか訊いても無意味。
しかもなんか、状況と共に変わる結論は偽の結論だとでも言いたげだし。馬鹿なの?
40デフォルトの名無しさん:2008/07/01(火) 06:18:08
質問スレで喧嘩すなw
41デフォルトの名無しさん:2008/07/01(火) 06:41:38
ちょっと前に本スレでも同じようなやりとりがあったよ
ttp://pc11.2ch.net/test/read.cgi/tech/1204466626/482

まずRubyはソースコードをパースしてパースツリーを得る
パースツリーを解釈していく段階で代入文が見つかったら
それをRubyは変数の宣言なり定義と解釈する

>>34のコードでは、変数の宣言は代入文で静的に行われている
しかし(実行時に行われる動的な)初期化が行われていないのでsの値はnilになる

ということだろうと思うんだけど間違ってたら指摘してね
4225:2008/07/01(火) 07:55:59
その後、解決できました。

このライブラリ(Ruby/MySQL)はもともとMySQL5用で、
MySQL4.1にはパッチで対応されていました。
自宅Winではこのパッチをあてることで動作確認できたため、
そのままアップロードして使おうとしていたのですが、うまくいきませんでいした。

おしえていただいたリンク先の解説やパッチの内容などから、もしやと思い
パッチなしでアップしてみたところ、正常な動作を確認しました。

詳しい理由はあいかわらずわかりませんが、そんなことがあった、ということで一応・・・アセ
43デフォルトの名無しさん:2008/07/01(火) 08:16:02
>>34
% cat a.rb
1.upto(10) {|i|
if i % 2 == 1
s = i
else
p s
end
}
% ruby a.rb
nil
nil
nil
nil
nil

sがブロックの外側で定義されていないので、
sのスコープもエクステントもブロックの内側のみになる。

要するにブロックが実行されるごとに新しいsが作られている。
44デフォルトの名無しさん:2008/07/01(火) 08:27:29
>>37
先頭に s="" を入れたらエラーがなくなりました。
それにしても、i=1でs="aaa"としているのに、次の
i=2でsがnilになってしまう理由が判りません。
pythonで同様の実行するとOKなのでますます不可解。

for i in range(1,10):
  if i%2 == 1:
    s="aaa"
  else:
    s=s+"bbb"
45デフォルトの名無しさん:2008/07/01(火) 08:37:04
46デフォルトの名無しさん:2008/07/01(火) 08:37:53
>>43,45
ありがとうございます。 状況が理解できました。
47デフォルトの名無しさん:2008/07/01(火) 08:41:04
for を使うとスコープが変わるのが不思議なところ

% cat a.rb
for i in 1..10
if i % 2 == 1
s = i
else
p s
end
end

% ruby a.rb
1
3
5
7
9
48デフォルトの名無しさん:2008/07/01(火) 08:42:50
全然不思議じゃないっしょ
Cなんかと一緒で{}内でスコーピングが閉じるだけ。
{
s = "hogehoge
}

このあとでsが参照されたらそりゃnilが返るっしょ
4934:2008/07/01(火) 08:50:15
ふと疑問になったのですが、ブロック内の変数が毎回作られるかどうか
という挙動が、外部要因(ブロック内外で同じ変数名があるか)で変わって
くるとすると、ブロック外の変数をうっかり削除するとバグ要因になってしまう・・・・?
50デフォルトの名無しさん:2008/07/01(火) 09:02:54
そうだよ
だから「えす」とか「あい」とか「てぃーえむぴー」とか
てきとうなへんすうめいはつかわないほうがいいね
これがわからないならるびーみたいなじょうきゅうしゃようのげんごじゃなくて
ぶいびーとかしょきゅうしゃようのげんごをつかうといいよ
51デフォルトの名無しさん:2008/07/01(火) 09:16:49
>>49
基本的にブロック内の変数はブロックで閉じ込められると思えばよろし。
外部に同じ名前があったらそちらを参照するだけ。
わりとわかりやすいから問題になることはない。

ただし、ブロック変数が1.8までは外部に出ちゃうのが問題になった。
1.9からはブロック変数もブロックローカルになった。
52デフォルトの名無しさん:2008/07/01(火) 09:26:47
変数有効区間が壁で区切られてるような2次元的イメージをするとRubyの動作は極悪に感じる
トップレベルという台にイテレータとかの各ブロックが乗っかってるような3次元的イメージをするとよい
53デフォルトの名無しさん:2008/07/01(火) 09:30:02
>>51,52
ありがとうございます。 なるほど、そう割り切ればすっきりしますね。
実は、ブロック内の変数が毎回作られる、というのはクロージャの作り方と
関係あるんだろうか?と思案していましたので。

> ただし、ブロック変数が1.8までは外部に出ちゃうのが問題になった。
> 1.9からはブロック変数もブロックローカルになった。
以下の結果が1.8と1.9とで違うと解釈しました。
今まで副作用のバグで苦しむことが多かったので、1.9の方が素直に理解出来そうです。

i=100
1.upto(10){|i|
p i
}
p i
54デフォルトの名無しさん:2008/07/01(火) 09:47:07
というか、スコープを作るためだけに while true をしなくても loop でよくなったって話では
55デフォルトの名無しさん:2008/07/01(火) 20:37:54
Rubyの中から、自分が現在使用しているメモリーの量を知るにはどうしたらいいですか?
56デフォルトの名無しさん:2008/07/01(火) 21:22:32
特にない
57デフォルトの名無しさん:2008/07/01(火) 22:09:37
プラットフォーム非依存の方法はないな。

Linuxで File.read("/proc/#{$$}/statm").split.first.to_i とかできそうだし、
他の環境でもなんかあるんじゃない?

58デフォルトの名無しさん:2008/07/01(火) 23:20:49
え・・・
自プロセスのサイズを知るのにそんな回りくどい方法をしないといけないんですか?
PHPですら、memory_get_usageで簡単に知ることができるのに・・
59デフォルトの名無しさん:2008/07/01(火) 23:23:12
PHPじゃないから
60デフォルトの名無しさん:2008/07/01(火) 23:37:18
Perlにもなかったよな
なんでPHPにはあるんだろうね
61デフォルトの名無しさん:2008/07/01(火) 23:40:35
Pythonだと
resource.getrusage(resource.RUSAGE_SELF) あたりだなぁ。
62デフォルトの名無しさん:2008/07/01(火) 23:41:24
え、「使用しているメモリ量」って言ったじゃん
63デフォルトの名無しさん:2008/07/01(火) 23:41:42
PHPで言う所の$foo->$bar($baz)はどうすればいいのでしょうか

eval "foo.#{bar}(baz)"とする以外に方法が思い付かなかったのですが
もっと良い方法はありませんか?
64デフォルトの名無しさん:2008/07/01(火) 23:49:24
プロセスのサイズとプロセスが使用しているメモリ量っておなじもの?
65デフォルトの名無しさん:2008/07/01(火) 23:50:56
PHPの文法よーしらんが
$fooが変数、$barがメソッド名、$bazが引数ってことかいな。

foo.__send__(bar, baz)

__send__はsendでもいい

66デフォルトの名無しさん:2008/07/01(火) 23:51:20
s/変数/オブジェクト/
67デフォルトの名無しさん:2008/07/02(水) 00:01:05
perlはCPANからProc::ProcessTableをインストールして
(grep { $_->pid == $$ } @{Proc::ProcessTable->new->table})[0]->size
68デフォルトの名無しさん:2008/07/02(水) 00:11:38
>>65
なるほど、__send__を使うんですね!ありがとう!

>$fooが変数、$barがメソッド名、$bazが引数ってことかいな。
その通りです、舌足らずでごめんなさい><
69デフォルトの名無しさん:2008/07/02(水) 01:11:14
FastCGI+Rubyでwebプログラム作り始めました。
これRubyのプロセスがずっと居座って、foreachで回ってるんですよね。
以前、Rubyはずっと居座っていると使用メモリが肥大化していくということを
どこかで読んだ記憶があるのですが、
こういった問題に対してどのような解決法をとるのが普通なのでしょうか?
70デフォルトの名無しさん:2008/07/02(水) 01:34:15
定期的にプロセスを再起動するのが手っ取り早い。

Rubyで書いたXMLRPCを話すdaemonとか稼動させてたけど、
別にプロセスは肥大化しなかったな。
プログラムの書き方によるんでない。
71デフォルトの名無しさん:2008/07/02(水) 02:29:28
Rubyでは、クラス記述の冒頭で、インスタンス変数の宣言はしないんですか?
使用しているインスタンス変数がわかりやすいので
あった方がいいのではないかとも思うのですが
本に載ってるサンプルには書いてありません
72デフォルトの名無しさん:2008/07/02(水) 02:31:25
クラス記述の冒頭にinitializeを置いてそこで初期化せよ、と
教祖の本に書いてある。
73デフォルトの名無しさん:2008/07/02(水) 02:36:07
確かに、initializeに書いておけばわかりやすいですね
ありがとうございました
74デフォルトの名無しさん:2008/07/02(水) 02:44:12
>>71 に便乗。

私も使い始めですが、確かに一覧性が無いと思いました。
クラスの記述で、インスタンス変数を初期化する処理は、initialize等のメソッド内に書くしか
無いのでしょうか。
75デフォルトの名無しさん:2008/07/02(水) 02:50:30
外部に名前を見せても構わない場合は、
attr_reader :size (外部から読み取り専用の場合)
attr_accessor :name(読み書き両方)
のようなクラスメソッドを使うと、@size、@nameなどのインスタンス変数が
使えるようになり、size, name, name=などのメソッドで参照や設定ができる
ようになる。

完全非公開の属性で、name=とか定義する必要がないなら、どこかのインスタ
ンスメソッド(代表的なのがinitialize)で使うことで定義される。
76デフォルトの名無しさん:2008/07/02(水) 02:55:27
未初期化のインスタンス変数にはnilが入ってるから
@hoge||=1
とかで初期化されてないときだけ初期化することは可能
77デフォルトの名無しさん:2008/07/02(水) 03:58:08
メソッド名をキャメルケースで書くのは邪道なのでしょうか?
78デフォルトの名無しさん:2008/07/02(水) 06:11:16
別に邪道って事は無いと思う
でも書いてるうちに違和感を覚えるようになるよ
自分の書いたメソッドだけ浮いて見えるから
79デフォルトの名無しさん:2008/07/02(水) 08:49:36
型変換ぽいメソッドでときどき見かけるな。
Integer(...)とかPathname(...)とかHpricot(...)とか。
80デフォルトの名無しさん:2008/07/02(水) 13:30:13
ライブラリを読む時、
requireをイテレータの中で読んだらいいと思うのですが
あまりそういうプログラムを見ません
何故でしょうか?
8177:2008/07/02(水) 15:34:18
>>78-79
ありがとうございました
郷に入っては郷に従えなのでruby式でいこうと思います
82デフォルトの名無しさん:2008/07/02(水) 15:40:38
>>80
#!/usr/local/bin/ruby -Ku
['net/http', 'uri', 'kconv'].each do |lib|
require lib
end

こんな感じ?
まあ、「スクリプト書いててキモチワルイから」だと思う
83デフォルトの名無しさん:2008/07/02(水) 16:01:30
クラスメソッドの中から、クラス定数を参照する時、
self::HOGE
等でアクセスできないのって不自然じゃないですか?
クラス名をリテラル的に書くと、クラス名を変更した時に書きなおさないといけないので
selfと書けた方がいいと思うのですが…
84デフォルトの名無しさん:2008/07/02(水) 16:34:17
>>83
self.class::HOGE
85デフォルトの名無しさん:2008/07/02(水) 16:41:37
1.9であっさりなくなったmailreadの代替ってなーに?
「1.9使うような人は自力でバースしたりTMailを自力でインストールして富豪的に使ってね」とかそんな感じ?
8683:2008/07/02(水) 17:27:02
こういう書き方するんですね
ありがとうございました
87デフォルトの名無しさん:2008/07/02(水) 17:44:51
>>86
X クラスメソッドの中から、
O インスタンスメソッドの中から、

前者は普通にself::HOGEできます。念のため。
88デフォルトの名無しさん:2008/07/02(水) 17:45:22
文字列の一斉置換はどう書けばいいでしょうか?
String.subをループさせるだけだと
'a' → 'bbbb'
'b' → 'cccc'
の変換を同時に行いたい時に問題が出ますよね
89デフォルトの名無しさん:2008/07/02(水) 17:51:14
何をしたいのかわかりやすく
90デフォルトの名無しさん:2008/07/02(水) 17:53:21
>>88
String#gsubとかいう話じゃなくて?
91デフォルトの名無しさん:2008/07/02(水) 17:57:11
細かい突っ込み2つ。
subは最初に見つけたとこしか置換しない。多分gsubのがあってる。
でもってString.subだとStringのクラスメソッドだ。通例String#subとか書く。

'ab'を'bbbbcccc'にしたいけど、何回も置換すると、
'ab' -> 'bbbbb' -> 'cccccccccccccccccccc'になって困るって話だったら、
Hashとかで作ったテーブルと組み合わせる。

table = {
 'a' => 'bbbb',
 'b' => 'cccc',
}
str.gsub(Regexp.union(*table.keys)){|m| table[m] }
92デフォルトの名無しさん:2008/07/02(水) 18:05:18
>>91
ありがとうございます
知らない機能ばかりなので順を追って見ていきたいと思います
93デフォルトの名無しさん:2008/07/02(水) 22:15:31
module M
 X=1
 module_function
 def m1
  ・・・
 end
end

class C
 include M
 def c1
  m1
  p X
 end
 def self.c2
  m1
  p X
 end
end

C.new.c1 # => OK
C.c2 # => Error

クラスメソッドの中でモジュールのメソッドや定数を使いたいんだけど
モジュール名を指定しなくてもいい方法ない?
94デフォルトの名無しさん:2008/07/02(水) 22:21:11
>>85
たぶんTMail使えってことだろう
95デフォルトの名無しさん:2008/07/02(水) 22:21:17
C:\>gem install twitter4r
Bulk updating Gem source index for: http://gems.rubyforge.org
Building native extensions. This could take a while...
ERROR: Error installing twitter4r:
ERROR: Failed to build gem native extension.

F:/Language/asr_ruby-1.8/bin/ruby.exe extconf.rb install twitter4r
can't find header files for ruby.


Gem files will remain installed in F:/Language/asr_ruby-1.8/lib/ruby/gems/1.8/ge
ms/json-1.1.2 for inspection.
Results logged to F:/Language/asr_ruby-1.8/lib/ruby/gems/1.8/gems/json-1.1.2/ext
/json/ext/parser/gem_make.out

C:\>ruby -v
ruby 1.8.6 (2008-03-03 patchlevel 114) [i386-mswin32]
96デフォルトの名無しさん:2008/07/02(水) 23:01:24
gem_make.out読めよ
97デフォルトの名無しさん:2008/07/02(水) 23:01:57
>>95
だからそれがどうした。
言いたいことがあればちゃんと言えこのタコ!



というだけじゃ冷たいので言っておくと、コンパイラ持ってないなら誰かにコンパイルしてもらえ。
98デフォルトの名無しさん:2008/07/02(水) 23:02:54
>93
extend M
99デフォルトの名無しさん:2008/07/03(木) 01:49:30
>>93
Moduleいっこincludeするだけなら
ancestors[1].m1
とか。

本題と違うけど引数なしのmodule_functionって非推奨じゃなかったっけ。
なんかリファレンスでみたような。
100デフォルトの名無しさん:2008/07/03(木) 14:47:31
>>85
1.9.4くらいになる頃にはなんかステキなメール関係ライブラリが標準添付になります

まあ、rubygemが標準につくなら
「RubyでメールいじるならTMailをrubygemでまず入れましょう」
というようになるんじゃないかな
1.8系列がメインな現在は何も考えずにmailread使ってスクリプト書いていていいと思うよ
「1.9では無くなるライブラリなので今から使わないようにしよう」というのはやや大仰だ

というか、mailreadってなんでなくなったの?
メールをファイルからパースするだけのライブラリなんて誰も使わない?
Mailクラスを作る傍若無人さが気に入らないとか?
101デフォルトの名無しさん:2008/07/03(木) 14:57:32
ハッシュには、%w"hoge moge"みたいな簡単な書き方はないのでしょうか?
102デフォルトの名無しさん:2008/07/03(木) 16:33:11
ねっす
103デフォルトの名無しさん:2008/07/03(木) 18:56:45
1.9に今移行するやつはバカ

と罵られても大丈夫な神経を持つように。
104デフォルトの名無しさん:2008/07/03(木) 21:59:04
>>100
MLログ(coreのほう)にはこんなのがあるな。

NAKAMURA, Hiroshi
What libraries to be unbundled at ruby/1.9.1?

Urabe Shyouhei
I'd push mailread. It's nothing but a namespace pollution (holds "::Mail")
グローバルにMailというクラスを定義するほどのシロモノじゃねえよ(意訳)

あと、るびまにこんなの。

>ささだ TMail があれば TMail を使って。無ければ標準添付の mailread.rb。 あれ使ってるの俺しかいないんじゃないかと思うんだけど (笑)
>青木 あれもちょっとひどいよねぇ。 だいたい、なんで mailread.rb っていうライブラリ名で Mail なんて一般的なクラス名を……。 あれ許せないんだけど!
>ささだ あれすごいよね。……で、まぁあれのユーザーなんですけど (笑)
>青木 あれなくして欲しい。
>ささだ いや、でもなくされると私困るんだよ。
>青木 まずライブラリに別名を付けて、それから徐々になくしていく感じでさ。

でも、いきなり消えます、と。
105デフォルトの名無しさん:2008/07/03(木) 22:00:40
>>101
Hash[*%w(hoge moge)]
で勘弁してくんろ。

106デフォルトの名無しさん:2008/07/04(金) 01:57:29
Rubyにはcontinue文がありませんが
ネストされたeachを一気に抜けるにはどうしたらいいでしょうか?
107デフォルトの名無しさん:2008/07/04(金) 02:21:45
>>106
catch~throw
108デフォルトの名無しさん:2008/07/04(金) 06:52:41
http://itpro.nikkeibp.co.jp/article/COLUMN/20070606/273878/?ST=oss&P=3
a = [1,2,3]
b = [2,4,6]
a.zip
# 結果
# [[1,2],[2,4],[3,6]]
-----------------------------
なぜ a.zip ってだけで b の内容も反映されるのでしょうか?
109デフォルトの名無しさん:2008/07/04(金) 06:55:11
http://itpro.nikkeibp.co.jp/article/COLUMN/20070606/273878/?ST=oss&P=4

ary.map{|i|[i.to_i,i]}.sort.map{|j|j[-1]}
シュウォーツ変換を用いたソートのコード

ary.map{|i|[i[-1].to_i,i]}
で要素を基に比較の対象となる値(i.to_i)を計算し,
要素そのものと一緒に配列に入れておきます。

最後に元の配列の要素だけ取り出し,ソート結果を得ます。
.map{|j|j[-1]}
--------------------------------------
iだったりi[-1]だったり・・・
-1 がつく意味が分かりません.
というか,コードと解説で -1 があったりなかったり.
110デフォルトの名無しさん:2008/07/04(金) 07:14:01
[これはひどい]Matzのやっつけ仕事
111デフォルトの名無しさん:2008/07/04(金) 08:21:20
本当にやっつけ仕事だな
["1", "11", "2", "6"]をシュワルツ変換は
単純化のためとはいえどうかと思う

>>108
a.zip(b)の間違い

>>109
-1が出てくるのはこれでわかるだろうか

irb(main):001:0> ary = ["1", "11", "2", "6"]
=> ["1", "11", "2", "6"]
irb(main):002:0> ary.map{|i|[i.to_i, i]}
=> [[1, "1"], [11, "11"], [2, "2"], [6, "6"]]
irb(main):003:0> ary.map{|i|[i.to_i, i]}.sort
=> [[1, "1"], [2, "2"], [6, "6"], [11, "11"]]
irb(main):004:0> ary.map{|i|[i.to_i, i]}.sort.map{|j|j[-1]}
=> ["1", "2", "6", "11"]
112デフォルトの名無しさん:2008/07/04(金) 09:15:25
>>111
j[-1] は意味があるが、 i[-1]は意味がない。(ソートの役にたたない)
113デフォルトの名無しさん:2008/07/04(金) 09:26:11
>>111 解説ありがとうございます.
>>112 そう,それが疑問だったんです.

C/C++/Python/PHP を日ごろ使っているんですが,
Ruby もなかなかよさそうですね.
114デフォルトの名無しさん:2008/07/04(金) 11:46:47
Mutexってプロセス間同期にも使えますか?
それとも単一プロセス内のマルチスレッド間同期のみですか?
115デフォルトの名無しさん:2008/07/04(金) 16:03:41
>>114
後者です。
116デフォルトの名無しさん:2008/07/04(金) 23:18:15
>>106

ネストを一気に抜けるcontinue文って何にあるんだ。
Cのcontinueに相当するのはnextだが。
117デフォルトの名無しさん:2008/07/04(金) 23:35:12
Javaのラベル付きcontinueじゃなかろうか
118デフォルトの名無しさん:2008/07/04(金) 23:51:21
PHPとかでの break の事だろうか
119デフォルトの名無しさん:2008/07/05(土) 00:04:21
PHPは相変わらずてきとーに使うぶんには便利な機能満載だな
breakで全部抜けるのか
120デフォルトの名無しさん:2008/07/05(土) 00:19:43
>>119
普通は一番内側のループだけ。C言語と同じ > PHPのbreak
ただ、引数?を指定できて、抜ける階数を指定できる。
121デフォルトの名無しさん:2008/07/05(土) 01:14:18
結局 昔はやったgoto文の是非になるよ。

アマ:gotoは使わないほうがいいですよね。
プロ:そうですね。勧められませんね。
(ぼけ 使ったほうがスッキリしてメンテも楽なんだよ。
ま でもある程度わかってからじゃねーと無理だもんな。)
122デフォルトの名無しさん:2008/07/05(土) 01:30:50
Rubyのcatch/throwは進むだけで戻ることはできないんだから、
あっちこっちに飛び回るようなコードは書きにくい。乱用はしにくいはず
123デフォルトの名無しさん:2008/07/05(土) 01:31:48
call/cc に比べれば全然白魔術
124デフォルトの名無しさん:2008/07/05(土) 01:33:56
むかしは、それcatch/trhowでできるじゃん的なcallccの使い方しか知らなかった。
125デフォルトの名無しさん:2008/07/05(土) 02:28:59
> call/cc に比べれば全然白魔術
そうだね
Fiber だね
126デフォルトの名無しさん:2008/07/05(土) 02:56:48
Stringクラスにオリジナルのメソッドを追加したいのですがどう書けばいいですか?
127デフォルトの名無しさん:2008/07/05(土) 02:59:48
class String
def double
self + self
end
end
128デフォルトの名無しさん:2008/07/05(土) 03:02:02
>>126
class ::String
def hello
puts "Hello #{self}!"
end
end
129デフォルトの名無しさん:2008/07/05(土) 03:08:00
>>127-128
::のあるとなしと
どっちがベターでしょうか?
130デフォルトの名無しさん:2008/07/05(土) 03:21:10
::を書くと、他のmoduleの中にも書けるみたいですね
ありがとうございました
131デフォルトの名無しさん:2008/07/05(土) 05:35:18
>>106
continueあるよ。nextだよ
132デフォルトの名無しさん:2008/07/06(日) 01:36:11
Fileをブロックで操作した場合、
ロックは気にしなくていいんですか?
複数のプロセスから書き込んだ場合にファイルが壊れたりしませんか
133デフォルトの名無しさん:2008/07/06(日) 01:48:46
つFile#flock
134デフォルトの名無しさん:2008/07/06(日) 02:24:30
>>133
ありがとうございます
ただロックの仕方が分からないのではなく
File.open(filename){|fh| ...}
というファイルクローズまでお任せの書き方の時、
ファイルロックまでお任せできるのか、どうか?と思ったのです
135デフォルトの名無しさん:2008/07/06(日) 02:31:34
ファイルロックまでお任せしないほうがいいからね
パフォーマンスや飢餓の問題があるし
136デフォルトの名無しさん:2008/07/06(日) 02:38:58
openが忘れずクローズしてくれるってところから忘れずアンロックしてくれる
というふうに発想したんだろうけど、それは残念ながらないですね。

File.flock(...) do
File.open(...) do
end
end # unlockされる

という形で使えると便利な気はしますが、とりあえずensureで。
137デフォルトの名無しさん:2008/07/06(日) 03:01:52
ありがとうございます
ではちゃんとロック・アンロックしなきゃいけないんですね
138デフォルトの名無しさん:2008/07/06(日) 03:13:35
class File
alias plain_flock flock
def flock(op)
return plain_flock(op) if op == LOCK_UN
return plain_flock(op) unless block_given?
begin
plain_flock(op) && yield(self)
ensure
flock(LOCK_UN)
end
end

こんなとこ?
139デフォルトの名無しさん:2008/07/06(日) 03:22:31
closeすればロック外れるぞ
少なくともXPとlinuxとmacとFreeBSDでは
140デフォルトの名無しさん:2008/07/06(日) 03:23:58
設定ファイル等の値によって、生成するクラスを変更する場合は
どうするのがいいですか?
PHPだと
$class_name = 'HogeController'
$controller = new $class_name()
のようにしていました。
evalで生成する文自体を動的に組み立てればできますが
evalはかなり遅いようです
いい方法はないでしょうか?
141デフォルトの名無しさん:2008/07/06(日) 03:31:31
class_name = 'HOgeController'
clazz = Object.const_get(class_name)
142デフォルトの名無しさん:2008/07/06(日) 03:31:56
あ、
controller = Object.const_get(class_name).new
だな。
143140:2008/07/06(日) 04:21:56
>>142
出来ました!
ありがとうございました
144デフォルトの名無しさん:2008/07/06(日) 08:14:06
Matzの会社を財務分析してみたんだが。
http://d.hatena.ne.jp/AntiSeptic/20080704/p1

などと思わせぶりな言い方をするものだから覗いてみりゃ、
なんて事無い田舎の零細企業の財務諸表であって、面白くもなーんともなかったわけだ。

それにしても、この程度の収益で2007年度って、
あの会社にとっては多分空前絶後の景気のいい年だったはずだの
Rubyとゆー「鉱脈」があるだの言っているのは何なのだ。
Geekのヨタ話というのは、いつもこんなしょぼいスケールで行われているのか?
あそこの技術者の平均レベルは、他の普通の会社よりはずっと高いと思うって、
これじゃあ、技術なんてIT企業の収益とは何の関係も無いと証明しているようなもんじゃねえか。

そもそも、この会社が何をやっているのかがHPを見た限りではよく分からん。
要は受託開発だろ労働力を人月で売ってるだけだろマーケ屋がこねくりあげた横文字得意げに使ってなに悦に入ってやがんだコラ。
更には製品・サービス部門まであって、なにやら参考価格が書いてあるところを見ると、
多分にパッケージっぽい印象を受けるが、それでいて全体の粗利率が26%程度ではどうしようもないだろ。

あそこに入りたい人は、損益計算書も注意して見ておくといい。まぁこれはどんな会社でも同じだけど、
ここを見るといろんなことが見えて来る。株価指標を計算してみるのもいい(非公開会社でもね)。
145デフォルトの名無しさん:2008/07/06(日) 12:04:08
零細SIerの営業力と確保できる工数じゃこんなもんだろ。
おいしいところはCTCなりがもってけばいいんじゃないの。
146デフォルトの名無しさん:2008/07/06(日) 12:12:57
マルチレス君て馬鹿だな、まで読んだ
147デフォルトの名無しさん:2008/07/06(日) 12:56:33
>>144
これ他のエントリも結構面白いこと書いてあるな
148デフォルトの名無しさん:2008/07/06(日) 13:00:50
>>144
他のエントリも爆釣りで吹いたwww
149デフォルトの名無しさん:2008/07/06(日) 16:12:45
FastCGI+Rubyで簡単なページを表示するだけのプログラム書いてみました
Rubyが最初から起動するほどの待ちはありませんが、
それでもなんとなくモッサリしています
こんなものなのでしょうか?
150デフォルトの名無しさん:2008/07/06(日) 17:06:15
>>149
まあそんなもんです

そんな日常的アクセスで遅すぎるほど遅いこともないと思うんだけど
151デフォルトの名無しさん:2008/07/06(日) 17:14:06
ruby のスクリプトとかに使えるカコイイアイコンください.
*.ico フォーマットになってるとうれしい.
64x64 フルカラーとかいろんなフォーマットでください.
152デフォルトの名無しさん:2008/07/06(日) 17:29:05
153デフォルトの名無しさん:2008/07/06(日) 17:38:49
おお,こりゃいいや,ありがとう
154デフォルトの名無しさん:2008/07/06(日) 18:21:11
そういえばRubyアイコンコンテストってどうなったんだろう
155デフォルトの名無しさん:2008/07/06(日) 18:28:27
Rubyにロゴなんてありませんよ
156デフォルトの名無しさん:2008/07/06(日) 18:42:02
>>152
横からだがありがとう
157デフォルトの名無しさん:2008/07/06(日) 19:29:40
>>155
ロゴコンテストじゃなくてアイコンコンテスト
158デフォルトの名無しさん:2008/07/06(日) 19:53:39
Hashを{1=>"a", 2=>"b", 3=>"c"}
という形式の文字列にするにはどうしたらいいですか?
to_sだと全部繋がってしまいます
159デフォルトの名無しさん:2008/07/06(日) 19:58:16
>>158
irb> h = {1=>"a", 2=>"b", 3=>"c"}
irb> puts h
1a2b3c
irb> puts h.inspect
{1=>"a", 2=>"b", 3=>"c"}
160158:2008/07/06(日) 20:19:26
>>159
ありがとうございました
161デフォルトの名無しさん:2008/07/06(日) 20:19:38
Rubyのto_sは変な動作に定評がある
162デフォルトの名無しさん:2008/07/06(日) 20:30:12
>>161
もうちょい早く直るとよかったんだけどねえ
まあ変なのがなくなりつつあるだけでも良しとせねば
163デフォルトの名無しさん:2008/07/06(日) 21:57:00
Ruby on Rails 2.0を今日から使いはじめました。
$ ruby script/generate scaffold user name:string ...
$ rake db:migrate
とやってモデルとDBのテーブルを作成したのですが、
新たに列を追加したくなりました。
モデルを再作成しないで列を追加する方法を教えて下さい。
このWebサイト見ろ!ごるぁでも結構です。
164デフォルトの名無しさん:2008/07/06(日) 23:59:22
行儀よくやるには
script/generate migration AddXxxToUser
だけど。

未公開の開発途上なら、db:migrate:downしてから CreateUsersマイグ
レーションを書き換えてマイグレーションやり直してもいいよ。

165デフォルトの名無しさん:2008/07/07(月) 00:20:17
RubyはPHPのように、関数の定義をファイルの末尾にまとめることはできませんか?

def hoge()
end

hoge()

のような順番じゃなくて、

hoge()

def hoge()
end

のように書いてみたいんですが。
166デフォルトの名無しさん:2008/07/07(月) 00:39:25
Rubyで、遅い部分だけC言語化するみたいなことってできます?
167デフォルトの名無しさん:2008/07/07(月) 00:46:52
>>166
できる。というか、Rubyの標準ライブラリは
多くがCで書かれている
168デフォルトの名無しさん:2008/07/07(月) 00:49:37
関数定義も、上から順に「評価(実行)される」ものなので、こんな風に
するくらいしかないかなー。


main = proc { hoge }

def hoge
end

main.call


169163:2008/07/07(月) 00:54:23
>>164
ありがとうございます。
まだ勉強中なんで色々なやり方を覚えておきたいなぁと。
db:migrate:down ってのも知りませんでした。

とりあえず↓これ見つつ
http://rails.to/files/four-days-on-rails-2-ver-1.1.pdf
ネットで検索しながら色々やってるんですけど、
他に良い情報無いですか?
170デフォルトの名無しさん:2008/07/07(月) 02:20:25
PHPのArrayのような「順番を持ったハッシュ」がRubyにあれば教えてください。
個々の要素にはキーでアクセスしたいし、
取り出す時は決まった順番で取り出したい、っていう時に欲しいです
171デフォルトの名無しさん:2008/07/07(月) 02:22:42
ruby1.9をどうぞ
172170:2008/07/07(月) 02:26:33
>>171
ありがとうございます
1.8は自分でなんとか書くしかないんですね
荷が重いですが・・
173170:2008/07/07(月) 02:39:52
http://www.notwork.org/sbcr-ruby/answer/
たのしいRubyの練習問題の中にありました!
OrderdHashじゃなくてOrderedHashだと思いますが
案外簡単に実装できるんですね
174デフォルトの名無しさん:2008/07/07(月) 03:33:41
Hashにあるメソッド全部実装すること考えたらやっぱ荷が重いです(><)
175デフォルトの名無しさん:2008/07/07(月) 03:38:52
ActiveSupportをインストールするとActiveSupport::OrderedHashてのがあるな。
1.9でActiveSupportをロードすると、Hashの別名として定義するようになってる(笑)
176デフォルトの名無しさん:2008/07/07(月) 06:30:27
順番の保存は普段は必要ないことが結構多かったりするんだけどな
順番枚挙機能が欲しいだけならハッシュ登録時に配列にキー入れといて orders.map{|k| h[k]} とかで取得しれ
177デフォルトの名無しさん:2008/07/07(月) 06:34:04
>>170
gemでhashで検索したら2つくらいあったぞ
178デフォルトの名無しさん:2008/07/07(月) 08:59:04
>>163

$ ruby script/generate migration add_COLUMN_to_TABLE
$ vi db/migrate/XXX_add_COLUMN_to_TABLE.rb


## db/migrate/XXX_add_COLUMN_to_TABLE.rb の中身
class AddColumnToTable < ActiveRecord::Migration
def self.up
add_column 'table1', 'column1', :string
end

def self.down
remove_column 'table1', 'column1'
end
end


$ rake db:migrate
179デフォルトの名無しさん:2008/07/07(月) 12:05:24
↓で(2)の場合に(1)と違ってbも変更されるのは何でなんですか?

(1)irb(main):010:0> a=b=0;p a, b;a=1;p a, b
0
0
1
0
=> nil
(2)irb(main):011:0> a=b=Hash.new;p a, b;a["A"]=1;p a, b
{}
{}
{"A"=>1}
{"A"=>1}
=> nil
(3)irb(main):012:0> a=Hash.new;b=Hash.new;p a, b;a["A"]=1;p a, b
{}
{}
{"A"=>1}
{}
=> nil
180デフォルトの名無しさん:2008/07/07(月) 12:13:37
= と []= は違う
181デフォルトの名無しさん:2008/07/07(月) 13:54:23
>>180
本当だ。
(4)irb(main):010:0> a=b=Hash.new; p a,b; a={'A'=>1};p a,b
{}
{}
{"A"=>1}
{}
=> nil

これは、仕様ですか?
182デフォルトの名無しさん:2008/07/07(月) 14:32:44
Rubyのオブジェクトの実際について、解説の本とか入門サイトとか読んでないん?
読んでないならオブジェクトについて勉強することをお勧め
183デフォルトの名無しさん:2008/07/07(月) 20:18:05
WindowsのgemでZenTestが入らないのですが、うまく入れられている人いますか?
 gem install ZenTest
としたのですが、コマンドプロンプトが固まってしまいます。
184183:2008/07/07(月) 20:23:46
何回も落としてやり直したらうまくインストールできました。
gem不安定なのかな?
185デフォルトの名無しさん:2008/07/07(月) 21:37:41
>>181
当然仕様。
186デフォルトの名無しさん:2008/07/08(火) 13:13:58
しつもん。

puts 長文入り配列.map{|e| addtag(e).toeuc}



puts 長文入り配列.map{|e| addtag(e)}.join("\n").toeuc

では、後者のほうが NKF の使用が1回だけで済んですっきりさんですか?
やっぱ NKF って使用回数が少ないほうが好ましいですよね?
187デフォルトの名無しさん:2008/07/08(火) 14:13:38
HTTP での '200' とか '404' とかいういわゆるマジックなナンバーを使う代わりに、
標準組み込みライブラリの net/http の定数か何かを流用することはできませんか?
Net::HTTPOK が '200' になるとか、Net::NotFound が '404' になるとか、そんな感じのステキなやつです

Net::HTTPResponse::CODE_TO_OBJ.index(Net::HTTPOK) は確かに '200' ですが、
これなら '200' # HTTPOK と注釈つきで数字を書いたほうがまだわかりやすそうです
188デフォルトの名無しさん:2008/07/08(火) 14:25:48
それならこんなんではどうか

class Net::HTTPResponse
def self.code
Net::HTTPResponse::CODE_TO_OBJ.index(self)
end
end

p Net::HTTPOK.code # => "200"
189デフォルトの名無しさん:2008/07/08(火) 17:41:27
case resp
when Net::HTTPOK
 puts "OK"
end
190デフォルトの名無しさん:2008/07/08(火) 18:18:07
WEBrickのことも思い出してあげてください

require 'webrick/httpstatus'
include WEBrick

HTTPStatus::OK.code #=> 200
HTTPStatus::OK.reason_phrase #=> "OK"
HTTPStatus::RC_OK #=> 200

詳しい使い方は、httpstatus.rbのソースコード読めばたぶん分かる
191デフォルトの名無しさん:2008/07/08(火) 19:38:47
正直

HTTPOK = "200"

でいいような気もする
192デフォルトの名無しさん:2008/07/08(火) 21:38:53
>>186
上の方は .join("\n") が抜けてるんだよな?そうでないと結果が同じにならないし

メソッド呼び出しを無視すれば変換処理自体はどっちもほとんど同じじゃないかな?
ただし toeuc は元のエンコードを自動識別する(nkf -em と等価、kconv.rb 参照)
一つにまとまってればこれは一回ですむから、後者の方が効率がいいといえる
# 当然だけど配列内のエンコードは統一されていることが前提
気になるんなら自分でベンチマークでもしてみたら?
193デフォルトの名無しさん:2008/07/08(火) 23:19:30
配列をputsしてるから見た目的にはおおむね同一だろ
194デフォルトの名無しさん:2008/07/09(水) 00:09:41
ハッシュを配列にした場合[key,value]というような配列になりますよね?
このvalueの値が["aaa","bbb","ccc"]のような形式になっています。
このvalueを","で区切り配列を[key,aaa,bbb,ccc]のようにするにはどうすればよいでしょうか?
spliteを使用しようとするとエラーが出て使用できませんでした。private~というエラーです。
195デフォルトの名無しさん:2008/07/09(水) 00:17:42
[key, value].flatten ではだめ?
196デフォルトの名無しさん:2008/07/09(水) 00:40:58
すみませんでした。そこは自己解決できました。

修正中1つ気になったのですがハッシュのkey"a"に対して a << b のようなプログラムを書いた場合
key"a"にvalue"b"が追加されるようですがこれをループ(bの値を変えて連続で)させた場合はkey"a"のvalueはどうなるのでしょうか?
"a" => b, b, b, b のように複数のbがvalueとして配列のように追加されるのか、
"a" => bbbb のようにすべてのbが結合され1つのvalueとなるのでしょうか?
197デフォルトの名無しさん:2008/07/09(水) 00:44:14
最初に << するとき hash に key "a" に対応する要素はないから
nil.<< b することになってエラーになってるだろ?
そうでないなら初期値はあなたがきめた何か "" や [] であるはずで、
それらに定義された << の動作に従う。
198デフォルトの名無しさん:2008/07/09(水) 00:45:22
× nil.<< b
○ nil << b
199デフォルトの名無しさん:2008/07/09(水) 01:07:34
書き忘れてましたがifでaが空ならば a = b としているのでエラーは出ていませんでした。
配列のように追加したければハッシュの宣言部で配列が初期値だとしておけばいいということでしょうか?
200デフォルトの名無しさん:2008/07/09(水) 01:37:42
何言ってるかわかんないけど試そうとは思わないの?
201デフォルトの名無しさん:2008/07/09(水) 02:16:14
>>199
あなたはおそらく、訊く前にまず自分で考えるべきだ
あと質問する側の「書き忘れていました」は、回答する側に相当悪い印象を与えるからできる限り止めろ
202デフォルトの名無しさん:2008/07/09(水) 03:30:26
オフラインで見れる、一番詳しいrubyのマニュアルって
rubymanjp.chmくらいですか?
ADSLの切り替えで一時的にネットにつなげないのですが
rubymanjp.chmのerbの資料が少なすぎて泣きました
もっとごっそり入ってる、オフラインで閲覧可能な情報源があれば教えてください
203デフォルトの名無しさん:2008/07/09(水) 08:09:12
>>186
> puts 長文入り配列.map{|e| addtag(e).toeuc}
は配列の要素の数だけtoeucが呼ばれるが
> puts 長文入り配列.map{|e| addtag(e)}.join("¥n").toeuc
はtoeucが1回しか呼ばれないから、あきらかにこっちのほうが速い

>>187
require 'cgi'
p CGI::HTTP_STATUS['OK'] #=> "200 OK"
というのがあるが、200じゃないからダメかな

>>202
http://doc.loveruby.net/ で新しいマニュアルをダウンロード
http://www.ruby-doc.org/ を wget -r とかでローカルダウンロード
erbについては http://jp.rubyist.net/magazine/?0017-BundledLibraries が詳しい
204デフォルトの名無しさん:2008/07/09(水) 09:41:20
速いかどうかはそれほど問題にしてないと思われる
まあ、「すっきりさん」という表現も曖昧模糊だが

要素内文字を操作したあと一気に文字列にするのと
文字入り配列をjoinして文字列操作するのでは
配列のままを使用する前者のほうがRubyっぽい書き方だと思う
205デフォルトの名無しさん:2008/07/10(木) 03:21:06
パスカルの三角形
print("Enter n: ")
n = gets.chomp.to_i
if n>30 or n<0
then n = 10  end
C = Array.new(n)
n.times{|i|
C[i]=Array.new(i+1) }
C[0][0] = 1
for i in 1...n
C[i][0] = 1
end
for i in 1...n
C[i][i] = 1
end
for i in 1...n
for j in 2...n
C[i][j] = C[i-1][j-1] + C[i-1][j]
end end
for i in 0...n
for j in 0...(n-i)
printf " %3d", C[i][j]
end print "\n\n" end
ってやってみたんだけど、はじかれちゃう
なんでだ?
206デフォルトの名無しさん:2008/07/10(木) 03:24:45
>>205
はじかれる?とはどういう意味?
構文解析でエラーになる件なら、
ソースに全角空白が混じっているが
207デフォルトの名無しさん:2008/07/10(木) 03:30:43
全角はコピったときについ入れてしまった

for i in 1...n
for j in 2...n
C[i][j] = C[i-1][j-1] + C[i-1][j]

ここら辺がうまくいっていないっぽい
208デフォルトの名無しさん:2008/07/10(木) 03:31:05
ハッシュをローカルスコープの変数に展開したいのですが、
evalを使わずにする方法はありませんか?
209207:2008/07/10(木) 03:34:49
そのあたりの行のエラーメッセージが下の感じです

C:/e.rb:27: undefined method `+' for nil:NilClass (NoMethodError)
from C:/e.rb:26:in `each'
from C:/e.rb:26
from C:/e.rb:25:in `each'
from C:/e.rb:25
210デフォルトの名無しさん:2008/07/10(木) 03:56:43
C[0][1] == nil
211デフォルトの名無しさん:2008/07/10(木) 04:01:01
てか、>>205みたいなのは、傲慢に過ぎる
何故俺がお前の、ポイントも提示されず、読ませるための工夫も無い
糞ソースを、一から読まなきゃいけないんだ
212202:2008/07/10(木) 04:08:23
>>203
ありがとうございました
213デフォルトの名無しさん:2008/07/10(木) 04:21:05
ERBの自動quoteを有効にしたいのですが、どうすればいいのでしょうか?
http://www2a.biglobe.ne.jp/seki/ruby/erbquote.html
こちらを見ると1.8のERBに既にこの機能が入ってるとのことですが、
ライブラリマニュアルにも記述箇所が見あたりません
214デフォルトの名無しさん:2008/07/10(木) 06:28:53
>>213
そのページの「新しいインターフェイス」は「自動quote」のことじゃないと思う
そこの文章(と実験スクリプト)を良く読んでみ
215デフォルトの名無しさん:2008/07/10(木) 06:50:03
>>211
> 一から読まなきゃいけないんだ
義務があると思っているなら、あなたはただの馬鹿です。
216デフォルトの名無しさん:2008/07/10(木) 09:06:01
義務があるなら愚痴を言ったり文句を言ったりする余地はない
217デフォルトの名無しさん:2008/07/10(木) 09:19:56
どんな結果が欲しいのか書かないとこんな答え方しちゃうぞ
print("Enter n: ")
n = $stdin.gets.chomp.to_i
n = 10 if n < 1 || 30 < n
tri = Array.new(n)
n.times do |i|
 tri[i] = Array.new(n-i)
 tri[i][0] = 1
 tri[0][i] = 1
end
for i in 1...tri.size
 for j in 1...tri[i].size
  tri[i][j] = tri[i][j-1] + tri[i-1][j]
 end
end
tri.size.times do |i|
 tri[i].size.times do |j|
  printf("%4d",tri[i][j])
 end
 print "\n\n"
end
218デフォルトの名無しさん:2008/07/10(木) 09:36:14
定数回ループにfor文を使っている馬鹿がまた現れたか!
219デフォルトの名無しさん:2008/07/10(木) 09:52:28
CやJavaでは当たり前でした。
220デフォルトの名無しさん:2008/07/10(木) 16:26:52
ソートの条件の書き方を教えてください

配列のソートがうまくいかない。
x[n]<<[ホスト名,日付]
の配列をホスト名ごとに時系列順にソートしたいんです
221デフォルトの名無しさん:2008/07/10(木) 17:04:28
>>220に書かれていることだけでは問題点がわかりにくいので、
どのようにうまくいっていないかが知りたい。
なにかしらエラーが出てるならエラーメッセージを書いてほしいし、
間違った動作をしているならそれを再現するソースコードがあるといいな。
222デフォルトの名無しさん:2008/07/10(木) 17:09:51
一応、xには隙間無く要素が詰まっているとするならば
単にx.sortでソートできるはず。

x = [["b", Time.at(2)], ["a", Time.at(3)], ["b", Time.at(1)]]
x.sort
# => [["a", Thu Jan 01 09:00:03 +0900 1970],
#     ["b", Thu Jan 01 09:00:01 +0900 1970],
#     ["b", Thu Jan 01 09:00:02 +0900 1970]]

もしxの要素にnilがあるならx.compact.sortでnilを取り除いてからsort。
もしx.sortしたあとに「xがソートされていない」と思ったらx.sort!すればよい。

…という感じで、>>220読んだだけでもいろいろ要因を思いついてしまうので、
(しかも外している可能性大) 詳細を希望します。
223デフォルトの名無しさん:2008/07/10(木) 17:12:45
まあ、これはかなりの割合でマニュアル側の不備というか不親切だと思うんだ
確かに配列の大小比較の結果上間違ってはいないし
sortのマニュアルにも0より大きいかどうかで並ぶとか書いてあるが、
普通はこれを利用ようとはまず思わない

>>220
まず、その配列xの作り方がRubyとしてかなり変である可能性が大だ

x = Array.new
ホスト名と日付のある行の配列.each do |l|
ホスト名 = lから正規表現とかで抽出
日付 = lから正規表現とかで抽出
x << [ホスト名,日付]
end

こうやって作ってくれ
添字をfor文とかで増分させて配列にデータを入れるというのは普通やらない

で、

x.sort{|e| [e[0], e[1]]}

でよいというかこれは>>222の言うように単に配列をsortしただけだな
1要素目のホスト名を文字列としてsortした結果の中で2要素目の日付を(たぶん文字列で)sortした結果で並ぶ
もしホスト名をホスト単位でsortしたい(このままだと先頭にwwwがつく別ホストがずらっと並ぶはず)場合は
そのように大小を返すメソッドを作ってe[0]の代わりに hostsort(e[0]) とかしれ
224デフォルトの名無しさん:2008/07/10(木) 17:16:21
それはsort_by
225デフォルトの名無しさん:2008/07/10(木) 17:17:49
>>221-223
言われたことにちゅういしてやってみます

エラーが何だったかわかったらまたかきます
226デフォルトの名無しさん:2008/07/10(木) 17:20:00
>>223
疎な配列を作りたかったのかもしれないじゃないか
227デフォルトの名無しさん:2008/07/10(木) 17:59:27
さっきのなおしてやってソートしたら日付が日/月/年って並んでるんですが


06/6/2007
06/6/2007
06/6/2007
06/9/2002

てなるんですがどうすればなおせますか?
228デフォルトの名無しさん:2008/07/10(木) 18:17:04
>>227
少しはマニュアルとか読んで自分で考えようぜ
文字や数字として大小を考えて欲しいんじゃなくて、日付として大小を考えて欲しいんだろ?
Rubyには日付を扱う添付ライブラリdateがあるぞ
ttp://www.ruby-lang.org/ja/man/html/Date.html#parse
229デフォルトの名無しさん:2008/07/10(木) 18:31:38
すいませんでした
230デフォルトの名無しさん:2008/07/10(木) 19:45:56
会員の高野光弘とやらが、非常識な言動をしていることについて、
日本Rubyの会はどう考えているのでしょうか?
231デフォルトの名無しさん:2008/07/10(木) 19:51:37
コピペか
232デフォルトの名無しさん:2008/07/11(金) 01:22:29
正規表現を使って
[10/May/2008:06:47:07 +0900]
をまとめて文字列として抽出したいのですがどのような記述をすればよいですか?
233デフォルトの名無しさん:2008/07/11(金) 01:32:53
…またお前か
すこしはsage覚えような

ほんのちょっとデータが変わっただけで全く使えなくなるから
データと正規表現の関わりそのものを覚えたほうがいい

ほぼ確実にマッチするパターンを見つけるんだ
ひとつの正規表現で難しかったら複数のif文と変数使用を躊躇ったらイカン
案外Stringクラスのsplitメソッドで配列にするだけで用が済んだりしないか?とか
234232:2008/07/11(金) 01:46:22
sage推奨スレだと知りませんでした、すみませんでした。
あと自分はこのスレで質問するのは初めてです。
上の方で似た状況の方がソートについて質問されていますが
私は抽出したものをそのまま表示したいだけです。
235デフォルトの名無しさん:2008/07/11(金) 01:50:08
その文字列にあう正規表現を知りたい?
それとも正規表現を使って複数の一致する文字列を取り出す方法を知りたい?
236232:2008/07/11(金) 01:54:34
"複数の一致する文字列を取り出す"というのがよくわからないので
この文字列にあう正規表現を教えていただきたいです
よろしくおねがいします。
237デフォルトの名無しさん:2008/07/11(金) 01:56:55
質問でageるのは当然だろう
238デフォルトの名無しさん:2008/07/11(金) 01:58:34
専門スレをわざわざ上げる意味特にないしな
239デフォルトの名無しさん:2008/07/11(金) 02:03:13
どこまで書けばいいのかわからないから
/¥[[^¥]]+\¥/ とか
%r!¥[¥d+/[A-Z][a-z]{2}/¥d+:¥d+:¥d+:¥d+ ¥+¥d+¥]! とか
%r!#{Regexp.quote("[10/May/2008:06:47:07 +0900]")}!  とか
書いてみる。
240デフォルトの名無しさん:2008/07/11(金) 02:05:13
メール欄を空にするっていうのはIDのある板の慣習だな

マ板はID無いし最新10スレで見かけたくらいでは誰も答えられないし
スレ住人の多くは専用ブラウザで新着チェックしてるだろうし
あんまり意味ないかもしれん
241デフォルトの名無しさん:2008/07/11(金) 02:06:31
正規表現使わずに空白で区切って2つの要素書き出すだけで済むと予測
242デフォルトの名無しさん:2008/07/11(金) 02:09:04
>>232
>正規表現を使って
>[10/May/2008:06:47:07 +0900]
>をまとめて文字列として抽出したいのですがどのような記述をすればよいですか?

こんなんでどうでしょう
str.scan(/¥[¥d+¥/[A-z][a-z]+¥/¥d¥d¥d¥d:¥d¥d:¥d¥d:¥d¥d ¥+¥d¥d¥d¥d]/) do
puts $&
end
243232:2008/07/11(金) 02:13:33
ありがとうございました、無事に目的の動作をしてくれました。
244デフォルトの名無しさん:2008/07/11(金) 03:21:46
>>243
>>239 >>241 >>242 のどれを参考にしてどのように解決したのかがわからないと、
質問に(エスパーして)回答した人間にも、また後から検索等でこのスレを参照する
人間にも、何一つ残らないんだがな。

これってわざと?
245デフォルトの名無しさん:2008/07/11(金) 04:01:00
エスパーが必要な初心者がそんなことまで分かるわけ無いだろう
246デフォルトの名無しさん:2008/07/11(金) 04:07:21
list[13],list[200],list[1340]・・・
のように添字が0から順に入っているのではなく乱数が入っている配列があり
添字の小さい順に中身を表示したいのですがどうすればいいですか?
247デフォルトの名無しさん:2008/07/11(金) 04:14:18
Ruby暦2日です。他の言語の経験はあり。

"2000年01月02日" という文字列をDateクラスに変更する
場合どうやりますか?
もちろん正規表現を使って2000, 01, 02 をy, m, d という
変数に入れてってやればできるのはわかりますが、
Rubyっぽく書くにはどうすればいいでしょう?1行で。
2行で書くやり方はわかりました。
248デフォルトの名無しさん:2008/07/11(金) 04:32:11
>>246
nilで埋まってると仮定して、
添字が必要ないなら、list.compact
必要なら each_with_index で回して条件式付けるだけじゃない
249デフォルトの名無しさん:2008/07/11(金) 04:46:47
>>246
ArrayやめてHashを使ってみたらどうだろう
list = Hash.new
list[13] = :a
list[200] = :b
list[1340] = :c
list.keys.sort.each {|key,val| p val }

>>247
その2行で書くやり方ってのは秘密にしなくちゃならないのかね
Date.strptime
250デフォルトの名無しさん:2008/07/11(金) 04:48:24
>>247
Date.parseは日本語表記には対応してないから、正規表現使うしかないんじゃないかな。

date = (require "date"; Date.new(*/(\d+)年(\d+)月(\d+)日/.match("2000年01月02日").captures.map(&:to_i)))
251249:2008/07/11(金) 04:51:17
まちがえた
×list.keys.sort.each {|key,val| p val }
○list.keys.sort.each {|i| p list[i] }
252デフォルトの名無しさん:2008/07/11(金) 04:51:58
逆に日本語の部分を - に置き換えればいいんじゃね?

ruby -Ku -rdate -e "p Date.parse('2008年07月11日'.gsub(/[^\d]/u,'-')).to_s"
253247:2008/07/11(金) 05:37:40
>>249
特に秘密にしたわけでもなく、しょぼいコードなんで特に書くまでもないかなぁと思って。
元のコード↓
y, m, d = /(\d+)\D+(\d+)\D+(\d+)\D+/.match(datestr).captures.map {|e| e.to_i}
date = Date::civil(y, m, d)

Date.strptime(datestr, "%Y年%m月%d日")
でokでした。全然Rubyっぽく書かなくてokだったんですね。

>>250
最後の(&:to_i)がよくないみたいなんで、↓のようにしたらokでした。
date = Date.new(*/(\d+)\D+(\d+)\D+(\d+)\D+/.match(datestr).captures.map{|e| e.to_i})
ついでにもうひとつ質問ですが、最初の * ってどういう意味ですか?
254247:2008/07/11(金) 05:38:49
>>252
それでもいけました。
255デフォルトの名無しさん:2008/07/11(金) 07:37:37
Rubyっぽいっていう意味がわからない
256デフォルトの名無しさん:2008/07/11(金) 07:41:41
そりゃそれほど意味はなかろう
感覚だもの

制御構造と増分パラメータでデータに順にアクセスする代わりに
データ自体をコレクションにしてeachでぶん回すとか
そういう目に見えてわかりやすい「Rubyらしさ」だけではないからな
257デフォルトの名無しさん:2008/07/11(金) 08:33:43
ところでRubyって末尾再帰の最適化してくれる?
258247:2008/07/11(金) 08:40:08
>>255-256
おっしゃる通り特に大した意味はないです。
「あー、それであってるしJava(C, PHP, etc)では確かに
そうやるんだけど、Rubyだと普通はこうやるねー。」
みたいなのがあればそう言う方法を知りたいなと思っただけです。
259デフォルトの名無しさん:2008/07/11(金) 12:29:24
>>257
いや全然
そういう意味でRubyの再帰はオマケ
260デフォルトの名無しさん:2008/07/11(金) 13:24:43
Rubyの練習で、以下の機能を持った体重日記を作ろうとしています
 ・1週間の体重の推移がシンプルな折れ線グラフで表示される
 ・フォームからその日の体重をPostすれば、グラフに反映される
 ・体重の入力は、携帯から行う
なんとか体重の入力と記録、重複のチェックは作ったのですが、
肝心の「グラフ化」をどうすればよいのかわかりません
以下の一連のレス(Nで前進、Pで後退)も参照したのですが、
携帯で使えるかどうかがわからないもので…
(今ならば、もっと新しい方法があるのでしょうか)
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/30426

見た目にはこだわりませんので、
初心者でも比較的簡単に実装できるグラフ化の方法がありましたら
どうか教えてください。
261デフォルトの名無しさん:2008/07/11(金) 13:32:23
なんか微妙にハイレベルな問題だな

えーと、そのRubyスクリプト(たぶんCGI)を動かすためのサーバに
どんなソフトがインストールされてるかに完全に依存する

授業やら演習やらでの話なら、その前の授業とかでグラフや画像の作成の問題が出てるはず
全く出てないなら極悪授業だな
262デフォルトの名無しさん:2008/07/11(金) 13:52:36
外部プログラム無しのRubyだけで画像を生成するのは至難の技だ
…まあそりゃ画像フォーマットにもよるけどさ
でもXBMとか作っても仕方ないだろ
263260:2008/07/11(金) 14:42:43
>>261
サーバはロリポップを使う予定です。
ttp://lolipop.jp/?mode=manual&state=hp&state2=cgi
…何が入っているんでしょうね。
お勧めのものを伺って、使えるかどうかサポートに尋ねることにいたします。

なお、授業や演習の課題ではなく、趣味とダイエットを兼ねた練習です。

>>262
最悪、XBMの白黒グラフでも良いですが、やはりできれば色が欲しいです。
「外部プログラム」の使い方(設置の仕方)を把握していない程度には
初心者ですので、お勧めのものがあれば設置方法も教えてえくださいますと
大変助かります。
(今から自分でも検索してみます。外部プログラムが必要なんですね…)


初心者なのに微妙にハイレベルな問題に足を突っ込んでしまっていますが、
「身の程知らずめ!」と思わず、ぜひお力をお貸しください。
264デフォルトの名無しさん:2008/07/11(金) 15:41:24
>>263
もし、個人で使うだけで、なおかつ携帯電話が PNG 画像を読むことができるのなら、
Google Chart にデータを渡しててきとーなグラフを描いてもらうのがいちばん簡単

ttp://chart.apis.google.com/chart?cht=lc&chco=ff0000&chs=200x125&chd=s:FOEHECKHEA&chxt=x,y&chxl=0:|Jan|Feb|Dec|1:||50kg||||55kg

データをアルファベットに変換して渡す(s:FOEHECKHEAの謎の部分)のが若干面倒だけど

rubygems のインストールが許されてるなら gchartrb という gems ライブラリにやってもらえるぞ
ttp://www.infoq.com/jp/articles/bass-google-charts-gchartrb

ロリポップには画像変換のImageMagickは普通に入ってるから、
携帯電話がJPEGしか表示できないとかいう場合はPNG画像を変換させれば問題なし
265デフォルトの名無しさん:2008/07/11(金) 15:52:19
ところでさ、pack と unpack がウンコみたいに書かれたコードを読み解かないといけないんだけどさ
pack とか unpack とかそもそもナンデスカという人向けの勉強になるサイトとか誰かご存知ないですかね
C 言語に習熟していれば素直に理解できたりするのかな?
266260 263:2008/07/11(金) 16:02:05
>>264
Google Chartを使うとは。色々な方法があるものですね
データの渡し方は、いまからシコシコ試してみます

rubygemsの可否は、オペレーターのお姉さんに聞いてみます
ImageMagickのこととかも調べていると、明日になりそう…
でも、おかげさまで助かりました。
とりあえず、いただいた回答&ヒントでがんばってみます

結果はまたご報告します
267デフォルトの名無しさん:2008/07/11(金) 18:58:06
>>260
PNGでいいならPureImage/Rubyでいいんじゃない?
しかしダイエットのためにプログラミングとは素敵な動機だな
268デフォルトの名無しさん:2008/07/11(金) 19:26:37
グラフを作るってのは画像を作るってのとは違うからなあ
折れ線描くための計算をするのも手作業だろ
269デフォルトの名無しさん:2008/07/11(金) 19:42:42
>>268
折れ線グラフなら、計算つったって画像サイズを元にした割合からpx座標の
整数値に落とすだけじゃない?
その程度の計算は、中学生でも多分可能だと。
270デフォルトの名無しさん:2008/07/11(金) 21:23:37
ruby1.8で、
cattle = "yahoo"
の後に
cattle[2] = ?p
でcattleの参照先が
yapoo
になるのが不思議です。
?pは
1.8では112
1.9では"p"
だから、cattle[2] = ?p
っていう代入が正しく動作するのは1.9だけだと思うのですが、
どうして1.8でも正しく動作するのでしょうか?
271デフォルトの名無しさん:2008/07/11(金) 21:35:17
>>270
マニュアルくらいは読んでくれ
ttp://www.ruby-lang.org/ja/man/html/String.html#self.5bnth.5d.3dval
そのように []= メソッドが作られてるからだ
272デフォルトの名無しさん:2008/07/11(金) 21:51:21
>>271
おお!そういうことか!納得。
でもこのマニュアルの探しにくさどうにかならんかなあ・・・。
「配列への部分的な代入について調べたい」っていう目的意識があっても、
俺のようなクソ初心者はマニュアルのトップページからは絶対にここまでたどり着けんぞ。
273デフォルトの名無しさん:2008/07/11(金) 21:54:03
というか最近のRuby使いはそんな恐ろしいコードを書くのか
文字化けかはぐれ三項演算子かとオモタ
274デフォルトの名無しさん:2008/07/11(金) 21:59:30
ttp://doc.loveruby.net/refm/api/
こっち見ようぜ
275デフォルトの名無しさん:2008/07/11(金) 22:02:40
>>272
安心しろ
刷新と称した新版ではさらに一覧性が下がっている
ttp://doc.loveruby.net/refm/api/

なんかうまくいかんね
276デフォルトの名無しさん:2008/07/11(金) 22:09:00
>>273に全力で同意。なにその "?"は。必要なの?
277デフォルトの名無しさん:2008/07/11(金) 22:16:27
?をつけないと

irb(main):001:0> cattle = "yahoo"
=> "yahoo"
irb(main):002:0> cattle[2] = p
TypeError: can't convert nil into String
from (irb):2:in `[]='
from (irb):2

とか怒られます。

マニュアルの中から必要な箇所にたどり着けるようになれば初心者脱出ってことでOK?
278デフォルトの名無しさん:2008/07/11(金) 22:23:43
>>277
cattle[2] = 112
279デフォルトの名無しさん:2008/07/11(金) 22:25:42
>>277
じゃなくて、cattle[2] = 'p' じゃダメなの?っていうこったね。
その ?リテラルが非常に直感的じゃないっていう。
Cやってる人は、そうやってバイト操作するのが直感的なのかな?

#それでも、1.9でやっとString#ordが実装って、正直どうなんだろうw
280デフォルトの名無しさん:2008/07/11(金) 22:26:03
いろんな言語からパクってこそのRubyです
281デフォルトの名無しさん:2008/07/11(金) 22:26:32
>>278
pのアスキーコードを暗記してるruby初心者ならそうやるでしょうね。
282デフォルトの名無しさん:2008/07/11(金) 22:28:07
>>277
そこでTypeErrorになっているのは、pメソッドの返り値(nil)を代入しようとしているため
283デフォルトの名無しさん:2008/07/11(金) 22:29:30
>>276
#\p と書かされるよりはマシ
284デフォルトの名無しさん:2008/07/11(金) 22:29:31
>>279
Encodingが無いとちゃんとしたordは無理だろう
285デフォルトの名無しさん:2008/07/11(金) 22:43:14
?リテラルは潔くエンコード無視だけどね
286デフォルトの名無しさん:2008/07/11(金) 22:44:50
[1]> (setq cattle "yahoo")
"yahoo"
[2]> cattle
"yahoo"
[3]> (aref cattle 2)
#\h
[4]> (setf (aref cattle 2) #\p)
#\p
[5]> cattle
"yapoo"
287デフォルトの名無しさん:2008/07/11(金) 22:47:58
文字エンコードとか面倒だからバイト列にしたはずなんじゃなかったの?
288デフォルトの名無しさん:2008/07/11(金) 23:09:00
>>287
kwsk
289デフォルトの名無しさん:2008/07/11(金) 23:59:13
実現したい機能をもう1度詳しく書いた方が良いよ。
290デフォルトの名無しさん:2008/07/12(土) 00:06:06
文字列の要素の置き換えなんて曲芸以外ではほとんど使わない機能だよね
291デフォルトの名無しさん:2008/07/12(土) 00:17:29
いや、普通に
cattle[2] = 'p'
じゃ駄目なの?この辺はCを意識した作りになってるだけだと思うけどなあ。
イテレータ引数が外部に出ちゃうのも同じ。
292デフォルトの名無しさん:2008/07/12(土) 06:14:48
rubyってawkみたいなテキスト処理ってできるんですか?
293デフォルトの名無しさん:2008/07/12(土) 06:55:55
awkでのどういうテキスト処理のやり方をしたいかによる
awkでのやり方と完全に同じことができるなら、それは単にawkだ
294デフォルトの名無しさん:2008/07/12(土) 07:01:54
たいがいのテキスト処理言語でできることはおーむねフォローされてる
記述子が長いとか文句言った人がいたんだが、
スクリプトが短いのがいいって人は素直にedかsedでも使っとけ
295デフォルトの名無しさん:2008/07/12(土) 07:57:19
javaで言うabstructなクラスを書くにはどうしたらいいですか?
296デフォルトの名無しさん:2008/07/12(土) 08:09:41
>>295
ない。
class Foo
def f
raise NotImplementedError.new("Foo#f(): not implemented yet")
end
end
とするだけ。
297デフォルトの名無しさん:2008/07/12(土) 08:18:25
日本語での文字列の長さを取得したいと考えています
jlengthを使っていたのですが、
マニュアルで
「jcode ライブラリはプロセス全体に影響するため、
中程度以上の規模プログラムで用いることは推奨できません。」
という記述を見つけました。
jcodeを使わずに文字列の長さを取得するにはどうしたらいいのでしょうか?
298デフォルトの名無しさん:2008/07/12(土) 08:21:36
このへんもマニュアルに書いてあるんだけどなあ

str.split(//e).size

ShiftJISな文字列の場合は正規表現を //s に
299デフォルトの名無しさん:2008/07/12(土) 08:30:53
もうそろそろ、全部UTF8にしちまう訳にはいかないのかねえ?
今となってはEUCとかSJISとか全部、言って見れば後方互換だろ?
ここでする話では無いのかもしれんけど
300デフォルトの名無しさん:2008/07/12(土) 08:31:19
>>298
初心者が見つけられる位置になければ、書いてないのとおなじ
301297:2008/07/12(土) 08:50:33
>>298
ありがとうございました
302デフォルトの名無しさん:2008/07/12(土) 08:51:38
>>299
そうしたのがPython

「いや、どんなエンコーディングもそのまま扱えるようにすべき」
としたのがRuby1.9
303デフォルトの名無しさん:2008/07/12(土) 08:57:54
時代の流れに逆行してるよね?
きっと壮大な実験なんだと思う。
304デフォルトの名無しさん:2008/07/12(土) 09:05:49
みんなが使ってる言語で実験しないでください(><)
305デフォルトの名無しさん:2008/07/12(土) 09:29:35
>>299
文字コードの問題はあと10年は続くと思われ。
306デフォルトの名無しさん:2008/07/12(土) 10:13:12
>>303
どうだろう。EmacsなんかはCSIだけどね。
後方互換が重要なんだ!って人もいるにはいるだろう
日本でRubyがこれほど普及したのも日本語(EUC, SJIS, JIS)処理が得意だったからだし。
個人的にはUCS2/4とかをサポートする言語があってもいいと思う。
>>304
まだ誰もRuby1.9は使ってない。
307デフォルトの名無しさん:2008/07/12(土) 10:14:46
全角英数字&全角カナを半角に変換したいのですが
NKFのマニュアルページ見てもやり方がわかりません
どうしたらいいのでしょうか?
308デフォルトの名無しさん:2008/07/12(土) 10:36:37
全角→半角はNKFではできないっぽい。逆は可
ttp://www.google.co.jp/search?hl=ja&q=%91S%8Ap%83J%83i+%94%BC%8Ap+ruby
試してないけどこれが使えそう
ttp://gimite.net/gimite/rubymess/moji.html
309デフォルトの名無しさん:2008/07/12(土) 11:22:43
原理的には {/ア/ => 'ア', /イ/ => 'イ', ...} というHashがあれば用が足りるよな
310デフォルトの名無しさん:2008/07/12(土) 13:39:33
生成後のオブジェクトにモジュールをmixinしたいのですが
どうやれば出来ますか?
311デフォルトの名無しさん:2008/07/12(土) 13:44:37
>>310
extend
312デフォルトの名無しさん:2008/07/12(土) 13:48:11
>>311
ありがとうございます。
もともとこういう機能があったんですね・・
便利だなぁ
313デフォルトの名無しさん:2008/07/12(土) 17:45:32
Rubyのsetter/getterは、Java等のようなsetHoge,getHoge形式ではなく、
外見上はプロパティーへの直接アクセスに見えるものが普通ですが、
プロパティーが何らかのコレクションの場合は、
そのコレクションの要素へのアクセスを提供するメソッドは
どうしてもset_hoge(key,value)的なものになりますよね?
命名規則が一貫しなくてなんかモヤモヤするのですが、
こういうやり方であってるのでしょうか?
314デフォルトの名無しさん:2008/07/12(土) 17:50:28
A: お手軽に、コレクション自体に対するgetterだけ定義する。
B: 破壊的メソッド含め、何でも出来てしまうのがよろしくないなら、
必要なインターフェイスだけを定義したオブジェクトを公開して、
内部で実体へdelegateする。

こんなとこ?
315デフォルトの名無しさん:2008/07/12(土) 18:04:37
そのコレクションのクラスに対して[]=を定義するのがいいんじゃね
obj.params[key]=value ←params のクラスに[]=定義
316デフォルトの名無しさん:2008/07/12(土) 18:20:39
str0 = 'aaaa'
str1 = str0

この後、変数str1を使ってstr0の値を変えたいのですが(PHPのリファレンスのように)
そういうことできますか?
317デフォルトの名無しさん:2008/07/12(土) 18:31:37
チート・コード配布してるサイトだよ
http://www.geocities.jp/titohaihu/

お小遣いの稼ぎ方載ってる、いいサイトだよ
http://www.geocities.jp/kodohaihu/
318316:2008/07/12(土) 18:43:32
replaceで出来ました
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/33931
ここで、Matzが破壊的代入は出来ないと言っているのですが
replaceと破壊的代入は別物なんでしょうか…
319デフォルトの名無しさん:2008/07/12(土) 18:44:02
>>313
315も言ってるように、Rubyでは[ ]や[ ]=をメソッドとして定義できるので
コレクションにそれっぽくアクセスしたいなら、これ使うと便利
320デフォルトの名無しさん:2008/07/12(土) 18:46:49
replaceは特定の文字列オブジェクトが表現している内容を置き換えるもの
321デフォルトの名無しさん:2008/07/12(土) 18:51:26
rubyってeclipse起動するのが面倒でちょちょっと書きたいときにしか使うメリット無いよね
って言われたぜヘヘッ!
322デフォルトの名無しさん:2008/07/12(土) 19:11:31
eclipseを起動するのは何するとき?
323デフォルトの名無しさん:2008/07/12(土) 19:17:25
Javaか大穴でPHPだろうね
324デフォルトの名無しさん:2008/07/12(土) 19:56:07
>>319
[] = って左辺値一般を定義できるのかなあ…

array[index] += hoge;

ってやりたいときは [] += とかあるの?それとも + を使って暗黙に定義されるの?
325デフォルトの名無しさん:2008/07/12(土) 20:25:37
>>324
こう解釈される
array[index] = array[index] + hoge

詳しくはこのページの「自己代入」を参照
http://www.ruby-lang.org/ja/man/html/_B1E9BBBBBBD2BCB0.html
326デフォルトの名無しさん:2008/07/12(土) 23:35:12
↓b.rbにB.newと書かなくても実行スクリプトにする方法とかある?
---- a.rb ----
class A
 def initialize(x)
  if x%2==0
   even
  else
   odd
  end
 end
 def even
 end
 def odd
 end
end
A.new ARGV.shift.to_i
-------------

---- b.rb ----
require 'a'
class B < A
 def even
  ・・・・
 end
 def odd
  ・・・・
 end
end
B.new ARGV.shift.to_i
------------
327デフォルトの名無しさん:2008/07/12(土) 23:51:49
>>326
AのevenとoddをBのもので差し替えたい、のかな?

require 'a'
module B
  def even
    # ...
  end
  def odd
    # ...
  end
end
class A
  include B
end
A.new ARGV.shift.to_i

それよりもa.rbの最下行の方が
すごく気になる(requireされた時点で実行される意味で)。
328デフォルトの名無しさん:2008/07/12(土) 23:55:38
ないと思う。

a.rbの最後の行はa.rbをライブラリとして
requireしたときにも評価(実行のことな)されてしまうから、
削除して、b.rbのほうに

if $0 == __FILE__
B.new ARGV.shift.to_i
end

とするのがよいんじゃなかろうか。
329デフォルトの名無しさん:2008/07/13(日) 01:06:03
deadline という項目に持たせている時間情報から
何時何分、という情報だけを”○○:○○”という形式で
出力するにはどうしたらよいのでしょうか
330デフォルトの名無しさん:2008/07/13(日) 01:13:14
どこに持たせてるの?
DB?
331デフォルトの名無しさん:2008/07/13(日) 01:21:16
>>329
さすがにこれはエスパーできん
あのさ、その質問で相手に通じると思う?
332デフォルトの名無しさん:2008/07/13(日) 01:35:45
>>321
eclipseってnetbeansの使えない環境でしか使うメリットないよねヘヘッ!
333329:2008/07/13(日) 01:54:22
厨すぎて死にたいです申し訳ない・・
DBに入れてるデータに時間情報もたせています
RoRを使っていて、helperを用いて解決しようとしましたがやり方がわかりません
334デフォルトの名無しさん:2008/07/13(日) 02:10:28
Time#strftime
335デフォルトの名無しさん:2008/07/13(日) 02:32:07
ActiveScriptRubyを使っているのですが、irbをコマンドラインで立ち上げると
カーソルキーで移動や履歴参照ができません orz
C-P、C-N、C-F、C-Bとかemacsみたいなキー操作は利くのですが、カーソルで操作したいものです。

cygwin版のRubyのirbだとできるんですが、
何か足りないライブラリなどあるのでしょうか?
336デフォルトの名無しさん:2008/07/13(日) 03:39:48
>>334に答えが書いてるけど、
deadline が Timeオブジェクトだとして
print deadline.strftime('%H:%M')
実際にはapp/helpers/application_helper.rbに
def format_time(t)
t.strftime('%H:%M')
end
みたいなのを定義して、viewで <%= format_time(deadline) %> とする
337デフォルトの名無しさん:2008/07/13(日) 04:10:09
UTF-8の文字列をバイト配列にする方法はどんなものがありますでしょうか?
また、UTF-8を任意バイト長で丸めたいのですがよい方法はありませんでしょうか?
338デフォルトの名無しさん:2008/07/13(日) 04:38:41
>>337
バイト配列にする方法はこれでいけました。

a = "ほげほげ".unpack("C*")
339260:2008/07/13(日) 04:45:39
その節はありがとうございました。
おかげさまで、グラフはいい感じになりました。
>>264
ありがとうございました。Google Chartの説明を読んで初めて
私用のグラフを書いてくださってたことに気付きました。
なお、アルファベットへの変換は諦めて、数字で入れることにしました。
http://www.ajaxtower.jp/googlechart/data/index.html
↑ここの「簡易形式」ではなく「数値形式」

>>267
夏までに!って思っていたら、もう夏です。
クラゲが出るまでには、人様に見せられるBodyになりたい…
でも、なんだか手段が目的になっている気がします。

>>268 >>269
手作業で画像を組成するという方法は、
Google Chartを知った瞬間に頭からベイルアウトされました。
中学生時の記憶など遠い霧の向こうです。
340260:2008/07/13(日) 04:46:50
さて、性懲りも無く次なる試練が訪れましたのでもしお時間があればご指南ください。
日付をDate.todayで書き出し、それを読み込むことによって、今までダイエット記録を付けた日を確認しようとしています。
しかし、読み込んだ日付とDate.todayで呼び出した日付とをIF構文で照合すると、見た目は同じなのに同じでないと判断
されてしまいます。コードは次のようなものなのですが、何がおかしいのでしょうか…

#日付の書き出し(昇順に1ヶ月前まで)
f = open("tesrec.dat" , "w")
n = 0
while n <= 30
f.write Date.today - 30 + n
f.write "\n"
n += 1
end
f.close

#日付の読み込みと照合
require 'date'
datet = Date.today
f = open("tesrec.dat" , "r")
i = f.gets
d = []
n = 0
while i
d << i
i = f.gets
end
f.close
if d[d.length - 1].to_s == datet.to_s
puts "ok"
end
puts d[d.length-1] #これと
puts datet #これは同じに見えるが、違うと判定される
341デフォルトの名無しさん:2008/07/13(日) 05:01:29
p d[d.length-1]
p datet.to_s
342260:2008/07/13(日) 05:16:29
>>341
ありがとうございます!
p って、こんなときに使えるんですね。勉強になりました。
343デフォルトの名無しさん:2008/07/13(日) 12:36:43
やねう企画代表者やねうらお(本名・磯崎元洋)が
・ソフトウェアの不正コピーを行っていた
・労働契約上の違反をしていた
・他は不正コピーしていないことを証明しようとしてエロゲーのパッケージを発見し、
 写真に撮ってアップロードしようとした。
http://d.hatena.ne.jp/pmoky/19000106
やねう企画の裏側(競馬の詐欺ソフトの製作現場)
http://d.hatena.ne.jp/pmoky/20060510
http://d.hatena.ne.jp/pmoky/20060511
http://d.hatena.ne.jp/pmoky/20060512
有限会社やねう企画(所在地・大阪府八尾市末広町2-1-2)が計画倒産
http://www.sia.go.jp/~osaka/zenso/19.09.pdf

やねうらおプロフィール
性格:友達から「チンピラ」「ヤクザ」と呼ばれている。前世で殺人鬼だった宿業を背負っているという妄想(自覚)あり。
最終学歴:専門学校卒
主な職歴:有限会社センキ(凌辱系アダルトゲームの製作会社)を経て独立、有限会社やねう企画を設立、2006年に計画倒産
代表作:『夜這いマニア』『盗撮マニア』『お楽しみCDシリーズ』『競馬詐欺ソフト』『BM98』

やねうらお語録
>「ワシのほうが潔癖やと思うんやけどな。
>絶対に違法コピーのソフトしか使わんし。
>たとえば強盗に入ったときに、ちょっとかわいそうになって
>十万円だけ残してったら、おかしいやろ?
>自分の『強盗する』という意思に対して矛盾やろ?
>だからワシは、一個も買ったソフトを使ったことがない!!」
344デフォルトの名無しさん:2008/07/13(日) 12:40:48
コピペ君って馬鹿だな、まで読んだ。
345デフォルトの名無しさん:2008/07/13(日) 12:50:29
>>344
反応してるのお前だけだぞ
346デフォルトの名無しさん:2008/07/13(日) 12:55:47
すいません。どこで聞いたらいいか分からなかったので、
ここで質問させてください。

Rack + Mongrelでウェブアプリを作ろうとしているのですが、
これをデーモン化する簡単な方法はないんでしょうか?

Mongrelだけなら-dオプションでOKなんですが・・・。
347デフォルトの名無しさん:2008/07/13(日) 14:04:45
>>338
半端なバイトが出来ないように指定バイト数以下に切り詰めたいということですか?
UTF-8のエンコードの仕組みを調べればいいんじゃないでしょうか。
348デフォルトの名無しさん:2008/07/13(日) 15:16:57
cygwin版のruby (1.8.7 (2008-06-20 patchlevel 22) [i386-cygwin])
で、以下のコードを実行してもタイムアウトが起こりません。
require 'timeout'
$counter = 0
begin
Timeout::timeout(5) { loop { $counter += 1 } }
rescue Timeout::Error
puts "I can count to #{$counter} in 5 seconds."
end

ほぼ一緒の以下のコードならタイムアウトが起こります。
require 'timeout'
begin
Timeout::timeout(5) { sleep }
rescue Timeout::Error
puts "I woke."
end

なぜでしょうか?
349デフォルトの名無しさん:2008/07/13(日) 15:29:42
>>347
いぇすそういうことです。
サックリできる方法ないかと思ってたんですが、先頭からナメていくしかないのかなあ・・・
350デフォルトの名無しさん:2008/07/13(日) 15:51:36
おいおい博士単位取得退学なんて馬鹿のとる学歴だぞ
修士で就職できなかった人間が博士も終了できないので
早々に大学院から去ったときにとるのが単位取得退学
修士以下の学歴だ
351デフォルトの名無しさん:2008/07/13(日) 15:52:24
おっとスレ間違えた
352デフォルトの名無しさん:2008/07/13(日) 16:51:27
正規表現内で { そのものをマッチングするのってどうやればいいんでしょうか?
s =~ /{/ とか /\{/ とかやってみても動かず・・・
353デフォルトの名無しさん:2008/07/13(日) 17:29:23
後者で動くと思うよ
"int main(void) {...}" =~ /\{/ #=> 15
354デフォルトの名無しさん:2008/07/13(日) 17:46:42
>>353
ほんとうだ・・・別なとこで弾かれてたッぽい orz
ありがとうです
355デフォルトの名無しさん:2008/07/13(日) 17:52:17
単語がタブで区切られているファイルを
タブで切り分けようと思ってsplitを使ったら
「private method `split' called for #<File:sample1> (NoMethodError)」
と言われてしまいました。
splitがいけないのかと思いscanを使っても同様のエラーが出ます。
タブじゃだめなのかと思い区切りを\nにしても同じエラーが出ます。
しかしsplitを使って先日作った別のプログラムは何の問題もなく動作します。
何がいけないのやらさっぱり分かりません。
どなたかご教授お願いします。OSはXP、rubyは1.8.7です。
356デフォルトの名無しさん:2008/07/13(日) 17:53:02
なんかプログラミングで「弾かれる」って表現違和感あるな
357デフォルトの名無しさん:2008/07/13(日) 17:54:06
このスレを見ている人はこんなスレも見ています。(ver 0.20)
オールインFXってどうよ?5コピペは勘弁 [ベンチャー]
【三洋薬品】 大日本販売 【社名変更】 [ちくり裏事情]
【肯定/否定】オールインFXってどうよ その21 [ベンチャー]
韓国人と仕事し な ら が 困ったこと@P板★4 [プログラマー]
【鬱病】 壊れたプログラマー 12人目 【爆発】 [プログラマー]

Rubyistのイメージが・・・
358デフォルトの名無しさん:2008/07/13(日) 17:56:37
>>355
とにかく該当部のコードを貼って
エスパー回答はやりたくない
359デフォルトの名無しさん:2008/07/13(日) 17:58:57
>>358
array = []
data = open("sample1")
array = data.split(/\t/)
print array
360デフォルトの名無しさん:2008/07/13(日) 18:00:32
open('hoge.tsv'{|f| f.split("\t") } とかやってるんだろう
文字列を切り分けるんだからsplitはStringに対して呼ばなきゃダメよ
361デフォルトの名無しさん:2008/07/13(日) 18:01:22
data = open("sample1").read()
362355:2008/07/13(日) 18:09:14
>>361
動きました!ありがとうございました。
363デフォルトの名無しさん:2008/07/13(日) 18:17:30
>>362は結局理解してないに一票
364デフォルトの名無しさん:2008/07/13(日) 18:22:52
まあ世の中そんなもんだ
・躓かないために原因を探る人
・根性と運で躓きを乗り越えようと考える人
どっちも一定割合で存在する
365デフォルトの名無しさん:2008/07/13(日) 18:49:15
たぶん大丈夫だろうけど、>>361の方法だとファイルディスクリプタを
openしっぱなしになるので、長時間メモリに載ったまま動くスクリプト
では注意。
366デフォルトの名無しさん:2008/07/13(日) 18:55:37
GCは?
367デフォルトの名無しさん:2008/07/13(日) 19:10:27
IOインスタンスのファイナライザにclose(2)なんてあったっけ??
それはともかくGCに外部リソースの回収は期待しちゃいかんよ。

368デフォルトの名無しさん:2008/07/13(日) 19:50:11
この手の勘違いは意外と多い
(しかも多くがしたり顔なのでなおさら迷惑)
まあ、原因を追求すると Ruby の IO クラスのメソッドが微妙な使い分けだからなんだが…

 ・ クラスメソッドの IO.read は内部の ensure で closeされている
 ・ インスタンスメソッドの io#read は close しない

わかりやすく言うと、引数にファイルパスを取る read は単体使用でOK
引数がない(あるいはバイト数だけの)read は close かブロックの併用推奨

今回の >>361 の open('sample1').read は close が必要
しかもこの書き方だと IO オブジェクトがどっか行ったままなので close するのが超面倒
明示的にブロック使うのが読み手にとっても妥当だが、単に File.read('sample1') と書いてもよい
ただしその場合は今回のような「これ close してないんじゃね?」というくだらない議論や不意に沸き起こる不安を覚悟すること
俺もこれを覚えてるつもりなんだが、時々忘れて「これ close してないんじゃね?」と悩むことがある
369デフォルトの名無しさん:2008/07/13(日) 20:27:52
>>367-368
ありがとう。理解があやふやだったんでとても参考になった。

File.read ってあんまり見ない気がするけど
ファイナライザ / ensure で close されることが保証されてるなら
もっと積極的に使うようにするよ。

こういうことがマニュアルに書いてないのは、あまり意識されてないからかな?
370デフォルトの名無しさん:2008/07/13(日) 21:07:33
File.read(path) の使用をそのへんであまり見ないのには理由がある
可搬性がすこしだけ低いからだ
バイナリモードにしない・できないから、Windowsでテキストファイル以外を読むと危険

これのおかげで、せっかくの close いらずの便利機能なのに
「うっかり使ってしまわない」ように大多数の人間の記憶から取り除かれてる
(ほとんどの場合はテキストファイルとみなせるものしか読み込まないから問題ないんだけど、時々うっかり使うことがありえる)

だから、ファイルの読み込みは file = File.open(path, 'rb'){|f| f.read} という固定イディオムだ
そんなわけで、公開スクリプトや配布スクリプトで File.read(path) を見ないのは意図的なもんだ
371デフォルトの名無しさん:2008/07/13(日) 21:35:21
てかマニュアルに書いてあるぞ
IOのとこ見ろ
372デフォルトの名無しさん:2008/07/13(日) 21:43:56
File.read(path)でバイナリモード指定ぐらいはできるようにしてほしい、といつも思う
この辺りにMatzのWindowsへの興味の無さが現れているな
373デフォルトの名無しさん:2008/07/13(日) 21:48:49
>>371
あああ書いてあった。ボケててごめん
ttp://www.ruby-lang.org/ja/man/html/IO.html
> port = open(path)
> port.pos = offset if offset
> begin
> port.read length
> ensure
> port.close
> end

>>370
なるほど、たしかに File.read だとモードを指定できないから・・・
なるべくイディオムのほう使うよう肝に銘じときます
374デフォルトの名無しさん:2008/07/13(日) 21:50:32
初版でWindowsガン無視なのは別にいいんだよ、代替可能な便利機能にそこまで求めないさ

でも既に Ruby 1.8.7 だぜ
しかも、binmode を追加すると何か困るんか? 普通困らないだろ?
375デフォルトの名無しさん:2008/07/13(日) 21:57:24
ttp://doc.loveruby.net/refm/api/view/method/IO/s/read
1.9.0-2あたりじゃ出来そうだな
376デフォルトの名無しさん:2008/07/13(日) 22:05:24
テキストモードのほうが特殊なんじゃないかと思う
377デフォルトの名無しさん:2008/07/14(月) 02:10:44
359の例は思い切りテキストモードを期待してるわけだが。
378デフォルトの名無しさん:2008/07/14(月) 04:35:06
>>361
今時、data = open("sample1").read()
なんて薦めるなよ
 data = IO.read "sample1"
か、
 data = open("sample1") {|f| f.read}
だろJK
379デフォルトの名無しさん:2008/07/14(月) 05:04:09
IO.read(fn) を良く見るけど File.read(fn) の方が直感的に(覚え|読み)やすいと思う
380デフォルトの名無しさん:2008/07/14(月) 07:18:35
>>378
直後で否定されてるってどんな感じ?
直後で否定されてるってどんな感じ?
381デフォルトの名無しさん:2008/07/14(月) 07:25:27
新着レスから順に読むとこういうことが起こるよな
多少無理しても最新レスから遡って読むのがベター
382デフォルトの名無しさん:2008/07/14(月) 11:21:42
読んでる人がどれだけいるかわからんけど、テンプレをアップデートしようぜ

最新安定版は一応 1.8.7 だ
あと、他言語習得者がRubyとしての書き方を学ぶ本として『初めてのRuby』を入れておきたい
383デフォルトの名無しさん:2008/07/14(月) 11:31:53
質問。
Linuxで自力コンパイルして入れたRuby1.8.6-p0を、パッチレベル最新の1.8.6にしたいです。
どうすればいちばん安全に「上書きアップデート」できますか?
OSはDebianのSargeです。p0をインストールしたときのソースコードディレクトリはそのまま残ってます。
384デフォルトの名無しさん:2008/07/14(月) 11:34:32
あ、忘れてた。
rubygemが/usr/local/lib/ruby/gems/1.8/以下にわーっとあったりするので、
「なんかRubyっぽいディレクトリ全部消してからmake installすればOKじゃね?」というのは不安です。
385デフォルトの名無しさん:2008/07/14(月) 11:57:00
ファイルの増減がないんだったらそのまま make install すれば安全に全ファイルが上書きされるんじゃないの
386デフォルトの名無しさん:2008/07/14(月) 12:06:54
>>382
900越えた辺りでもう一度提案するといいんじゃないかな
387デフォルトの名無しさん:2008/07/14(月) 12:30:19
>>386
テンプレ案はなるべくスレの最初のほうで提案するのがベター
900過ぎてから書かれてもたまたまその場にいたごく一部の人間しか議論に参加できん
388デフォルトの名無しさん:2008/07/14(月) 12:40:16
>>387
議論に関してはその通りだろうけど、次スレ立てる人は
その「たまたまその場にいた」人なわけで
どのみち、最後にまとめはいると思うが

「テンプレ」で抽出出来るように、とりあえず無理にでも
「テンプレ」って書いて議論すればいいのか
389デフォルトの名無しさん:2008/07/14(月) 13:29:45
ブロック引数の中で使えるメソッドを動的に定義する方法はありませんか?

class Foo
  def bar(&block)
    #ここでlambdaを使ってbaz()を定義
    block.call
  end
end

foo = Foo.new

foo.bar do
  #ここでコールしたい
  p baz
end
390デフォルトの名無しさん:2008/07/14(月) 13:36:15
ちょっと意味がわからない
391デフォルトの名無しさん:2008/07/14(月) 13:48:13
>>390
説明がわかり辛くてすみません。
例えば、以下のコードで
class Foo
  def bar(&block)
    baz = lambda {
      p 'lambda'
    }
    block.call(baz)
  end
end

foo = Foo.new

foo.bar do |baz|
  baz.call
end

呼び出し側の foo.bar do |baz| の部分を foo.bar do に、
baz.call を baz のように表記したいです。
392デフォルトの名無しさん:2008/07/14(月) 13:59:50
>>383
1.8.6なら、コンパイルしたディレクトリの .installed.list というファイルに、
インストールしたファイルの一覧があるはず。

sudo xargs rm < .installed.list
393デフォルトの名無しさん:2008/07/14(月) 14:01:43
>>391
class Foo
 def bar(&block)
  def self.baz
   p 'lambda'
  end
  block.call
 end
end

Foo.new.bar do
 baz
end
394デフォルトの名無しさん:2008/07/14(月) 14:13:34
>>393
試してみましたが
undefined local variable or method `baz' for main:Object
とエラーが出ました。
Rubyのバージョンはruby 1.8.6 (2007-06-07 patchlevel 36) [i486-linux]です。
395デフォルトの名無しさん:2008/07/14(月) 14:31:30
メソッドを動的に定義するというより、文脈じゃないか
396デフォルトの名無しさん:2008/07/14(月) 15:19:48
class Foo
 def bar(&block)
  def self.baz
   p 'lambda'
  end
  instance_eval(&block)
  class << self
   undef_method :baz
  end
 end
end

Foo.new.bar do
 baz
end
397デフォルトの名無しさん:2008/07/14(月) 17:02:29
>>391
まず、もともとのコードと目的を書いたほうがいい
たぶんそういう風な表記よりも、もっと良い方法がある
398デフォルトの名無しさん:2008/07/15(火) 00:59:00
debugに関して質問させてください

C言語を書いていたころは
ifdef DEBUG
printf("デバッグ")
end
とか書いて、printfデバッグやってました
rubyだと、デバッグ時にのみ出力したログなどはどのように記述するのが王道でしょうか?

あと、JavaだとeclipseなどのIDEを使いブレイクポイントの指定やステップ実行を行っていました
rubyで同様の機能を持つIDEは存在するのでしょうか?

もし、IDEが存在するならば、コード補完とか可能でしょうか?
rubyの場合、動的型付なので、コード補完は難しいですかね?

よろしくお願いいたします
399デフォルトの名無しさん:2008/07/15(火) 01:07:45
$DEBUG

RDE
400デフォルトの名無しさん:2008/07/15(火) 01:14:22
$DEBUG というグローバル変数がある
スクリプトの中の最初に指定することもできるし、
ruby に -d オプションをわたして起動させるとオプションが勝手に指定される

warn 'エラー出力に出力' if $DEBUG

とか

require 'logger'
$LOG = Logger.new('log.txt') if $DEBUG
$LOG.info("data is #{data}") if $LOG

とか使う

ブレークポイントは一応 debug.rb に入ってるがあまり期待しないこと
401デフォルトの名無しさん:2008/07/15(火) 08:31:53
402デフォルトの名無しさん:2008/07/15(火) 09:07:06
さっき気づいたんだけど、-dオプションって$DEBUGだけじゃなく$VERBOSEもtrueにしてるよな
この事リファレンスマニュアルに書かれてないんだが、ML等で今までに誰か指摘してる?
(ruby 1.8.7で確認)

>>400
上の例では$DEBUGで判定しなくても、単にwarnだけでいいんじゃないか?
冗長モードが存在するRubyで、わざわざ$DEBUGで判定する意義はあまりないと思う
403402:2008/07/15(火) 09:09:39
訂正
「単にwarnだけでいい」じゃなくて、「if $VERBOSEで判定すればいい」だった
404デフォルトの名無しさん:2008/07/15(火) 16:57:13
でもまー実際問題として本当に必要なのは自作スクリプトやライブラリのログ出力であり

他の標準ライブラリのログも一緒に出力される $VERBOSE はとても使いづらい
$DEBUG は名前はいいんだがデバッグモードになって動作が変わるのがちとアレだ

というわけで、何かオリジナルのグローバル変数を設定してそれが真ならログを吐く、というスクリプトにならざるを得ない
405398:2008/07/15(火) 20:06:14
>>399>>400>>402>>403>>404
レスありがとうございました
$DEBUGってそのまんまの名前の変数があったんですね、、、
気が付かなかった自分はアフォです

それと、
>というわけで、何かオリジナルのグローバル変数を設定してそれが真ならログを吐く、というスクリプトにならざるを得ない
との指摘を受けましたが、これでも十分対応できそうですね
それか、デバッグ用ログ吐く専用のクラス作って指定したレベルに応じて出力するログの詳細を決定するとかありそうですね

406デフォルトの名無しさん:2008/07/15(火) 21:04:48
>>405
つ Logger
407デフォルトの名無しさん:2008/07/15(火) 21:35:19
>>406
失礼しました
Log機能なんて、いかにもありそうな機能ですよね(ちゃんと調べてから喋れよ、自分!)

レスありがとうございました。
408デフォルトの名無しさん:2008/07/15(火) 22:45:11
Ruby on Railsを初めたばかりのものです。
Webアプリで使うデータを外部からを取り込むプログラムを
Rubyで書いてます。

1.その際、そのスクリプトはどこに置くべきでしょうか?
RoRのプロジェクトディレクトリ(?)の外?

2.そのスクリプトからデータベースにアクセスする必要があります。
RoRのコードを極力使いたいと思うのですが、生成された
app/models/foo.rb とかを使うと、Ruby:DBIとかそういうのを
使わずに済みますか?

409デフォルトの名無しさん:2008/07/15(火) 23:00:59
>>408

1.
script/というディレクトリがあるからそこにおけばよいんじゃないでしょうか。

2.
./script/runner [-e ENV] 所望のスクリプト
とすると該当のRails環境ENVで動きます。(デフォルトはdevelopmentね)

Rakeタスクとして書くのもあり。
lib/tasks/mytask.rake みたいな名前でタスク定義を置く。
Railsのコードを使うなら、
task :mytask => :environment do
...
end
とすると環境変数RAILS_ENVの環境(or development)で動く。

410408:2008/07/15(火) 23:04:26
>>409
script ってそういう為にあったんですね。なるほど。

runner で簡単にいけそうですね。ありがとうございます。
rakeタスクも調べてみます。
411デフォルトの名無しさん:2008/07/16(水) 00:13:26
島大付属って島大の教員養成施設と化しているらしいな
やっぱ公立の学校が無難だろ
412デフォルトの名無しさん:2008/07/16(水) 00:36:16
>>411
どういう誤爆?
413デフォルトの名無しさん:2008/07/16(水) 02:43:14
島根つながり?
414デフォルトの名無しさん:2008/07/16(水) 04:51:39
FileUtilsのdereference_rootが腐ってない?
cp_rでディレクトリのコピーする時、
中にsymlinkなファイルがある時、cp -rLと違う。
415デフォルトの名無しさん:2008/07/16(水) 08:41:01
>>414
その説明じゃわからん
416デフォルトの名無しさん:2008/07/16(水) 13:09:55
ネストしているハッシュを、ネストしているオブジェクトにバインドして、
オブジェクトに加えた変更をハッシュに反映するようにしたいと思います
そのためハッシュツリーの位置を示したポインタが欲しいのですが、
Rubyにはポインタがありません
どうすればポインタ的なことを実現できますか?
417デフォルトの名無しさん:2008/07/16(水) 13:11:36
いろいろ間違ってる
418デフォルトの名無しさん:2008/07/16(水) 13:14:21
そういう無意味な返答はいりません
419デフォルトの名無しさん:2008/07/16(水) 13:29:03
じゃあ__id__で好きなようにやれ
420デフォルトの名無しさん:2008/07/16(水) 13:46:43
オブジェクト維持するように作ればできなくもない
irb> a = ['one', 'two', 'three']
["one", "two", "three"]
irb> h = {'key1'=>a[0], 'key2'=>a[1], 'key3'=>a[2]}
{"key1"=>"one", "key2"=>"two", "key3"=>"three"}
irb> a[1].replace('2')
irb> h
{"key1"=>"one", "key2"=>"2", "key3"=>"three"}

ただ、>>417の言うように普通この動作を利用してクラスを作るようなことはしない
とても見苦しくて紛らわしいからだ
プログラミングはパズルではないので複雑であることでは誰も喜ばない

オブジェクト内部のデータをインスタンス変数か何かで保持してアクセサメソッド経由で外部に提供したりすることのほうが多い
>>416の話でいえば「ネストしているハッシュ」というものは存在させずに HogeObject.hogedata でアクセスできるようにするとかなんかそんな感じ
421デフォルトの名無しさん:2008/07/16(水) 14:01:40
p Time.now().to_i()
とすると秒単位で出るみたいなのですが
ミリ秒マイクロ秒で得たいときはどうするのでしょう?
422デフォルトの名無しさん:2008/07/16(水) 14:03:34
objectのid使っても、読み込みはできますが書き込みはできないですよね
ObjectSpace._id2refでオブジェクトの参照得ても、
代入した時点で違うオブジェクトの参照になってしまうので。
420さんのreplaceは、Stringの値を変えているので、別種のクラスのインスタンスに
置き換えることはできません。
確かに変なやり方ですが、ネストされたハッシュが規定なんです。
具体的にいうと、HTTPのリクエストパラメータを、
フォーム管理オブジェクトにバインドして、
そこで処理した結果を、リクエストパラメータのハッシュにも同時に反映させたいんです
参照をオブジェクトにできないというのはRubyの致命的な欠点ではないでしょうか?
423デフォルトの名無しさん:2008/07/16(水) 14:04:45
>>421
該当クラスのマニュアルくらい読めやおらー
ttp://www.ruby-lang.org/ja/man/html/Time.html#to_f

こういうのって実行結果が表示されてるとひと目で見てわかりやすいよね
424デフォルトの名無しさん:2008/07/16(水) 14:04:53
>>421
to_f
425デフォルトの名無しさん:2008/07/16(水) 14:06:31
ありがとうございました
426デフォルトの名無しさん:2008/07/16(水) 14:08:35
>>423
>実行結果が表示されてるとひと目で見てわかりやすいよね
Rubyはこのへん結構手ぇ抜いてるよな
マニュアル書いてる人には自明なんだぜ、きっと
427デフォルトの名無しさん:2008/07/16(水) 14:24:38
>>422
そりゃ単にあんたがハッシュオブジェクトを自分から破壊して同一性を破棄してるだけだ
オブジェクトについて語るならもうちょっと勉強しとけ
ハッシュや配列は要素の参照や追加でオブジェクトIDが変更されることはない
= でハッシュの変数にハッシュ全体を上書きしてるとかなんじゃね

個人的にはグローバル変数と同じような危険性を感じるので
self 以外の引数のオブジェクト内部をいじるという処理はお勧めしない
単一オブジェクトの使いまわしは最初は「理知的でカッコイイ」んだが、実際にメンテするともう面倒で面倒で
428デフォルトの名無しさん:2008/07/16(水) 14:26:46
>>422
ハッシュの変更をオブジェクトに反映させる必要はないんだよね。なら

class FormObject
 def initialize(request_hash)
  @request_hash = request_hasn
 end
 def param1=(val)
  @param1 = @request_hash[:param1] = val
 end
 attr_reader :param1
 …
end

とでもして、@param1 を直接変更しないようにすればいいんと違うか?
なんかみんな難しい話してるけど俺が読み違えてるのかな。
429デフォルトの名無しさん:2008/07/16(水) 14:42:39
>>428
いや、正しい

そもそもの問題として、ほんとうにハッシュなら「オブジェクトIDが食い違って困る」ことのほうが珍しいんだ
オブジェクトIDが違うハッシュの複製をいじったものを返り値として返されても、ハッシュとしては機能するはずだからね

・メソッドの中でハッシュ全体を複製していじってるか、ハッシュを新規に作って更新データを登録している(これありがち)
・なおかつそのメソッドからの返り値は一切利用しない
・その状況でありながら、元のハッシュオブジェクトの中のデータを変更して欲しい

と言ってるように見える
無茶言うな
ハッシュの複製や新規作成をやめるか、複製や新規に作ったハッシュを返り値にして利用するかにしとけ
430デフォルトの名無しさん:2008/07/16(水) 17:56:18
クラス変数をprivateにできない?
継承されるのがいやなんだけど
431デフォルトの名無しさん:2008/07/16(水) 18:22:40
あーそれできないんよ
継承先で別の値入れたい場合はクラス名で場合分けするしかないな
432デフォルトの名無しさん:2008/07/16(水) 18:25:19
クラスのインスタンス変数にするとかどうよ
アクセサ経由になるのがめんどくせえけど
433デフォルトの名無しさん:2008/07/16(水) 18:33:30
クラスのインスタンス変数にすると可視性はどうなるの?
インスタンスメソッド内から見える?
434デフォルトの名無しさん:2008/07/16(水) 18:42:11
もしかしたら知らないかもしれないので注釈すると、
変数アクセスをシステム的に禁止することはRubyではそもそもできないよ
定数すら警告だけで2度目の代入が可能な言語だし
「継承したらこれは使わないでください」って赤字でマニュアルに書いておけ
435デフォルトの名無しさん:2008/07/16(水) 18:45:47
変更どころか削除もできるという・・・・・すげー性善説の言語
436デフォルトの名無しさん:2008/07/16(水) 18:47:51
>>433
見えない
ただし、そのClassに定義された特異メソッドからは見える

class Foo
 @bar = 20

 def self.get_bar
  return @bar
 end

 def get_bar
  return @bar
 end
end

p Foo.get_bar #=> 20
p Foo.new.get_bar #=> nil
437デフォルトの名無しさん:2008/07/16(水) 19:51:35
rubyって数値計算用のAPIありますか?
438デフォルトの名無しさん:2008/07/16(水) 20:14:25
>430-436
Pythonも似たようなもんだろ
439408:2008/07/16(水) 20:39:09
以前Ruby on Railsの質問をしたものです。

scriptフォルダ以下に自前のスクリプトを置こうとして気づいたんですが、
何でこのフォルダにあるスクリプトはrbという拡張子がついてなくて、
その他のフォルダにあるファイルには拡張子がついているんですか?
440デフォルトの名無しさん:2008/07/16(水) 20:40:04
>>437
ぶっちゃけた話、精度や速度には期待しないで
そこだけPerlでPerlのモジュール利用して書くとかにしたほうが正確かもしれない
441デフォルトの名無しさん:2008/07/16(水) 20:40:51
>>439
Rails固有の話は基本的にスレ違い
442439:2008/07/16(水) 20:45:28
すみません。Railsのスレがないみたいなので。。。DAT落ち?
443デフォルトの名無しさん:2008/07/16(水) 20:56:11
 def get_bar
  return @bar
 end

インスタンスメソッド内で見えてるじゃん
444デフォルトの名無しさん:2008/07/16(水) 21:23:10
ほかの言語をやってた人がRubyの何に困るかは個人的にたいへん興味があるので、もちっと話をききたい。

>>422
>objectのid使っても、読み込みはできますが書き込みはできないですよね
>ObjectSpace._id2refでオブジェクトの参照得ても、
>代入した時点で違うオブジェクトの参照になってしまうので。

これ、どういう意味?

>確かに変なやり方ですが、ネストされたハッシュが規定なんです。
>具体的にいうと、HTTPのリクエストパラメータを、
>フォーム管理オブジェクトにバインドして、
>そこで処理した結果を、リクエストパラメータのハッシュにも同時に反映させたいんです

これも日本語の意味がわからん。コードで書いてくれ。
たとえば x=abc&y=123 があったとして、これが {'x'=>'abc', 'y'=>'123'} になって、そっからどうなるの?

>参照をオブジェクトにできないというのはRubyの致命的な欠点ではないでしょうか?

参照をオブジェクトにするというのはどういうこと? どの言語だったらできるの?
445デフォルトの名無しさん:2008/07/16(水) 21:25:29
>>437
http://www.google.co.jp/search?q=Ruby+数値計算

>>439
.rb がついているのはライブラリとして読み込むファイル
ついてないファイルは単独のスクリプトとして実行するファイル

446デフォルトの名無しさん:2008/07/16(水) 21:28:09
>>440
どういうこと?Rubyって演算関係ぐだぐたなの?
447439:2008/07/16(水) 21:29:10
>>445
ありがとうございます!
448デフォルトの名無しさん:2008/07/16(水) 21:33:32
>>443
見えてないからnilになってるんだぞ?
449デフォルトの名無しさん:2008/07/16(水) 21:33:45
>>446
え、もしかして「速度が気になるならアセンブラで書け」とか言ったりする極論馬鹿ですか?
450デフォルトの名無しさん:2008/07/16(水) 21:34:46
微妙に初心者というよりアンチが混ざってるw
451デフォルトの名無しさん:2008/07/16(水) 21:45:33
>>437
数値演算のAPIというのがよくわからないが
Mathモジュールのことか?
452デフォルトの名無しさん:2008/07/16(水) 22:03:27
いいえ、加齢臭が原因で窓際に追いやられている、ただのオッサンです。
453デフォルトの名無しさん:2008/07/16(水) 22:08:59
このスレを見ている人はこんなスレも見ています。(ver 0.20)
【三洋薬品】 大日本販売 【社名変更】 [ちくり裏事情]
【肯定/否定】オールインFXってどうよ その21 [ベンチャー]

さすがスレ参加者の質悪いww
454デフォルトの名無しさん:2008/07/16(水) 22:22:10
まず、数値計算ていうのが何を念頭に置いた話かはっきりさせたほうがいいと思う。
455デフォルトの名無しさん:2008/07/17(木) 00:01:54
setter,getterが名詞なので、
ローカル変数かメソッド名かわかりにくくなります
特にvalueなんて、プロパティー名としても、ローカル変数としてもよく使います
そういう混同を防ぐためのコツとかありますか?
456デフォルトの名無しさん:2008/07/17(木) 00:10:57
メソッド呼び出しには必ず () をつけるという記述ルールを使ってる人は一定数いる
俺は引数なしメソッドもローカル変数もこっちから見れば値を返す点で一緒だと思ってるからつけないけどな
457デフォルトの名無しさん:2008/07/17(木) 00:11:43
名前重要。
458デフォルトの名無しさん:2008/07/17(木) 00:20:11
>>457
じゃあ get_~~, set~~ ?
459デフォルトの名無しさん:2008/07/17(木) 00:21:49
self付けりゃいいんじゃねーのか
460デフォルトの名無しさん:2008/07/17(木) 00:28:26
value なんて名前はどうかと思うってことじゃね?

ローカル変数と区別が付かない=selfなしのアクセサ単独で呼べるコンテキスト
ってことは、インスタンス変数(@valueトカ)を直接読み書きすればいいんじゃないの?

# 確かに、対応するインスタンス変数がないsetter/getterてのもあるが……
461デフォルトの名無しさん:2008/07/17(木) 00:33:50
valueをどうかと思うってどういう感覚?
valueはvalueだろ
462デフォルトの名無しさん:2008/07/17(木) 00:52:36
というか、ある程度(「質問」を越えたあたり?)まで発展すれば、
本スレなりアンチスレなりに移動すればいいんじゃないかなと思う
・・・けど、まあそんなに気になる話題でもないからここでやってる
んだろうなw

とりあえず、最初に無駄に広げる奴が自重しろということだと思った
463デフォルトの名無しさん:2008/07/17(木) 06:16:43
Ruby/Tkについてある程度のレベルまで体系的に学べるサイトはありますか?
464デフォルトの名無しさん:2008/07/17(木) 08:09:16
ググってみてもそういうのはあまり見当たらないし、256倍本買ってウェブで補う方が
手っ取り早いんじゃね?

ところでググったときにこんなの見つけた。

http://www.nicovideo.jp/watch/sm3721257
465デフォルトの名無しさん:2008/07/17(木) 12:23:59
あれはTkをRubyから使う技術だから、Tkを知らないと使いこなせないよ
Tcl/Tkの勉強をする野田手っ取り早いかも知れない
466デフォルトの名無しさん:2008/07/17(木) 16:56:24
文字列の配列から正規表現を作るにはどうしたらいいですか?
aa,ab,ac→a[a-c]
みたいな操作をしたいのですが
467デフォルトの名無しさん:2008/07/17(木) 17:13:14
>>466
むしろそうやって自動で最短の正規表現にまとめられる言語を知りたい

人間の頭で考えて書いたほうが安全確実だぞ
一応、Regexp.unionでまとめることはできるが、
正規表現をまとめる場合はカッコ使ってグルーピングやってると面倒
a = ['aa', 'ab', 'ac']
re = Regexp.union(a) #=> /aa|ab|ac/
# 配列要素が文字列である限りは実際上は同じ
# re = Regexp.union(*a.map{|e| Regexp.new(e)})

p re =~ '0000000aa000000' #=> 7でtrue
p re =~ '000000aaaaaaabb' #=> 6でtrue
468デフォルトの名無しさん:2008/07/17(木) 17:23:24
diff取ればいいんじゃねーの
469デフォルトの名無しさん:2008/07/17(木) 17:33:06
>>466
migemoがそういう処理をやってたな。
470デフォルトの名無しさん:2008/07/17(木) 17:39:59
そういう「正規表現再構成ツール」はいくつか見たが、
どれも未完成で「正規表現パート2」みたいな感じで
頭で考えるの面倒だからツール使う、みたいなもので
動的に使えそうなものではなかった印象がある
471デフォルトの名無しさん:2008/07/17(木) 18:52:50
attr_accessorみたいな指定の仕方をするメソッドを作ろうと思っています
(クラス定義の中で、宣言的に使うメソッド)
親クラスのクラスメソッドとして定義し、
子クラスで呼び出せるようにしたのですが、
このメソッドが実行されるタイミングではインスタンスが出来ていないので
メソッドの中でアクセスできるのはクラス変数だけですよね
で、複数の子クラスからアクセスさせると、親クラスのクラス変数が
共有で使用されてしまうので、動作が希望したとおりになりません
宣言した内容を、子クラスそれぞれに持たせたいんです
どうするのが正しいやり方なのでしょうか?
472デフォルトの名無しさん:2008/07/17(木) 18:58:34
>>471
正しいかどうかは知らないけど、
クラス変数じゃなくて、子クラスのインスタンス変数を使う、とか。
473デフォルトの名無しさん:2008/07/17(木) 19:16:25
普通にインスタンス変数を使う
クラス変数はRubyではあまり使わない
使うことになった場合は思考がRubyでないことが多い

設計のミスでクラス変数を使わないと死ぬというような場合は、
クラス変数に self をキーとするハッシュを格納する

class Base
@@val = Hash.new
def self.setval=(v); @@val[self]=v; end
def self.getval; @@val[self]; end
end

class A < Base
end

class B < Base
end

A.setval = 'This is A'
B.setval = 'This is B'

p A.getval
p B.getval

結果:

"This is A"
"This is B"
474471:2008/07/17(木) 20:02:37
>>471-472
ありがとうございます
attr_accessorみたいな、
クラス定義直下のメソッド呼び出しが実行されるのは、
クラスの定義時ですよね?
class Hoge < BaseHoge
hoge_accessor :fuga,:piyo
end
こういう形で呼び出すメソッドを作りたいんです
クラスの定義時にはインスタンスは存在しないので
hoge_accessor内から
インスタンス変数にはアクセスできないですよね。
attr_accessorも
親クラスにハッシュとして持たせて実現しているのでしょうか。
475デフォルトの名無しさん:2008/07/17(木) 20:14:15
勝手に補足

471と472の言ってるのは、「Classオブジェクトが持つインスタンス変数を使う」ということで
そのクラスから生成したインスタンスの変数を使う、ということではない
つまり、こうすればクラスごとに変数を持てる

class BaseHoge
 def self.hoge_accessor(*args)
  @accessors ||= []
  @accessors += args
 end

 def self.get_accessors
  @accessors
 end
end

class Hoge < BaseHoge
 hoge_accessor :fuga,:piyo
end

class Hoge2 < BaseHoge
 hoge_accessor :test
end

p Hoge.get_accessors #=> [:fuga, :piyo]
p Hoge2.get_accessors #=> [:test]
476471:2008/07/17(木) 20:18:26
>>475
ありがとうございました
クラスオブジェクトのインスタンス変数とか
理解の範囲を超えてきたのであとでゆっくり見てみます
477デフォルトの名無しさん:2008/07/17(木) 20:21:49
やや蛇足かもしれない補足
attr_accessorはリフレクションとeval系メソッドで実現できる
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20070604/273453/?ST=oss&P=1
478デフォルトの名無しさん:2008/07/17(木) 20:25:08
あれは行数指定でevalすることで似たようなことが実現できたはず
とか書いてたら>>477で書いてた
479デフォルトの名無しさん:2008/07/17(木) 20:28:55
require 'tk'

a=Array.new(9)
for i in 0..8
a[i]=Array.new(9)
end

for m in 0..8
eval ("r#{m} = TkFrame.new.pack")
for n in 0..8
eval ("a[m][n] = TkButton.new(r#{m}, :height=>2, :width=>4, :text=>'0').pack(:side=>'left')")
a[m][n].command{
a[m][n].text=(a[m][n].text.to_i+1).to_s
}
end
end

Tk.mainloop


各ボタンを押せばそのボタン上の数値が1つ増えるようにしたかったんですが、
どれを押しても81番目のボタンしか変化しません。
どこが不味かったんでしょうか?
480デフォルトの名無しさん:2008/07/17(木) 21:30:38
all = Array.new
(0..8).each do |i|
row = Array.new
f = TkFrame.new{pack}
(0..8).each do |j|
row << TkButton.new(f, :height=>2, :width=>4, :text=>'0'){|b|
b.command = proc{b.text = b.text.to_i+1}
}.pack(:side=>'left')
end
all.push(row)
end
Tk.mainloop

とりあえず見た目だけ同じにした
配列の存在意義はよくわからんというか現時点では何もしない
データはボタンのtext変数に入ってるので加工は面倒かもしれん
481デフォルトの名無しさん:2008/07/17(木) 22:05:38
外部配列にデータだけ移動した
あとは知らん

require 'tk'
data = Array.new
(0..8).each do |i|
data << Array.new(9){ 0 }
f = TkFrame.new{pack}
(0..8).each do |j|
TkButton.new(f, :height=>2, :width=>4, :text=> data[i][j] ){|b|
b.command = proc{b.text = b.text.to_i + 1}
}.pack(:side=>'left')
end
end
Tk.mainloop
482デフォルトの名無しさん:2008/07/18(金) 00:37:16
Tkみたいなのってよくわからない

たとえばさ、どっかが5になったときに
  「おめでとうございます! 5です!」
ってウィンドウを出すとかどうするんだ?
loopで無限ループ作って値をチェックし続ければいいの?
483デフォルトの名無しさん:2008/07/18(金) 00:40:29
>>482
「イベント駆動」「イベントドリブン」でぐぐるんだ

RubyやRuby/Tkでどうやるかは知らない
困ったときに調べることにする
484デフォルトの名無しさん:2008/07/18(金) 03:20:38
Railsを使わずにRubyでウェブサイト構築しようと考えていますが
こういうところに気をつけろとかあったら教えてください
485デフォルトの名無しさん:2008/07/18(金) 03:44:35
>>484
「生産性」には期待しないようにすること。

ぶっちゃけ、使えるライブラリの選定・評価からWEBサーバでの動作やエラーの
確認その他、Perl等でのCGIとやることはほぼ変わらない上に、その手の書籍が
少ない(Railsに埋もれてるから?)という茨の道です。

むしろ、趣味の道と覚悟してやった方がいいかと思います。
486471:2008/07/18(金) 04:01:12
Classオブジェクトについてなんとなく分かってきました
BaseHogeに定義したインスタンスメソッドから、
それを継承した子クラスのClassオブジェクトのget_accsessorsを呼ぶには
どう書けばいいのでしょうか?
インスタンスの中から自分のClassオブジェクトを取得できれば
できるのではと思うのですが・・
487デフォルトの名無しさん:2008/07/18(金) 06:29:01
488471:2008/07/18(金) 06:36:14
>>487
ありがとうございました
classでクラス名が分かるのは知っていたのですが返り値をStringと思っていました
これがクラスオブジェクトだったんですね
489デフォルトの名無しさん:2008/07/18(金) 09:16:22
>>484
ちなみにRailsを使わない理由は何?
後、Rails使わない場合でもActiveRecordは使ったほうがいいよ。便利だし。
490デフォルトの名無しさん:2008/07/18(金) 16:36:23
ActiveRecordと間違えてActiveSupportを使ってしまって吐いた
491デフォルトの名無しさん:2008/07/18(金) 16:42:24
>>482
Array#[]=に「selfの引数番目の要素が5になるんだったらウィンドウ出す」を追加する

というのを思いついた
492484:2008/07/19(土) 00:20:58
>>485
イバラの道ですか~
生産性の高さというか、書いていてイライラしないのでRubyにしました
それまではPHPを使っていたのですが、基本思想が美しくないので
どうやっても美しくならないというか、
書いていて退屈でイライラしてくるんですよね
rubyはそういう退屈さがないので気に入っています
ただ、そういう感覚が、あまり知らないという新鮮さから来るのか、
Rubyの本質的な設計思想に依るのかは、まだよく分からないのですが
>>489
railsは既に重厚すぎる感じがするのと
自由度が欲しいからです
493デフォルトの名無しさん:2008/07/19(土) 00:55:08
rails以外のフレームワーク使ってみるとかは?
merbとか・・・

オススメできるほど知ってるわけじゃないけど、
探せばいろいろあるのでは?

rails以外の情報って、あんまりないから、たしかに茨の道だと思いますけど。
494デフォルトの名無しさん:2008/07/19(土) 02:43:38
>>492
まあ、Railsが突出しているからな。日本語の本も出ているし。

Rails以外ならこちらを参照。

10 Alternative Ruby Web Frameworks : Accidental Technologist
http://accidentaltechnologist.com/ruby/10-alternative-ruby-web-frameworks/

InfoQ: 忘れられたRubyのWebフレームワーク
http://www.infoq.com/jp/news/2007/11/forgotten-ruby-web-frameworks

Ramazeとか大きすぎずオススメ
495デフォルトの名無しさん:2008/07/19(土) 07:16:24
>>492
あれ、こんなところに俺がいる

CGIスクリプトで自由度と軽さが欲しいなら
Rackや、CGI互換ライブラリ(cgisup/cgialt)を使うのがシンプルでお勧め
今使うならたぶんRackの方が良い。WEBrickやFastCGI等への対応がとても楽だ

webrick/cgi(標準添付)も、一応シンプルさという点では優れているが
情報がきわめて少ないのでお勧めしない
496デフォルトの名無しさん:2008/07/19(土) 09:57:30
>>495
RackはCGIでは重くない? CGIにはもうちょっと軽いのが欲しいんだけど。
497デフォルトの名無しさん:2008/07/19(土) 10:44:40
tDiaryやBitchannelのソースを解析するという手もある
498デフォルトの名無しさん:2008/07/19(土) 10:54:44
>>493-495
ライトなFWも結構ありますね
自作するにしても参考に出来る部分が多そうです
さっそくerubisの存在を知りました
あとcgi.rbはイケてないということとか・・
Rackを使うのも今後主流になりそうですね
499デフォルトの名無しさん:2008/07/19(土) 11:24:45
cgi.rbは今となっては全く学ぶところのないライブラリ
本来ならもっとずっと早いうち、具体的には1.6時代、に何か他のCGIライブラリに置き換わるべきだったもの

ちょろっと使うぶんには問題なくて、もっと凝ったものや正しい動作をするものをやりたかったら
自力で実装したほうが早いという困った人たちがML近辺には溜まってたので今までずるずる置き換えが延びた

webrick/cgiに自前で継ぎ足して頑張るというのが正しい姿だが、cgi.rbと同じように使うためのマニュアルすらない状況
500デフォルトの名無しさん:2008/07/19(土) 11:32:19
自分さえ良ければいいっていう人が多いんですね
501デフォルトの名無しさん:2008/07/19(土) 11:56:31
糞ライブラリはRubyの特徴でもあります
502デフォルトの名無しさん:2008/07/19(土) 12:03:31
じゃあ、逆に、どんなライブラリが参考にするのにいい
学ぶところの多い、ライブラリなのかな?

ライブラリ読んでみようかって思ってるんで、
これがいい!って奴があったら聞きたいんですが。

できれば、難易度別に
503デフォルトの名無しさん:2008/07/19(土) 12:09:00
http://code.whytheluckystiff.net/camping/wiki/TheCampingShortShortExample
ここに
class Index < R '/'
def get
render :index
end
end
ってあるんですが、Rの後ろの'/'はなんですか?
504デフォルトの名無しさん:2008/07/19(土) 12:11:50
R '/' == R('/')
505デフォルトの名無しさん:2008/07/19(土) 12:30:56
クラス名に引数を書くということですか?
どういう意味があるんですか?クラス名は単なる名前でメソッドではないのでは?
506デフォルトの名無しさん:2008/07/19(土) 12:31:08
継承で < するものは「クラスを表す文字の連なり」である必要はない
Rubyとしてクラスオブジェクトを返せるものなら何でもよい

class Base
CONST='yahoo!'
end

def hoge
return Base
end

class A < hoge
end

p A::CONST

========
"yahoo!"

とここまで書いて、定数をメソッドのように扱うことの話かもしれないと思った
507デフォルトの名無しさん:2008/07/19(土) 12:43:34
ああ、やっぱり

>>505
require 'time'
begin
puts Time('2008-07-19 12:38:12')
rescue NoMethodError
puts 'Timeメソッドがないよ!'
end

module Kernel
def Time(str)
Time.parse(str)
end
module_function :Time
end

puts Time('2008-07-19 12:38:12')

==============

Timeメソッドがないよ!
Sat Jul 19 12:38:12 +0900 2008

こんな風に作る(もっと適当に書いてもいいが)
「このオブジェクトに変換する」という動作をさせるときに明示的に定義されることがある
組み込みだとIntegerやURI、有名どころだとHpricotなんかもparseメソッドのエイリアスをこの形で定義してる
個人的には.parseくらい書けよって感じであまり好きではないが、ある程度の市民権は得ている書式だ
508デフォルトの名無しさん:2008/07/19(土) 13:11:13
メソッド名の先頭には大文字使えないんじゃね?
と思ったら使えるそうな
ttp://www.sakalab.org/prog-ruby/ruby-man-html-20080121/FAQ_A5E1A5BDA5C3A5C9.html#a5.2e8.20.a5.e1.a5.bd.a5.c3.a5.c9.cc.be.a4.cb.c2.e7.ca.b8.bb.fa.a4.c7.bb.cf.a4.de.a4.eb.bc.b1.ca.cc.bb.d2.a4.cf.bb.c8.a4.a8.a4.de.a4.b9.a4.ab
引数カッコを省略したら定数と間違われるから省略すんなと注釈がある
メソッドとローカル変数の関係と一緒か…
509デフォルトの名無しさん:2008/07/19(土) 13:19:40
>>506-507
なるほどですね
ありがとうございました
なんかすごい言語ですね・・
510デフォルトの名無しさん:2008/07/19(土) 13:26:22
まあ要は「クラスの名称とたまたま同じ名前の関数的メソッド」だな
クラスオブジェクトに引数をつける用法があるわけじゃない
内部的にはクラス定義とは無関係だ
511デフォルトの名無しさん:2008/07/19(土) 15:12:19
プログラムをスレッドセーフにするために気をつける箇所はどこですか?
またスレッドセーフか否かをチェックする方法はどのようなものでしょうか
512デフォルトの名無しさん:2008/07/19(土) 15:32:56
puts を使わない
513デフォルトの名無しさん:2008/07/19(土) 16:20:11
>>496
kwsk
514デフォルトの名無しさん:2008/07/19(土) 16:39:14
命名規則に関して質問させてください

変数名やメソッド名に関するrubyの一般的な命名規則はどのようなものが存在するのでしょうか?
@が頭についていたらインスタンス変数、@@でクラス変数、などはわかるのですが、それ以外の部分で一般的な命名規則があれば教えて欲しいです

具体的に言えば、Cのハンガリアン記法やJavaのらくだ記法のような、守らなくても動作するけれども、守るのが一般的な規則です

よろしくお願いいたします
515デフォルトの名無しさん:2008/07/19(土) 16:46:18
マニュアルを見るのは下賎な身分の低い人間がやることだというので、
自分では絶対に見ない人がいるそうだね。
516デフォルトの名無しさん:2008/07/19(土) 16:58:55
>>514
ぐーぐるさんにきいたほうがはやいとおもいます
517デフォルトの名無しさん:2008/07/19(土) 17:01:49
漏れは前田しゅうごさんの規約にしたがってる
http://shugo.net/ruby-codeconv/codeconv.html
518デフォルトの名無しさん:2008/07/19(土) 17:03:52
>>514
メソッド名と変数名は大文字で区切ったりせずに全部 _ で区切る
これに沿わないメソッドも少なくないが、とりあえず初心者で自分から書くうちは全部 _ で区切っとけ

Rubyの実際におけるクラスとモジュールの意味的関係は最初は結構曖昧なので、
そのクラスがインスタンス作れたら嬉しいかどうかだけでクラスにするかモジュールにするかを決めてもよし
ずーっとあとになれば、モジュールが好ましいかクラスが好ましいかどうかには気づけると思う

自分用適当スクリプト以外でクラスを作って運用する場合、とりあえずモジュールで括ることが多い
  てきとーなモジュール::ファイル名と同等な大きいクラス::細かいクラス
という構造になることがほとんどだ

てか、どっかにこういうの書いてなかったっけ
519デフォルトの名無しさん:2008/07/19(土) 19:28:04
>>514
どこかにまとめて書いてあった気がするが忘れた
リファレンスにあったのかもしれないが、いま読み返しても見つからないぐらいなので
初心者が見つけるのは絶望的かもしれない

基本的には>>517の規約を参考にすれば、おおよそ問題ないだろうと思う

>>515
マニュアルのどこに書いてあったか教えてほしい
俺では見つけられなかった・・・
520デフォルトの名無しさん:2008/07/19(土) 20:23:48
メソッド定義か何かで、インスタンスに直接ブロックをつけるようにすることはできない?
添え字アクセスした配列の要素にブロック使いたい
arr[3]{|e| ... }

tap を使えば arr[3].tap{|e| ... } で実現できるんだけど、何もメソッド挟みたくないんだ
521デフォルトの名無しさん:2008/07/19(土) 20:35:17
e=arr[3]
522デフォルトの名無しさん:2008/07/19(土) 21:37:40
ramazeのソースに以下の部分があります

class Erubis < Template

ENGINES[self] = %w[ rhtml ]

# Allow for swapping in a differnt Erubis engine (it supplies several) and
# passing options to the engine.
trait[:engine] ||= ::Erubis::Eruby
trait[:options] ||= {}

ここでtraitは、定数でもないのに、クラス直下に書かれています
これは何でしょうか?
523デフォルトの名無しさん:2008/07/19(土) 21:46:33
> 定数でもないのに、クラス直下に書かれています
いやそのりくつはおかしい
524デフォルトの名無しさん:2008/07/19(土) 21:52:40
>>522
「ruby trait」でぐぐると最初にこれがでた。
ttp://d.hatena.ne.jp/sumim/20071105/p1
ようは、moduleよりもさらに動的にメソッドを追加したり変更したりする仕組みのことみたい。
そして、それを実現するライブラリがあって、ramazeはそれを使っているんだろう。
525デフォルトの名無しさん:2008/07/19(土) 21:59:25
未知の特殊な文法かと思ったのですが、これメソッド呼び出しなんですね
Objectにメソッドが追加されていました
RubyTraitsなのかramazeの独自実装なのかはわかりませんが
526デフォルトの名無しさん:2008/07/19(土) 22:01:02
>>520
>メソッド定義か何かで、インスタンスに直接ブロックをつけるようにすることはできない?
>添え字アクセスした配列の要素にブロック使いたい
>arr[3]{|e| ... }

文法的に無理みたい
a = [1,2,3]
a[0] {|x| p x }
#=>syntax error, unexpected '{', expecting $end
527デフォルトの名無しさん:2008/07/19(土) 22:33:18
>>523
別に何書いてもいいんだよな

class Ruby
puts "#{self}はうんこ"
end

Rubyはうんこ


def と定数しか書いてはいけないと思う時期は確かにある
528デフォルトの名無しさん:2008/07/19(土) 22:33:37
>>514
>命名規則に関して質問させてください
>
>変数名やメソッド名に関するrubyの一般的な命名規則はどのようなものが存在するのでしょうか?
>@が頭についていたらインスタンス変数、@@でクラス変数、などはわかるのですが、それ以外の部分で一般的な命名規則があれば教えて欲しいです
>
>具体的に言えば、Cのハンガリアン記法やJavaのらくだ記法のような、守らなくても動作するけれども、守るのが一般的な規則です

いまならRailsをまねするのがいいとおもう
「rails coding standard」でぐぐってみれ
529デフォルトの名無しさん:2008/07/19(土) 22:36:45
えええええええええええええええええええええええええええええええええええええええええええ
530デフォルトの名無しさん:2008/07/19(土) 22:41:56
Rails は Ruby ではない
531デフォルトの名無しさん:2008/07/19(土) 22:46:41
>>530
まあだからこそRuby知らない層が飛びついたとも…

Railsの文法面とか書き方とかは参考にしないほうがいいな
あれは言ってみれば言語内DSLだからRubyに似た別言語と考えたほうがよい
目的志向で割り切って便利に使い倒すのがよろしいかと
532デフォルトの名無しさん:2008/07/19(土) 22:56:53
>>528
ぐぐってみた
コーディング規約そのものというより、もっと大きなレベルでの取り決めが多いな

とりあえずHAMLを勧めるのはやめて欲しい
533デフォルトの名無しさん:2008/07/19(土) 23:03:04
>>532はその昔「ここでerb使うとかありえねー。このRailsとかいうヤツ脂肪」と言っていた気がする
534デフォルトの名無しさん:2008/07/19(土) 23:06:13
ハムッハムハフッ
535デフォルトの名無しさん:2008/07/20(日) 00:27:03
Hash.new{|h,k| h[k] = {}}
って
Hash.new{{}}
と同じですか?
536デフォルトの名無しさん:2008/07/20(日) 00:46:10
違います。

hash1 = Hash.new{|h,k| h[k] = {} }
hash1['a']['A'] = 'AAAA'
p hash1 #=> {"a"=>{"A"=>"AAA"}}

hash2 = Hash.new{ {} }
hash2['a']['A'] = 'AAAA'
p hash2 #=> {}

後者は元のハッシュに代入しないで単に空のハッシュを返すだけ。
537デフォルトの名無しさん:2008/07/20(日) 00:53:51
自分で試すと理解が早いぞ
あまり最初だとどう試していいかよくわからないけどな
538536:2008/07/20(日) 02:40:54
ありがとうございました
一次元で実験したら同じ挙動だったので、同じと思い込んでました
ハッシュは素の状態ではネストできないんですね
このようなブロックでは、二次元までしか出来ませんが、
何次元でもネストできるハッシュはないのでしょうか?
hash['a']['b']['c']['d'] = 'A'
といきなり代入できるような
539デフォルトの名無しさん:2008/07/20(日) 02:58:03
Rubyにはオブジェクトに対するメソッド呼び出ししかない(若干語弊あり)
多次元とかそういう概念はない
arr[3][5][1][0] は 位置(3, 5, 1, 0)に対応する4次元配列ではなく、
「「「arr[3]の返り値の配列」の5要素目の返り値の配列」の1要素目の返り値の配列」の0要素目
540デフォルトの名無しさん:2008/07/20(日) 03:05:57
もしキーの空間が疎なら
hash[ ['a', 'b', 'c', 'd' ] ] = 'A'
のようにキーの集合となる配列自体をキーにしてしまうとか。
541デフォルトの名無しさん:2008/07/20(日) 05:05:27
>>540
['a', 'b', 'c', 'd' ]が毎回生成されてHashキーが変わるかと思ったけどそうでもないんだね
542デフォルトの名無しさん:2008/07/20(日) 05:56:09
>>538
なんとなくそれっぽいものをちろっと書いてみた。
def multi_hash(dimension = 0)
 dimension == 1 ? {} : Hash.new { |h,k| h[k] = multi_hash(dimension -1) }
end

h4 = multi_hash 4 # 最大4次元のハッシュ
h4['a']['b']['c']['d'] = "A"
p h4 #=> {"a"=>{"b"=>{"c"=>{"d"=>"A"}}}}
h4['a']['b']['c']['e']['d'] = "A"
#>NoMethodError: undefined method `[]=' for nil:NilClass

hi = multi_hash # 引数が0以下だと無限長
hi['a']['b'] = 2
hi['A']['B']['C'] = 3
p hi #=> {"A"=>{"B"=>{"C"=>3}}, "a"=>{"b"=>2}}

ただしこれは多次元配列ではなく、ハッシュのリストなので、
p hi[1] #=> {} 途中の次元の実体はハッシュ
hi[1] = 1 # もちろん代入可能
hi[1][2] = 2 # hi[1] は 1 になったので
#>NoMethodError: undefined method `[]=' for 1:Fixnum

さらに、存在しないキーを参照しただけでも跡が残る。
h3 = multi_hash 3
p h3['a']['b']['c'] #=> nil
p h3 #=> {"a"=>{"b"=>{}}}

それでも用途によっては使えないこともないが、見た目を気にしなければ
>>540 の方が使いやすいかもね。
参照痕だけでも除去できないか…とおもったがいいかげん眠いのでパス。
543デフォルトの名無しさん:2008/07/20(日) 06:10:46
あ、上の方ちょっとミスった。
訂正するほどのものでもないけど、まぁ一応。

h4 = multi_hash 4 # 最大4次元のハッシュ
h4['a']['b']['c']['d'] = "4"
p h4 #=> {"a"=>{"b"=>{"c"=>{"d"=>"4"}}}}
h4['A']['B']['C']['D']['E'] = "5"
#>NoMethodError: undefined method `[]=' for nil:NilClass


>>541 即値を書けば配列は毎回生成されることになるけど、
別のオブジェクトでも中身が同じならハッシュ値も同じだね。

p ['a', 'b', 'c', 'd' ].object_id #=> 21388910
p ['a', 'b', 'c', 'd' ].object_id #=> 21377100
p ['a', 'b', 'c', 'd' ].hash #=> 607
p ['a', 'b', 'c', 'd' ].hash #=> 607
p 'abcde'.object_id #=> 21342160
p 'abcde'.object_id #=> 21100590
p 'abcde'.hash #=> 993689702
p 'abcde'.hash #=> 993689702
544541:2008/07/20(日) 08:40:46
>>543
中身同じならhashは同じになるんか 勉強になった
545デフォルトの名無しさん:2008/07/20(日) 10:50:35
>>536
535とは別人だが参考になった
さんくす
546デフォルトの名無しさん:2008/07/20(日) 11:05:44
>>543
こうなるのは、配列と文字列と数値だけ?
その他のオブジェクトでは、中身?が同じでもhash値はちがうっぽいんですが
547デフォルトの名無しさん:2008/07/20(日) 11:09:18
548デフォルトの名無しさん:2008/07/20(日) 12:03:15
mutableなオブジェクトをキーにするのは気持悪い。
549デフォルトの名無しさん:2008/07/20(日) 12:06:36
なんとなくルビマガを読んでたら、
http://jp.rubyist.net/magazine/?0019-BundledLibraries
Rubyの正規表現では、^と$が文字列先頭や文字列末尾の意味ではなく
行頭・行末の意味だという衝撃の事実を知りました
^[0-9]+$というようなテストに通ってしまうので
勘違いしたまま問題ないと思ってる人多いんじゃないですか?コワス
550デフォルトの名無しさん:2008/07/20(日) 12:10:40
>>549
Rubyだけじゃない。PerlやPythonも同じ。
551デフォルトの名無しさん:2008/07/20(日) 12:13:33
>>548
出たなハッシュキーシンボル教信者め
ハイフン! ハイフン! ハイフン!

>>549
いやいや Perl でも ^ と $ は行頭と行末だから
vim でも ^ 押すとカーソルが論理行先頭に飛ぶだろ
552デフォルトの名無しさん:2008/07/20(日) 12:19:56
まあ、勘違いしてる人は多そう
^ は文字列の先頭としか書いてないサイトとかあるし
553549:2008/07/20(日) 12:24:58
>>550,551
あれ本当ですね
今まで勘違いしてた・・
記事の「Perl などの他の言語の正規表現とは意味が違うので気をつけてください」
っていうのも勘違いかな?
554デフォルトの名無しさん:2008/07/20(日) 13:43:58
555デフォルトの名無しさん:2008/07/20(日) 13:44:40
>>543
同値判定やハッシュコードは、使いやすいように再定義してるわけですよ。
556デフォルトの名無しさん:2008/07/20(日) 15:26:48
def multi_hash(dimension = 0)
 dimension == 1 ? {} : Hash.new { |h,k| h[k] = multi_hash(dimension -1) }
end
これ0以下の時無限ループしないのはなぜ?
557デフォルトの名無しさん:2008/07/20(日) 15:47:48
多次元配列の作成などではなくただのHashだから
むしろ、無限ループすると思った理由を知りたい
558542:2008/07/20(日) 16:00:31
>>556
えーと、無限ループですが、何か?
hi = multi_hash
h = hi
10000.times do |i| h = h[i] end
p hi
#=> {0=>{1=>{2=>{3=>{4=> ..中略.. {9999=>{} 【 '}' x 10000 】

無限と言ってもメモリが足りなくなったらたぶん落ちるけど。

>>557
それはたぶん停止判定が dimension == 1 の時だけだから。
オーバーフローしたら1周して戻ってくるC言語のInt型などとは
違って、Rubyの場合多倍長整数だから、永久に戻らない。
無限ループするという彼の言は正しいよ。
559デフォルトの名無しさん:2008/07/20(日) 16:06:53
Hash.new のブロックの中身が使用される場合というのは決まってる
Hash.new した時点では何もしない

irb> h = Hash.new{|h,k| puts '存在しないキー呼ぶとかなんなの?死ぬの?'}
irb> h['k'] = 'v'
"v"
irb> h['key']
存在しないキー呼ぶとかなんなの?死ぬの?

>>558
それは無限ループとは呼ばないし>>556のイメージとも違う
>>556はおそらく multi_hash(-1) した時点で無限にループすると思ってる
multi_hash(5) とすると 5回繰り返して多次元ハッシュの型が作られると思ってる
560542:2008/07/20(日) 16:20:21
おっと、続きを書くのに手間取っている間に、親切な人からの突っ込みが。
別に意地悪ではぐらかすつもりではなかったんだが。

無限ループは適切でないとすると、無限リスト構造と呼べばよかったかな?
561sage:2008/07/20(日) 17:21:03
>>558-559
だいたいわかりました どうもありがとう
もう一つ質問があります
この関数を連続して違う引数で呼び出しても大丈夫みたいです
dimensionの値はどこに残ってるのですか
ハッシュオブジェクトの中? それともマルチスレッドなの?
562デフォルトの名無しさん:2008/07/20(日) 17:40:32
>>561
closure
563デフォルトの名無しさん:2008/07/20(日) 18:07:01
http://jp.rubyist.net/復旧したけど激しく重い
rubyはwebappに適してないのではと思ってしまう
564デフォルトの名無しさん:2008/07/20(日) 18:10:41
>>553
PerlとRubyではmオプションの効き方が違う。
Perlでは、mオプションが有効なときだけ、^が行頭にマッチする。
Rubyでは、mオプションの有無にかかわらず、^が行頭にマッチする。
565デフォルトの名無しさん:2008/07/20(日) 18:12:04
>>561
最初に呼び出されたメソッドのローカル変数(引数含む)と、そこから呼び出された
同じメソッドの変数は、別の領域に確保されてるから上書きされない
「再帰呼び出し」でぐぐれ
566デフォルトの名無しさん:2008/07/20(日) 20:04:02
>>561
>>562も言ってるけど、たぶん聞きたいのはクロージャの方だよね。
詳しい内容はググってもらうとして、>>556を単純化するとこんな感じ。

def make_hash(x)
Hash.new { x -= 1 } #<-この括弧の中がクロージャ
end
クロージャは生成された瞬間のコンテキストを保持していて、
呼び出されると、生成されたときのコンテキストで実行される

h10 = make_hash 10 #<- 10の値を持つxという変数を持つ
# 無効なキーの参照で先のクロージャが呼び出される
p h10[0] #=> 9
p h10[0] #=> 8
h20 = make_hash 20 #<- 値20の変数xを持つ
p h20[0] #=> 19
p h20[0] #=> 18
# h10 と h20 は個別のコンテキストを持っている
p h10[0] #=> 7
p h20[0] #=> 17

変数x (>>556ではdimension) はハッシュ生成時に作られたクロージャ
の中にあるので、ハッシュのインスタンスが保持しているのではないし、
もちろんスレッドローカルな領域にあるわけでもない。
567デフォルトの名無しさん:2008/07/20(日) 20:09:08
最後の一言はひょっとすると正確ではなかったかもしれない。
単にマルチスレッドではないと言いたかっただけなんだ。
568デフォルトの名無しさん:2008/07/20(日) 20:40:53
マルチスレッドの定義にもよるな。
クロージャはマイクロスレッド(ファイバー)に相当するが、
これを処理するのもマルチスレッドと呼ぶなら
クロージャはマルチスレッドだ。
569デフォルトの名無しさん:2008/07/20(日) 20:51:15
マルチスレッドはスレッドがマルチかどうかで定義するといいよ(北大理論)
570デフォルトの名無しさん:2008/07/21(月) 07:20:44
1.9は相当速度アップしてるみたいですが
実戦投入はまだできないレベルですか?
571デフォルトの名無しさん:2008/07/21(月) 09:06:17
意図がよーわからんがはいと答えておく
あなたの意に添うものになる可能性はゼロでしょう
572デフォルトの名無しさん:2008/07/21(月) 09:12:15
>>570
安定版の1.9.1が出るまでは我慢しなさい

あと、速度アップしてると言ってもベンチマーク上での話なので
実戦投入においてどのくらい差が出るかは怪しい
少なくとも「格段に遅い」ということは無くなるだろうが
573デフォルトの名無しさん:2008/07/21(月) 09:28:42
まあ、現時点で実行速度を気にしてしまうような人たちのお手元にRubyが行くことは永遠になさそうだな
574デフォルトの名無しさん:2008/07/21(月) 09:34:15
>>570
「Ruby1.9は速い速い!爆速!」とか言ってるのは、1.9への開発を促進させるための
釣り文句みたいなもん。実際は、スクリプト言語がカバーすべき分野においてRubyは
遅くない。単なる数値計算ならそりゃ遅いけど、rubyがやってる分野で遅さがでることは
めったにないし、もしそうだったらC拡張書けばいいだけの話。
Railsとかが遅い遅いって言われてるのも実際はDBがチューンされてなくて遅いだけ。

ベンチマークが付属してるからやってみればわかるけど、Ruby1.9になって
返って遅くなったところもある。Erbとかな。
575デフォルトの名無しさん:2008/07/21(月) 09:35:08
ささだ氏は、1.9.1は今年のクリスマスまでに出すとか言ってるが、伸びる可能性もある
それまでに安定したとしても、本格的なチューニングはまだまだだろう
576デフォルトの名無しさん:2008/07/21(月) 09:37:47
実は、実際使用上の Ruby で一番「遅い」のは gem でインストールされたライブラリの初動の require
次に遅いのが gem でインストールされたライブラリのメソッド動作
577デフォルトの名無しさん:2008/07/21(月) 09:41:33
gemでインストールされたという理由でメソッド呼び出しが遅くなるの?
自作のライブラリと条件は同じでは?
578デフォルトの名無しさん:2008/07/21(月) 09:48:15
rubyforge に登録されているライブラリの効率性が動作標準添付ライブラリに比べて低いということでは

前者はインストール時に依存してたライブラリを基本的に全部 require するわけだから遅いのは当然だわな
579デフォルトの名無しさん:2008/07/21(月) 10:25:32
>rubyforge に登録されているライブラリの効率性が動作標準添付ライブラリに比べて低いということでは
は?
580デフォルトの名無しさん:2008/07/21(月) 11:33:30
URL候補の文字列をURI.escapeしたときに「二重に」エスケープしてしまうことを防ぐ方法はない?

日本語とかが入ってるのでURI.escapeはしたい
てきとうなURL候補文字列なので % という文字がぽつんと入ってることもあり(100%とか)、それは %25 にエスケープもしたい
でも、完全妥当なパーセントエンコード済みURLを渡したときに
URI.escape('http://www.google.com/search?num=50&hl=ja&q=%E3%83%AB%E3%83%93%E3%83%BC&lr=lang_ja')
の % が %25 になって欲しくないんだ
http://www.google.com/search?num=50&hl=ja&q=%25E3%2583%25AB%25E3%2583%2593%25E3%2583%25BC&lr=lang_ja
581デフォルトの名無しさん:2008/07/21(月) 11:35:50
>>575
いや1.9.1はクリスマスに出るだろう。
だが安定版かどうかといえば、きっとそうではない。

また「リリースは無事行われるが、それを手にする人は無事ではない」式
582デフォルトの名無しさん:2008/07/21(月) 12:31:02
1.9にしたほうがいい という明確な理由がないなら、
熟成するまで待つほうがいいみたいね。
583デフォルトの名無しさん:2008/07/21(月) 13:42:34
>>580
本質的に、URLエンコードはそういうものなので、既存の%だけは無視するようなものを
自分で作るしかないと思う。
584デフォルトの名無しさん:2008/07/21(月) 15:00:34
どっかで、1.9は、evalとかリフレクションとかは、
1.8より遅くなるって、載ってたんですけど、
そうすると、その辺を多用してる、railsとかは却って遅くなったりするんですかね・・
585デフォルトの名無しさん:2008/07/21(月) 18:18:08
>>585
1.9使ってないから実際のところはしらんけど、それはよく言われていること。
586デフォルトの名無しさん:2008/07/21(月) 19:34:21
>>576
gemとライブラリのメソッド動作に何の関係が
587デフォルトの名無しさん:2008/07/21(月) 20:29:37
>>572
1.9.1って安定するのかwww
588デフォルトの名無しさん:2008/07/21(月) 21:00:37
ぼけーっとまってりゃいい。
1.9が出たらそれにしなきゃいかん という法律もないべ。
589デフォルトの名無しさん:2008/07/21(月) 22:53:25
Rubyで型チェックするのってif文でis_a?してArgumentError投げるくらいしかない?
世に出てるRubyプログラムは型チェックしないでどうやって整合性保ってるの?
590デフォルトの名無しさん:2008/07/21(月) 22:56:49
結局は実行時エラーなんよRubyは
591デフォルトの名無しさん:2008/07/21(月) 23:02:33
Rubyは型をチェックしない
型をチェックする必要がない…というのはちと言いすぎだが、
型のチェックが大事になるようなプログラムというのは実は少数だろ
それ以外の大多数のプログラムを書くためにRubyを使う
592デフォルトの名無しさん:2008/07/21(月) 23:07:23
ダックタイピングの実現がポリシーのうんたらと言いつつ
結局は is_a 関係をチェックしてるというのはまあ隠しようのない事実ではある
593デフォルトの名無しさん:2008/07/21(月) 23:08:48
少数ってことはないだろ
文字列が来るべきところに数字が来たらどうするかどんなプログラムでも考える必要がある
594デフォルトの名無しさん:2008/07/21(月) 23:10:39
文字列が来るべきところに数字が来たらエラーを吐いて死ねばいいと思うよ
595デフォルトの名無しさん:2008/07/21(月) 23:12:39
結果が予測できるなら暗黙で変換して安全な結果を返してもいいな
596デフォルトの名無しさん:2008/07/21(月) 23:20:22
def hoge(c)
 if c=="b"
  ・・・・・・
 end
end
s="abcd"
hoge s[1]
597デフォルトの名無しさん:2008/07/21(月) 23:21:37
>>595
そうだね。自分もそうしてる。
例えば、文字列を半角にする関数の例だと自分はこうやってる。
nilの場合は、''にして、それからとりあえずto_sして文字列であることを確保してから
本来の処理をする。
本当にその型じゃないと困るというときは型を比較してるけど、やっぱり頻度は少ない。

def to_hankaku(str)
 text = str || ''
 text = text.to_s
 (処理)
 text
end
598デフォルトの名無しさん:2008/07/21(月) 23:25:12
最初からto_sすればよくね?
599デフォルトの名無しさん:2008/07/21(月) 23:27:04
まあ全部型チェックしてたら、
記述が冗長で遅い静的言語という酷いものにしかならんなw
600デフォルトの名無しさん:2008/07/21(月) 23:31:04
>>598
ほう
nil.to_s は 何を返すべきだと思う?
Nilクラスのインスタンスの nil ?
文字列 "nil" ?
空の文字列 "" ?
NoMethodError?
601デフォルトの名無しさん:2008/07/21(月) 23:34:41
よく言われるのは、 nil.to_s が "" なのに puts nil が nil だってとこだな
irb> puts nil.to_s

irb> puts nil
nil
602デフォルトの名無しさん:2008/07/21(月) 23:46:07
puts って暗黙的に to_s してるんじゃないんだ
603デフォルトの名無しさん:2008/07/21(月) 23:58:46
nil と Array と末尾の \n は特殊処理
604デフォルトの名無しさん:2008/07/22(火) 01:27:20
初心者にとってはこの雑談っぽい流れでも勉強になるんでどんどん雑談に花を咲かせてください
605デフォルトの名無しさん:2008/07/22(火) 02:19:49
全く知識がないですけど
学生なんで無料と言うところに引かれてきました

自分のような初心者には難しいでしょうか?

将来的にネットワーク関係とか、画像処理とかを見てみたいです
606デフォルトの名無しさん:2008/07/22(火) 02:31:48
インターネット関連はネット経由でアクセスすることもサーバを作ることも普通にできる
文字列処理も普通に得意だ(詳しい人黙ってるように)
画像処理はわりと苦手(外部プログラムの使い方を学ぶ必要がある)

一般論として、プログラミング初心者にとってはRubyは難しい言語ではない
プログラミングという行為自体に合わない人というのは一定数いるが、そういう人でさえなければ普通に使えるはず

ただ、もし、あなたがWindowsしか持っていなくて、プログラムというものが
たとえばワードやインタネットエクスプローラーのようなものしか思いつかないとしたら、
Rubyはそういうプログラムを作るのには向かないので、他のプログラム言語を使うといい
607デフォルトの名無しさん:2008/07/22(火) 08:21:49
勘違いも甚だしい
608デフォルトの名無しさん:2008/07/22(火) 11:57:28
>>607は書いてあることに対して文句言うことしかしないから気にしなくていい
609デフォルトの名無しさん:2008/07/22(火) 12:02:17
得手不得手があるということか
つってもよく考えると当たり前だよな
610デフォルトの名無しさん:2008/07/22(火) 15:09:29
>>608
というより、書いてあることに対しても何も言ってない。
目隠ししたまま書ける。
611デフォルトの名無しさん:2008/07/22(火) 15:18:52
コピペでしょ
612デフォルトの名無しさん:2008/07/22(火) 16:09:40
$cat test.dat
1
富士の樹海
2
ガダルカナル
3


のようなデータ(ファイル)から
[["1", "富士の樹海"], ["2", "ガダルカナル"], ["3", "馬"]]
のような奇数番目(特定のフォーマットをもったid)と偶数番目(フォーマット不定のデータ)のペアの配列を作る事が目的です

each_with_indexを使うやりかたを試しましたが、
[[],[]].tap{|tmp| open('./test.data').read.split("\n").each_with_index{|e,i| (i&1==0) ? tmp[0]<<e : tmp[1]<<e}}.transpose
とtapを使っても一時変数が邪魔くさいので
open('./test.data').read.split("\n").partition{|e| e=~/\d+/}.transpose
のように奇数番目の正規表現で分けてやってますが、
位置が決まってるんだからもう少し賢いやりかたがあると思うのですが
わかる方お願いします
613デフォルトの名無しさん:2008/07/22(火) 16:20:42
File.open('test.dat', 'r'){|f| f.read}.scan(/(.+?)\n(.+?)\n/m)
614デフォルトの名無しさん:2008/07/22(火) 16:23:36
たまたま動くっぽいが m 使わないほうがいいか
まあいいや
615デフォルトの名無しさん:2008/07/22(火) 16:36:40
あ、しまった、またやっちゃった
万一 test.dat のファイルの最後が改行で終わってない場合、>>613では最後のペアを取得することができない

File.open('test.dat', 'r'){|f| f.read}.scan(/(.+?)\n(.+?)$/)

これでよろしく
616デフォルトの名無しさん:2008/07/22(火) 17:12:12
>>613-615
scanなんてものがあるんですね、
入力から一発で変換できるのでコレがベストっぽいです
ありがとうございました
617デフォルトの名無しさん:2008/07/22(火) 18:01:56
ruby勉強中の俺も今さっきscanに感動したとこだわ
こりゃ便利だなあ
618デフォルトの名無しさん:2008/07/22(火) 21:27:04
File.open('test.dat') {|f|f.readlines.collect{|s|s.chomp!}.each_slice(2)}
619デフォルトの名無しさん:2008/07/22(火) 22:31:22
Rubyでウェブアプリ開発する時は、
バックエンドにRubyのプロセスを複数立ち上げてリバースプロキシするのが
普通のようですが、
立ち上げるプロセス数ってどうやって決めるのでしょうか?
620デフォルトの名無しさん:2008/07/22(火) 22:42:15
>>619


いやマジで
何か計算式があるわけじゃないし、何か目安があるわけでもない
そのへんは実際に動かしていろいろ決める他のWebシステムと変わらないな
621デフォルトの名無しさん:2008/07/22(火) 22:48:08
各プロセスの使用率の統計のようなものをとったりしてってことですよね
そういう目的に使うプログラムってありますか?
622デフォルトの名無しさん:2008/07/22(火) 22:51:52
Apache使ってるならabとかで負荷かけたりして
数値を取ってみるとか。
JMeterでもいいかもしれん。
623デフォルトの名無しさん:2008/07/22(火) 23:18:02
>>618
また知らない関数が…しかも速い
each_sliceって1.8,6で追加されたもの?
624デフォルトの名無しさん:2008/07/23(水) 00:20:07
少しくらいは検索くらいして欲しい

require 'enumerator' すれば 1.8.6 でも使える
ファイルが大きい場合は正規表現 (.+?)\n(.+?) が重いから each_slice がよく動く
…というか、enumerator を読み込んでいいのなら each_slice がたぶん一番速い
言ってみれば、配列の要素を先頭から n 個ずつ取って新規配列に入れていくだけのシンプルな処理だから

あと Ruby には関数は存在しない
625デフォルトの名無しさん:2008/07/23(水) 00:33:48
関数呼ばわりされて黙っておけなくなったら脱初心者ですね。
626デフォルトの名無しさん:2008/07/23(水) 00:40:24
なにその微妙な指針
627デフォルトの名無しさん:2008/07/23(水) 00:43:55
昔はLinuxをlinuxと書いただけで叩かれるような文化もあったとか聞く
そこまでやらなくてもとは思うが、ある程度用語はしっかりしたものを使って欲しいとも思う
意外なところでトラブルの元になったりするし
628デフォルトの名無しさん:2008/07/23(水) 00:46:46
てか、メソッドってそんなに言いにくいもんかね
関数って言葉を使うってことはC系列のプログラミング言語の経験があるってことなんだろうけど
629デフォルトの名無しさん:2008/07/23(水) 00:46:46
CPU数*2位でいいんじゃね?
伝統的なワーカスレッドの決定方法だけど
630デフォルトの名無しさん:2008/07/23(水) 00:47:27
トップレベルのメソッドとmodule_function(:hoge)されたメソッドは
関数と呼ばれたりするけどね
631デフォルトの名無しさん:2008/07/23(水) 00:56:19
関数的メソッドという慎重な名称で呼ばれた記憶しかがない
つか、それは「StringIO は IO クラスと同じ動作をします」と同じくらい胡乱
632デフォルトの名無しさん:2008/07/23(水) 00:57:08
関数的メソッドとかって言い回しじゃなかったっけ?
633デフォルトの名無しさん:2008/07/23(水) 00:57:36
そんなことより Enumerable#detect と Enumerable#select ってぱっと見紛らわしいよね
634デフォルトの名無しさん:2008/07/23(水) 08:33:30
injectとrejectは紛らわしくないと申すかー。
Smalltalkやった人は-ectシリーズ慣れてるんだけどねぇ。

635デフォルトの名無しさん:2008/07/23(水) 09:01:47
マジレスすると用法と実際の表記が違うから全く紛らわしくない
detect と select のほうは find_all と find だ
636デフォルトの名無しさん:2008/07/23(水) 21:22:15
初めまして

今rubyで
「XPathとDOMが相互変換できるライブラリ」
というものを探しています。

結構調査してるのですが、なかなか見つからず。。

どなたか教えてください。
637デフォルトの名無しさん:2008/07/23(水) 21:42:29
>>635
皮肉にも紛らわしさを裏付ける結果になったな。
638デフォルトの名無しさん:2008/07/23(水) 22:17:35
>>636
ないと思います
他の言語でそういうのがあれば紹介してください
639デフォルトの名無しさん:2008/07/23(水) 22:21:52
>>638
ご回答ありがとうございます。

無いですか、そうですか。。。

XPath文書→DOM文書に変換
って片側通行だけのでも良かったのですが。。
640デフォルトの名無しさん:2008/07/23(水) 22:29:30
>>639
XPath文書とかDOM文書が何を指しているのかわからんけど
REXMLでならXPathでelementを検索できたと思う
641デフォルトの名無しさん:2008/07/23(水) 22:41:16
>>640
それくらいぐぐれよ



8件しかねええええええええ
ttp://www.google.com/search?num=50&hl=ja&q=%22XPath%E6%96%87%E6%9B%B8%22&lr=lang_ja
642デフォルトの名無しさん:2008/07/23(水) 22:41:36
以下のサイトで Rubyの勉強用のソースコードとして、
BitClust、mailread.rb、WEBrick、BitChannel
ものがあげられています。

Ruby には Perl の Plagger のようなお手本はないの? - gan2 の Ruby 勉強日記
http://d.hatena.ne.jp/gan2/20080721/1216634044

ところでこれらのソースを読み漁るのによいツールはありませんでしょうか?
コードレビューツールというような感じのものです。
643デフォルトの名無しさん:2008/07/23(水) 22:42:19
DOMはデータ構造とセットになったアクセス方法だが
XPathはアクセス方法だけじゃないか?

変換とはどういう意味だろうか。

644デフォルトの名無しさん:2008/07/23(水) 22:48:12
XPath文書、DOM文書の意味がわからんことにはどうにも…
どっちもXML的なアレを触る手段で、フォーマットじゃないっしょ。

>>642
地味なところでいうとrdefs。
るびまの添削連載から辿れる。
645642:2008/07/23(水) 22:52:16
すいません。レビューツールというより、コードリーディングとかソースビューアーですね・・・。

>>644
redefいいですね。メソッド列挙できるんだ
ありがとうございます。
646デフォルトの名無しさん:2008/07/23(水) 22:58:47
>>644
度々のご回答ありがとうございます。

XPath、DOMも調査段階で自分なりに調べた程度だったもので。

やりたいこととしては

DOMを扱って処理するプログラムがあったが、急遽XPathも扱うことになった。
だからXPath→DOMにして、プログラムで処理をしたい・・・。

そんな感じなんだと思います。

「思います」というのは、私に知識が無いのと、作る機能が掴めない状態なもので。

申し訳ないです。。
647デフォルトの名無しさん:2008/07/23(水) 23:04:29
えーと、あるXPathに対して、そのXPathで引っかかってくる全てのエレメントについて、
DOMを使って触るなら、どういう手順になるか、みたいな
コンパイラのようなものほしいわけ?
648デフォルトの名無しさん:2008/07/23(水) 23:13:59
>>647
そのコンパイラのようなものの
ご教授をお願い致します。

※手順、処理の流れ等なんでもOKです
649デフォルトの名無しさん:2008/07/23(水) 23:16:39
XPath問い合わせ文字列をDOMでのアクセスに使える文字列に変換するライブラリが欲しいのだろう
どうでもいいがこれでは回答無いのもむべなるかなって感じだ
ttp://oshiete1.goo.ne.jp/qa4199017.html
650デフォルトの名無しさん:2008/07/23(水) 23:17:04
単にDOMアクセスもXPath式アクセスも使えるXMLライブラリがあればいいのでは。
651デフォルトの名無しさん:2008/07/23(水) 23:18:42
>>650
普通に考えるとどっちも使えるライブラリを既に入れてるはずなんだけどな
NIHでもあるのだろう
652642:2008/07/23(水) 23:26:09
ためしに NetBeansのRuby(Rails)プラグインを使ってみたのですが、
ソースの色分け、クラス構造のツリー表示、
定義元へのジャンプ等一通りの機能がついていたので、
これでコードリーディングしてみようと思います。

ありがとうございました。
653デフォルトの名無しさん:2008/07/24(木) 00:21:04
Rubyを普通に使ってれば、ドキュメントが貧弱で、結局ソースを読むことになる
654デフォルトの名無しさん:2008/07/24(木) 00:22:59
今やそんなことはないと思うけどなあ。
普通に使ってる分には。
655デフォルトの名無しさん:2008/07/24(木) 01:55:30
Arrayをインデックスで逆向きになぞりたいんですが、
Array#reverse_each_indexはありません。こういう風に書きたいんです
ary.reverse_each_index do |i|
 #・・・・
end

今はこうやっているんですが、ちょっと汚いなあと
もっとうまい方法はありませんか?

ary.reverse.each_index do |index|
 i = ary.size - index - 1
 #・・・・
end
656デフォルトの名無しさん:2008/07/24(木) 02:03:26
インデックスだけイテレーションする必要性はよく分からんが
(ary.size-1).downto(0) do|i|
end
とか
657デフォルトの名無しさん:2008/07/24(木) 02:11:10
なるほど。それで行きます
ありがとうございました
658デフォルトの名無しさん:2008/07/24(木) 17:27:17
頑張ってサンプルコード書いてます。
日本語文字列を puts で表示したいんですが、普通に puts とだけ書いて文字列を表示させると、
文字エンコードの関係で端末表示がすごいことになる可能性があります。
そこで、 puts result.toeuc とか書きたいんですが、実行者の端末が日本語 EUC だとは限りませんよね。
「puts のとこの toeuc の部分を自分の環境に合わせて適宜書き換えてね」と言ってもいいんですが、
puts が何個もあるとさすがに面倒だろうなと思います。というか、自分なら面倒でやりたくありません。
何かわかりやすくてうまい方法はありませんか?

output に溜めて最後に一括変換一括表示というのは、puts したい文字列の文字エンコードが複数あるのでやりたくないです。
659デフォルトの名無しさん:2008/07/24(木) 17:45:41
出力用のエンコードを定数に入れて String#kconv
660デフォルトの名無しさん:2008/07/24(木) 18:46:39
putsを再定義(可能性として)
661デフォルトの名無しさん:2008/07/24(木) 21:58:20
正規表現で日本語マッチしないと思いきや
何のことはない文字コードを%r{}sとしてShiftJIS指定したら
マッチした。それまでは意味不明なエラーが・・・
しかもnkfライブラリというものが入ってるらしいね
後で入れなきゃいけないと勘違いしてて
それなら(ソースごと配布する時に)めんどくさいから、
利用するのやめとこうと思ってた。
662デフォルトの名無しさん:2008/07/24(木) 22:04:32
def puts(str)
print "#{str.toeuc}\n"
end

と require の直後に書かれてればわかるかも
663デフォルトの名無しさん:2008/07/24(木) 22:26:54
>>658
メソッド名は適当に変えれ
class String
 def tolocal ; Kconv::kconv(self,Kconv::AUTO) ; end
end
puts '日本語'.tolocal
664デフォルトの名無しさん:2008/07/24(木) 22:39:33
1.9ではhpricotが使えなくて自力で弄って使っているんですがちょっと怖いです
ruby標準ライブラリにHTMLパーザって無いんでしょうか?
665デフォルトの名無しさん:2008/07/24(木) 23:11:52
ない。
XMLパーサのREXMLならあるが、HTMLのいい加減さに対しては無理があるな。

つーか、初心者が1.9使ってはいかんよ。
666デフォルトの名無しさん:2008/07/24(木) 23:14:01
1.9に未対応ライブラリがあるのは仕方ない
仕様がどんどん変わってるんだし(今はもう落ち着いたのかな?)
make test-allなんてやるとrindaが未対応なのを未だに晒してて恥ずかしいけどね。
対応する気がないならはずせばいいのにね。どうせ誰も使ってないんだし
667デフォルトの名無しさん:2008/07/25(金) 00:16:45
PlaggerがなければPRaggerを読めばいいじゃない
668デフォルトの名無しさん:2008/07/25(金) 10:35:01
Ruby1.8.1の環境でUTF-8からSJISへの文字コード変換でのエラーで悩んでいます。
現時点ではIconvでの変換である程度うまくいってるんですが、
一部の文字が含まれているときにエラーとなります=>Iconv::IllegalSequence(対象の文字が文字集合に含まれないため変換が停止)
1.8.7では問題ないので、バージョンが古いせいだと考えてます。

文字コード関連の標準ライブラリはいずれも1.8.2からUTF-8に対応してるようなのですが、
1.8.1で1.8.2の機能を使う方法ってあるでしょうか?(Pythonの__future__指定のような)

他にに1.8.1のnkfでは無視されてUTF-8のままの出力、
kconvでも同様、あるいはNameError(UTF-8変換の定数などが存在しないため)となっています。
669デフォルトの名無しさん:2008/07/25(金) 10:41:21
1.6や1.8.1のUTF-8関連はUconv
670デフォルトの名無しさん:2008/07/25(金) 10:45:55
1.8.1じゃ外部ライブラリ動かなくて大変だろうな
671668:2008/07/25(金) 12:09:58
>>669
ありがとうございます!
レン鯖なのでUconvはあきらめてたのですが、
言われてもう一度調べてたらPureRuby版があったことに気づき、
さっそく試してみたところ、解決できたようです。
よかった・・・

>>670
非公式に(?)Rubyがこっそりインストールされてる鯖で、標準ライブラリしかないんです。
たいしたことやってないので今のところは間に合ってるんですが^^
672デフォルトの名無しさん:2008/07/25(金) 15:24:05
>>671
何言ってるかわかんね レン鯖なのでUconv・・・のレン鯖って何?

breakとnext間違えてるのを使ったことないデバッガで
何時間もかけてやっと気づいた
いやーデバッガ使えるって便利だねw なかったらどうなってたかわからん
ほんとに助かる
673デフォルトの名無しさん:2008/07/25(金) 15:42:17
レンタルサーバー、の略
674デフォルトの名無しさん:2008/07/25(金) 15:42:24
日本語でおk
というか、チラシの裏でおk
675デフォルトの名無しさん:2008/07/25(金) 17:18:46
場違いかもしれませんがRailsのスレが無いので質問させてください。
railsのform_forのcheck_boxで、デフォルトでチェックされた状態にすることは可能でしょうか?
676デフォルトの名無しさん:2008/07/25(金) 19:26:29
677デフォルトの名無しさん:2008/07/25(金) 21:10:41
あるオブジェクトのメソッド呼び出しの前に米印が付いてるんですけど、これって何ですか?
val = *row.search("//td/text()")

あと、Ruby のチュートリアルとかでよいのがあれば教えてください。
678デフォルトの名無しさん:2008/07/25(金) 21:39:04
これをマニュアルのどこで説明するかってのはけっこう重大な問題だったりする
現行のマニュアルでは見つけにくいことこのうえない

>>677
Hpricot の search メソッドだと推定
search は一重の配列しか返さないから、この場合は特に意味はないと思われ
書いた人が search メソッドの動作に自信がないので保険をかけたように見える

以下一般論
これは「メソッド呼び出しの引数展開」と呼ぶ(Ruby では = もメソッドだ)
row.search("//td/text()") の結果の配列を展開して val のクラスの = メソッドに順に渡す

んだが、*arr にはひとつ特別な効果がある

irb> vals = *[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
irb> vals = *[[1, 2, 3, 4, 5]]
[1, 2, 3, 4, 5]
irb> vals = *[[[1, 2, 3, 4, 5]]]
[[1, 2, 3, 4, 5]]
irb> vals = *[[[[1, 2, 3, 4, 5]]]]
[[[1, 2, 3, 4, 5]]]
irb> vals = *[[1, 2], [3, 4, 5]]
[[1, 2], [3, 4, 5]]
irb> vals = [1, 2, 3, 4, 5][0]
[1, 2, 3, 4, 5]

おそらくはこれの効果を狙ってたんだろう
679677:2008/07/25(金) 21:47:56
>>678
詳しい説明ありがとうございます。
Mechanizeってのを使ってますが、中でHpricotを使ってるみたいなので、
Hpricotのsearchだと思います。
680デフォルトの名無しさん:2008/07/25(金) 21:54:56
>>677
リファレンスマニュアル>Rubyの文法>演算子式>代入>多重代入
ついでだから
リファレンスマニュアル>Rubyの文法>メソッド呼び出し
も読んどけ
681デフォルトの名無しさん:2008/07/25(金) 22:20:00
>>675
form_forなら、対象ARの該当属性をtrueにしておけばいいよーな。
682デフォルトの名無しさん:2008/07/25(金) 22:22:15
683デフォルトの名無しさん:2008/07/26(土) 00:07:06
すみません、The Ruby Wayって本読んでるんですけどそれのレーベンシュタイン距離の
算出プログラムで以下の部分の意味が分かりません。前から順番に読んでいってるのに
いきなり配列っぽい文法が出てきて困っています。この本、初心者が読む本じゃないんでしょうか?
特に2行目の[0]ってなんですか?

#最初の行の値を初期化する
dm[0]=(0..self.length).collect{|i| i * ins}
fill=[0]*[self.length-1]
684デフォルトの名無しさん:2008/07/26(土) 00:10:39
amazonにあるThe Ruby Wayの説明

>本書は、Rubyの広範囲なプログラミングテクニックについて解説したものである。
>大半が実践的内容となっており、Rubyプログラミング経験者が対象になると考えられる。
>そのため、Ruby初心者には理解が難しいかもしれない。
685デフォルトの名無しさん:2008/07/26(土) 00:19:13
[0] は [0] だろ
self の 大きさマイナス1のぶんだけ [0, 0, 0, 0, ..., 0] を作るんだ
レーベンシュタイン距離を筆算で出せてRubyで記述できる人じゃないと一発で読み解くの無理だろうな
686デフォルトの名無しさん:2008/07/26(土) 00:24:21
まああれだ。

irb(main):001:0> [1,2,3]*3
=> [1, 2, 3, 1, 2, 3, 1, 2, 3]

って辺りで納得してくれ。
687デフォルトの名無しさん:2008/07/26(土) 00:25:58
>>686
えっ、それって[3,6,9]になるんじゃないんだ
688デフォルトの名無しさん:2008/07/26(土) 00:29:46
>>687
じゃあ [1, 2, 3] + 3 は [4, 5, 6] になっていい?
689デフォルトの名無しさん:2008/07/26(土) 00:33:26
いいような。ダメ?
その辺をRubyがどう解釈するのか勉強たりないや
690デフォルトの名無しさん:2008/07/26(土) 00:37:22
>>685
配列はまだ分からないのですがこんな感じのことでしょうか?
fill=[]
for i in 0..self.length-1
fill[i]=0
end
>>686
すみません、初心者なのでむしろ分かりませんw
691デフォルトの名無しさん:2008/07/26(土) 00:44:23
俺なら、それやりたいときは
fill = []
0.upto(self.length-1) { |i|
fill << 0
}
こうやってそうだが、
[0]*[self.length-1]
これでもいいのか
692デフォルトの名無しさん:2008/07/26(土) 00:46:14
>>689
まあリクツ上はダメじゃないんだが、Rubyがそれを採用しなかったのは写像の考え方を支持したから
>>683にもcollectの形で存在してるが、mapと呼ばれるメソッドだ

「配列の [1, 2, 3] の全要素に 3 をかけて [3, 6, 9] にしたい」という場合は、
「集合 [1, 2, 3] に関数 f(i) = i * 3 を作用させて [3, 6, 9] を取り出す」と考える
irb> p [1, 2, 3].map{|e| e * 3}
[3, 6, 9]
693デフォルトの名無しさん:2008/07/26(土) 00:52:01
レスを見てこの本が初心者むけじゃないことは良く分かりました。
でも高かったのでもう少し頑張ってみます
ところで100ページぐらい読みましたが、幾度となく注釈に
「ruby1.9.0より動作が変わる予定です」とか書いてます。
1.9.0って地雷なんですか?
694デフォルトの名無しさん:2008/07/26(土) 00:56:49
一旦本棚にしまっておいて、初心者向け書籍やらサイトやらで勉強してから読むといい
その本自体はかなり良い本だ(サンプルの題材が若干変だけど)

あと、Ruby1.9.x は過去のしがらみを捨てて新しく使いやすいRubyを目指したもの
過去との書き方や動作とは全く違うという場面が多いからそういう注釈がついてるのだろう
695デフォルトの名無しさん:2008/07/26(土) 00:57:55
あのさ

irb> a = [0] * [1]
TypeError: can't convert Array into Integer

動かないんだけど、答えてる人はどんな結果になる?
696デフォルトの名無しさん:2008/07/26(土) 01:00:53
>>695
話の流れから考えると、>>691のは単なる記述ミスだろう
697デフォルトの名無しさん:2008/07/26(土) 01:01:10
>>695
[0] *1
なら上手くいった
本の誤植?

俺は横から質問してる方だけど
698691,697:2008/07/26(土) 01:03:20
>>696
>>683
がfill=[0]*[self.length-1]
なんでそれに連られた
699デフォルトの名無しさん:2008/07/26(土) 01:05:29
すみません、私の誤植でした。
fill=[0]*(self.length-1)
でした
700デフォルトの名無しさん:2008/07/26(土) 01:12:43
>>699
わからないことがあったらirbで試すといいよ

irb(main):006:0> a=[0]* 8
=> [0, 0, 0, 0, 0, 0, 0, 0]
irb(main):007:0> a=[0,2]* 8
=> [0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2]
irb(main):008:0>

なんてやれば、どうなるか直ぐ確認できるよ
701デフォルトの名無しさん:2008/07/26(土) 01:19:59
>>692
Rubyのブロックつき写像はRubyっぽさが出てて素敵だと思う
ちなみにPythonでは map(lambda x: x * 3, [1, 2, 3]) と書く
無名関数を使わなければならない場合はRubyのほうが見やすいね
702デフォルトの名無しさん:2008/07/26(土) 01:21:53
683
皆様ありがとうございました。
本は最後まで読まないと気がすまないほうなので分からないなりに
一回は最後まで目を通したいと思います
また質問するかもしれませんがよろしくお願いします
703デフォルトの名無しさん:2008/07/26(土) 02:02:36
へえ
使用がよくわからないからif文と正規表現ばっかり使ってるけど
それでいいことがあったのか
704デフォルトの名無しさん:2008/07/26(土) 02:13:56
>>703
こっちは君が何を指して喋ってるのかわからなくて怖いよ
705デフォルトの名無しさん:2008/07/26(土) 02:14:52
誤爆じゃないの?
かなり近所のようだが
706デフォルトの名無しさん:2008/07/26(土) 02:44:58
>>704
多重代入とかメソッド使ってると仕様が変わって動かない・・・
刷新するっていってもそんなに刷新しない? わからないので
言ってること変でサーセン
text == ("abya" || "ahya" || "gugege")
この書き方するとどれかに当てはまっても
falseみたいだね 文字列型の条件式は
注意しないとやはりまずいのか
同じオブジェクトでないと同じとみなされないが、
例外的に二つのオブジェクトを等号でつなぐと
値が同じがどうかが判定されるために
当てはまる条件緩くするとtrueがfalseになる、
という風に見える
あってるかどうか知らないけどこじつけて覚えとこ
707デフォルトの名無しさん:2008/07/26(土) 02:56:42
("abya" || "ahya" || "gugege")
は常に一番左の true である 'abya' を返す
演算子 || は左辺から順に評価して true を探すだけだ

選択を行いたいなら

text == "abya" || text == "ahya" || text == "gugege"
["abya", "ahya", "gugege"].include?(text)

とかきちんと書いてくれ
708デフォルトの名無しさん:2008/07/26(土) 03:05:23
× true を探す
○ 真を探して返す
709デフォルトの名無しさん:2008/07/26(土) 05:45:22
> text == ("abya" || "ahya" || "gugege")
プログラムを習い始めた時、何でこれがダメなのかわからなかったよ
学校の先生も正しくは教えてくれなかった
わかりはじめたのは演算子の優先順位を知ったあたりかな
710デフォルトの名無しさん:2008/07/26(土) 06:32:19
それはひどい
711デフォルトの名無しさん:2008/07/26(土) 10:25:48
まあ「駄目なほうはなぜ期待通りに動作しないのか」の説明は面倒だからな
text == "abya" || text == "ahya" || text == "gugege"
が希望通りに動作するというのは一見して理解できるが
text == ("abya" || "ahya" || "gugege")
が駄目な理由というのはちと直感に反する、というか最初は絶対こう書く
注意深く追うと変な動作を期待してるってのはわかるんだがね

>>706の理解は変だが
712デフォルトの名無しさん:2008/07/26(土) 10:30:10
>>711
> 最初は絶対こう書く
みんな、そんなに始めからフリーダムなの?世界観が変わるわw

普通は、「書いたとおりに動く」っていうのをまずたたき込まれるん
じゃないの?
713デフォルトの名無しさん:2008/07/26(土) 10:34:52
「変数の内容が ○○ か △△ か ×× のどれかに等しいなら」という条件選択の記述はふつーは「習わない」だろ
このへんになると演算子の動作とかを自分で考えて書き下す頃合のはず

ここで引っかからないのはセンス持ちかコピペ君かどっちかだな
714デフォルトの名無しさん:2008/07/26(土) 10:40:49
>>713
??
if( ほげ || ぱげ || もげ ) { ほげほげ }

いや、普通に初歩の初歩ですが。
「教わる」場合、AND・ORの論理演算すら教えてもらえないって
いうのは無いんじゃないかな?
715デフォルトの名無しさん:2008/07/26(土) 10:52:12
>>713
↓ これが、多分「習う」書き方。
( str == 'aaa' || str == 'bbb' )

↓ これは、多分(普通には)習わない書き方。
str == ('aaa' || 'bbb')

後者の方をよくわからずに書いちゃう人間は、それこそ
ダメセンス持ちかコピペ君かどっちかじゃね?
716デフォルトの名無しさん:2008/07/26(土) 10:52:48
そこを問題にするなんて君には常識がないな
他人にもの教えるときには気をつけたほうがいいぞ
717デフォルトの名無しさん:2008/07/26(土) 10:56:18
このへんは初心者相手に話をしたことがあるかどうかで認識がまったく違うな
自分ひとりしかいない環境で育ってきた人は「間違うなんてありえない」と言うだろう
718デフォルトの名無しさん:2008/07/26(土) 10:58:40
Rubyのチュートリアル系記事がヘナチョコな理由が垣間見えた
719デフォルトの名無しさん:2008/07/26(土) 11:33:06
Ruby固有なのか日本人全般の気質なのか意見が分かれるとこだ
720デフォルトの名無しさん:2008/07/26(土) 12:03:19
言語に関係なく a < b < c とか書いて「動きません」とかいうプログラミング
初心者はいるだろJK

a < b < c で (a < b) && (b < c) になる言語を除く。
721デフォルトの名無しさん:2008/07/26(土) 12:49:40
しかしこう書く
["aaa","bbb"].include? s
722デフォルトの名無しさん:2008/07/26(土) 12:52:01
『初めてのRuby』またAmazonで売り切れてる。すごい人気だな。
723デフォルトの名無しさん:2008/07/26(土) 12:53:27
724デフォルトの名無しさん:2008/07/26(土) 15:00:39
case-whenで書く
725デフォルトの名無しさん:2008/07/26(土) 15:32:52
別にruby固有の話じゃないよね
昔は最初の言語としてCをやることが
多かったからCのif文で同じようなことやってる奴はいたわな

最近の学生はrubyでプログラミング始めるの?
恵まれてるのか恵まれてないのか微妙だけど
時の流れを感じるな
726デフォルトの名無しさん:2008/07/26(土) 15:39:15
>>722
こういうコンピュータ関連の本は入荷を激烈に絞るから、売り切れは人気のバロメータにならない
たとえば、3冊だけ入荷したのが2度売り切れたからといって、大人気とは言えんだろ

まあ、実際には都会の本屋で売り切れって程度にはわりと売れてるわけだが…
Gaucheの本があっさり重刷かかったときもビビったが、なにかあるのかね
727デフォルトの名無しさん:2008/07/26(土) 15:45:55
>>725
実際に必要なのは変数宣言とバイナリ列とポインタの操作ではなく
データを格納した配列と文字列の操作と正規表現であるということに
やっと皆が気づいたのだよ

いやわりとマジで
ふだん必要とされるのはデータをいじって結果出すことだろ
プログラムを作ることそのものじゃない
728デフォルトの名無しさん:2008/07/26(土) 15:47:23
ハッシュと正規表現、Perlへようこそ
729デフォルトの名無しさん:2008/07/26(土) 15:49:03
VERSION => "1.8.7"
%w:foo bar baz:.each(&:require)

なんでできないのん?
730デフォルトの名無しさん:2008/07/26(土) 15:50:01
>>727
経済とか生物学部の学生ならそれでいいけど
情報系はもちろん数学や物理の学生は計算機の仕組みを
意識させるためにCからやって欲しいね
731デフォルトの名無しさん:2008/07/26(土) 15:53:29
>>729
その書き方だと
'foo'.require
'bar'.require
の意味になる。

さあString#requireを定義するんだ。
732デフォルトの名無しさん:2008/07/26(土) 15:59:00
連続 require をなんとかして実行しようとする人って時々見るな
ブロックつきメソッドで require はむしろカッコ悪いと思うんだが

%w(foo bar baz).each{|e| require(e)}
733デフォルトの名無しさん:2008/07/26(土) 16:00:25
>>730
いらねーよ
Cで書かなければならない(状況に陥った)人だけ勉強しろ
全員に最初から学ばせる理由はもはやゼロだ
734デフォルトの名無しさん:2008/07/26(土) 16:04:31
>>729
できました
でも細工無しで[].eachなんとかって形でできればもっといいと思いました

>>732
僕はlispで(apply 'load file-list)ってやるみたいで格好いいと思いますけど
ブロック付きメソッドの記法を使うところだけなら同感ですが
735デフォルトの名無しさん:2008/07/26(土) 16:06:25
require に配列か複数の引数を渡せたら便利なのになあと思うことは年に数回ある
736デフォルトの名無しさん:2008/07/26(土) 16:14:38
requireよりloadのほうが打ちやすかったなあと思うことは年に数回ある
737デフォルトの名無しさん:2008/07/26(土) 16:16:28
おまえらRuby使えるなんてすごいな 頭良いんだな
738デフォルトの名無しさん:2008/07/26(土) 16:27:16
>>737
頭のいいやつが楽をするために使ってる場合と
他の言語が使えない頭悪いやつが使ってる場合があるみたいよ
739デフォルトの名無しさん:2008/07/26(土) 16:29:30
他の言語が使えないのに難しいRubyを使えるわけがない
740デフォルトの名無しさん:2008/07/26(土) 16:33:22
プログラム言語の習得自体にはいわゆる頭のよさってあんま関係ないよね
素質さえあれば誰でもある程度はできる
素質がないと、指短い人がギターやピアノ弾きにくいのと同程度には辛い

使えるようになるまでがめっちゃ小難しい言語というのは稀にあるが、少なくともRubyはそうじゃない
741デフォルトの名無しさん:2008/07/26(土) 16:38:15
>>736
効率を度外視して毎回loadで呼べばいいじゃない。(.rb限定)
742デフォルトの名無しさん:2008/07/26(土) 16:40:38
設計者も言ってるが、Rubyは少なくとも見た目は保守的な普通の言語
例えばCやその子孫と比べて、
何かつまづく要素があるとも思えないが(あえて言うならブロック?)
743デフォルトの名無しさん:2008/07/26(土) 16:41:35
使えるのと使いこなすのは大分違うからな
>>733
みたいな考えもあるし
ゆとりの流れが加速し続けなければいいが
744デフォルトの名無しさん:2008/07/26(土) 16:45:01
>>742
ブロックとかに凝らなければ簡単だな
ブロックとかprocとか動的にmethod作ったりruby的な技を
駆使したコードを読むときは、かなり困るというか
いまだによく判らなくて泣きが入るときがある
745デフォルトの名無しさん:2008/07/26(土) 16:47:20
まともに文書化された言語仕様がない言語でプログラミング教育なんて
いまどきありえない。なに考えてんだ東大。
746デフォルトの名無しさん:2008/07/26(土) 16:49:16
言語仕様がないと判断できないような微妙な状況には無縁だろうからいいんじゃないの。

747デフォルトの名無しさん:2008/07/26(土) 16:50:33
jrubyとかIronRubyとか別実装作るのに言語仕様がないと
困ると思うんだが。
どうやってるんだろうね
748デフォルトの名無しさん:2008/07/26(土) 16:53:49
Rubyはタイプ数が少ないから紙にコードを書いて示すときに素早く書けてよかったなー、なんて思うことはたまに有るような。
749デフォルトの名無しさん:2008/07/26(土) 16:56:37
>>745
お前それしか言わないな
750デフォルトの名無しさん:2008/07/26(土) 17:06:58
>>747
本家MRIが仕様らしい
例えばJRuby1.0.3は、MRI1.8.5を基準にしている

テストは「Railsが動くかどうか」が一つの目安だそうなw
Rubyの幅広い機能を使ってるんで、動作確認にはちょうどいいんだとか
ただ今後実装が増えてくる事を考えるとさすがに不味いってことで、今はテスト策定中
751デフォルトの名無しさん:2008/07/26(土) 17:09:04
Matz Remote Invocationの略だっけ
752デフォルトの名無しさん:2008/07/26(土) 17:09:51
Magnetic Resonance Imaging ?
753デフォルトの名無しさん:2008/07/26(土) 17:19:38
rubyなんだかんだいって難しいからな。初めてのCよりも。。。
754デフォルトの名無しさん:2008/07/26(土) 17:23:21
そりゃRubyよりCの方が簡単だからね。
「簡素に記述できる」ってことはそれだけに含まれている意味が多いってことだもんで。
755デフォルトの名無しさん:2008/07/26(土) 18:44:43
確かにRubyが使える人なら他の大抵の言語は使えるだろうな。
756デフォルトの名無しさん:2008/07/26(土) 18:45:47
他の言語を使いたくなくなるかもしれないがな
757デフォルトの名無しさん:2008/07/26(土) 18:48:30
Rubyが使えるようになれば他の言語は必要ないでしょ。
他の言語はRubyが使えない初心者用に設計されてるし。
758デフォルトの名無しさん:2008/07/26(土) 18:50:48
lispとか関数型言語も勉強するとよさそうだけどね
prologもやってみたいな
759デフォルトの名無しさん:2008/07/26(土) 18:52:20
関数型には大きな欠点があるから、今以上使われることはないと思う。
760デフォルトの名無しさん:2008/07/26(土) 19:00:47
>>756-757
だから適材適所だと・・・
初心者スレで釣り針投げるなよ・・・w
761デフォルトの名無しさん:2008/07/26(土) 19:14:18
>>760
だから適材適所って話。
初心者は、C/C++。
中級者は、Java。
上級者は、Ruby。
762デフォルトの名無しさん:2008/07/26(土) 19:33:43
夏だな…
763デフォルトの名無しさん:2008/07/26(土) 19:35:45
上級者は言語の好き嫌いはあっても言語を選びません。
このスレに来たRuby初心者の皆さんは、いろんな言語を触ってみましょう。
764デフォルトの名無しさん:2008/07/26(土) 19:51:14
はーーい
765デフォルトの名無しさん:2008/07/26(土) 20:05:19
じゃあちょっくらPHP触ってくる
766デフォルトの名無しさん:2008/07/26(土) 20:29:25
よし俺はBASICとCOBOLを
767デフォルトの名無しさん:2008/07/26(土) 20:34:26
prolog逝ってきます
768デフォルトの名無しさん:2008/07/26(土) 20:46:53
>>759
関数型の欠点ってなに?
769デフォルトの名無しさん:2008/07/26(土) 21:05:07
統一ライブラリが存在しないこと?
lispは皆好き勝手やってて
車輪の再発明しまくりって聞いたことあるな
770デフォルトの名無しさん:2008/07/26(土) 21:30:30
処理系すら再発明しまくりだからな
あいつら馬鹿だよ
771デフォルトの名無しさん:2008/07/26(土) 22:01:55
>>768
Rubyじゃないこと。
772デフォルトの名無しさん:2008/07/26(土) 22:09:12
初心者スレにも妙なRuby信者が表れだしたか
さすが夏だな
773デフォルトの名無しさん:2008/07/26(土) 22:30:33
×信者
○糸
774デフォルトの名無しさん:2008/07/26(土) 22:32:21
>>772までが目的
775デフォルトの名無しさん:2008/07/27(日) 01:20:44
>>770
今のRubyも処理系を再発明しまくりだから
Rubyも馬鹿ばっかりだな

処理系すら作れないやつは黙っとけよ
776デフォルトの名無しさん:2008/07/27(日) 01:24:56
>>770
それは作るのが簡単だからでしょ。
ホントに本格的なものを作るとなったら商用のCommon Lisp処理系使うよ。
ていうか、そんな「本格的な」状況になったら、今度はRubyの出番が激減する。
777デフォルトの名無しさん:2008/07/27(日) 02:13:28
"a" << "b" << "c" こういう記述はよくあるような
Lispってあの難しい奴?
こういう記憶ならある
学校の先生「EmacsはELispというものを書いて使ってくださいねー」
生徒「はーい」
俺:geditでプログラミング
778デフォルトの名無しさん:2008/07/27(日) 06:43:35
エディタなんて何だって良いけど、講義でEmacs使えって言ってんだからEmacsを使うのが筋
こういうのをコミュニケーション能力が低いって言うんだよ。
779デフォルトの名無しさん:2008/07/27(日) 06:58:42
>>778
使いたいなら使えって言われても・・・
ぼっちなのが悪いんですね、わかります
RubyTkのマニュアルないかな
英語でもいいんだが、さっき見つけたと思ったら
日本語版探してる内に英語版の場所が・・・
780デフォルトの名無しさん:2008/07/27(日) 07:38:30
ftext.bind "FocusIn" => ftext.configure('width'=>30,'height'=>30)

ごめんマニュアルあるけどわけわからん
ftextはtextウィジェットなんだけど、
これっておかしい? 何でか動かない
781デフォルトの名無しさん:2008/07/27(日) 07:51:16
Emacsを使うのも授業
別にエディタがそれしか入ってないからじゃない(それもあるが…)
782デフォルトの名無しさん:2008/07/27(日) 08:12:08
なんか知らんけど出来た スレ汚しスマソ
>>781
補完機能使いたいけど操作が難しくて諦めてる俺
練習すればいいのかな
783デフォルトの名無しさん:2008/07/27(日) 08:38:19
>>781
体鍛えるのは一緒だからって体育の時間ずっとサッカーやってた奴がいたなあ
私立だったので停学食らったけど
784デフォルトの名無しさん:2008/07/27(日) 08:50:13
>>779
お前はまずコミュニケーション能力以前に、日本語の能力が欠けている
785デフォルトの名無しさん:2008/07/27(日) 09:51:29
rubyTkのまともな仕様書ってある?
仕様書で正しいのかな
リファレンスか
786デフォルトの名無しさん:2008/07/27(日) 09:53:00
>>784
日本語の能力?
日本語を喋る言語能力の事か
日本語を喋る技能が不足してると
日本語の能力とはねw
787デフォルトの名無しさん:2008/07/27(日) 09:56:11
>>786
日本語でおk
788デフォルトの名無しさん:2008/07/27(日) 10:06:43
配列の各要素をキーとするハッシュを作成するときに、Perlだと
my %h = map { $_ => f($_) } @a;
のような書き方をよくしますが、Rubyだと
h = {}
a.each {|x| h[x] = f(x) }
のような書き方しか思いつきません。
Perlのように1行で関数言語的に簡潔に記述する方法ってあるんでしょうか?
一応以下のページくらいは読んだのですが、思いつきませんでした。
http://www.ruby-lang.org/ja/man/html/Hash.html
http://www.namaraii.com/rubytips/?%A5%CF%A5%C3%A5%B7%A5%E5
789デフォルトの名無しさん:2008/07/27(日) 10:25:24
>>788
特には無いです
inject 使えばなんとかなったけど、本質的に複数行なので却下
irb> [[1,2],[3,4],[5,6]].inject(Hash.new){|h,e| h.store(e[0],e[1]); h}
{5=>6, 1=>2, 3=>4}
790デフォルトの名無しさん:2008/07/27(日) 10:27:21
ああ、ちょっと用件が違うのか
a.inject(Hash.new){|h,e| h.store(e,f(e)); h}
こうかな
791デフォルトの名無しさん:2008/07/27(日) 10:31:12
あ~、添え字使わないんだから h[e]=f(e) って書いても見難くないのか
まあいいや、好きなように書いてくれ
このタイプの inject は読みにくい部類に入るから多用は勧めないよ
792デフォルトの名無しさん:2008/07/27(日) 10:32:18
Hash[*ary.map {|x| [x, f(x)] }.flatten]
とか
793デフォルトの名無しさん:2008/07/27(日) 10:56:16
TypeError: Array can't be coerced into Fixnum
from (irb):2:in `+'
from (irb):2:in `f'
from (irb):8
from (irb):8:in `map'
794デフォルトの名無しさん:2008/07/27(日) 11:00:28
前の行で何書いたかが気になる
irb> ary=[1,2,3]; def f(x); x*2; end; Hash[*ary.map {|x| [x, f(x)] }.flatten]
{1=>2, 2=>4, 3=>6}
795デフォルトの名無しさん:2008/07/27(日) 11:52:49
class Object
def tap!
yield(self)
end
end
[1,2,3].tap!{|ary|p Hash[*ary.map {|x| [x, Proc.new{|x| x*2}.call(x)] }.flatten]}
というtap!とか(難読化に)便利だと思うんですか、無いんですよね
必要なら簡単に書けるからなのかな?
796デフォルトの名無しさん:2008/07/27(日) 11:57:22
訂正
(1..3).tap!{|ary|Hash[*ary.map{|x|[x,proc{|x|x*2}.call(x)]}.flatten]}
797デフォルトの名無しさん:2008/07/27(日) 12:15:37
tap の意味を辞書で100回調べろ
あと、オブジェクトAをオブジェクトBに変換する処理をオブジェクトAのメソッドに負わせるのは必ずしも正当ではない

Hash[*(1..3).map{|e| [e, e*2]}.flatten]
798デフォルトの名無しさん:2008/07/27(日) 12:26:33
RubyではObjectクラスに関数的メソッドとして変換メソッドのエイリアスを定義するのが流行ってるな
字面は便利だけどなんとなく使ったら負けな感じがしててアレだ
799デフォルトの名無しさん:2008/07/27(日) 12:30:44
組み込みクラスの拡張は最後の武器だ
800デフォルトの名無しさん:2008/07/27(日) 12:31:13
>オブジェクトAをオブジェクトBに変換する処理をオブジェクトAのメソッドに負わせる
えー
to_aとかあるじゃないっすか

>>798
古くはシェルでcat xxx|awk ...とやるように
今ではC#の拡張メソッドをtemplateと演算子オーバーロード、型推論を使ってC++で使うように
別に邪道でもなんでもないと思うけど
801デフォルトの名無しさん:2008/07/27(日) 12:37:02
>>797
まー>>795の論拠になるものではないな

使用して3~4ヶ月目くらいに嬉々として定義して
自分のスクリプト全部で使いそうなメソッドではあるが
802デフォルトの名無しさん:2008/07/27(日) 12:38:23
本当にまずいものならマクロみたいに最初から使えなくなってる筈
そうなってないという事はじゃんじゃん使ってもおkという事なんだよ!!
803デフォルトの名無しさん:2008/07/27(日) 12:38:58
「過去の俺はこんな厨二クラスや邪眼メソッドを作った」というのは
るびまとかでアンケート取ると面白いと思う
804デフォルトの名無しさん:2008/07/27(日) 12:40:07
そういう勘違いスパッゲッティ野郎は一生Javaの世界から出てこないでください
805デフォルトの名無しさん:2008/07/27(日) 12:41:27
>>803
最優秀賞はRailsに贈られます
審査員特別賞にcgi.rbが選ばれました

受賞者は式典辞退した模様
806デフォルトの名無しさん:2008/07/27(日) 12:44:10
こういうのはスパゲティーっていわない
N88basicのような本物のスパゲティーを味わってから言ってください
807デフォルトの名無しさん:2008/07/27(日) 12:46:44
>>805
CGI本体は別にいいんだが、TagMakerのあたりがけっこうモヤモヤする
あれをそもそもHTMLジェネレータとして分けようと思わなかったのは何故なんだろうね

>>806
スパゲッティを名乗るならGOSUBくらい存在して欲しいよな
808デフォルトの名無しさん:2008/07/27(日) 13:47:42
F-BASIC はスパゲティじゃないのですか?
809788:2008/07/27(日) 16:14:55
レスありがとうございます。色々と参考になりました。
結局2行で書くのが一番シンプルで分かりやすいようですね。
最近のRubyはtapというのが使えるようになったんですね。
h = {}.tap {|h| a.each{|x| h[x] = f(x) }
と書けるようですが、これも2行で書く方がシンプルですね…。
ttp://d.hatena.ne.jp/rubikitch/20080502/tap
810デフォルトの名無しさん:2008/07/27(日) 17:54:30
最初に例に出されたPerlのコード自体が割とトリッキーだという自覚はあるかい?
811デフォルトの名無しさん:2008/07/27(日) 17:58:59
Pythonが圧勝だな
dict((k, f(k)) for k in ary)
812デフォルトの名無しさん:2008/07/27(日) 18:01:51
>>810
どっちかってえと、
「配列のペアをハッシュに一発で変換」
というメソッドの提供を頑なに拒んでるRuby側の問題のようにも思える
813デフォルトの名無しさん:2008/07/27(日) 18:18:57
>>812
拒んでるんだ
自分でそれ用のmodule作ってincludeでもextendでも
すればいいんでは
814デフォルトの名無しさん:2008/07/27(日) 18:25:45
拒んでるってえか、Hash[*arr.flatten] で済むから別にいいか、みたいな
ネストしてたりするのを arr.to_h とかでハッシュにできたりすると逆に複雑じゃん?
815デフォルトの名無しさん:2008/07/27(日) 20:42:30
>>814
irb(main):011:0> Hash[*arr.flatten]
=> {5=>6, 1=>2, 3=>4}

ホントだ。これで十分だな。
といっても*arrしてる意味を理解できてないんだがw
816デフォルトの名無しさん:2008/07/27(日) 20:46:04
その前に、Hash[] がわかりません;;
817デフォルトの名無しさん:2008/07/27(日) 21:01:55
*arrしたのを flatten して Hash[] に渡してるのではない
arr を flatten したのを * つき引数で Hash[] に渡してるんだ
Hash[] は引数を キー1, 値1, キー2, 値2, キー3, 値3, ... というハッシュ候補の連なりとみなす
818デフォルトの名無しさん:2008/07/27(日) 21:55:23
*ってやばいんですね
def foo(a,b)
a+b
end

foo(*[1,2]) # => 3
すごい、けど今回の以外には使いどころが思いつきません
他にどういう使い方があるんでしょうあk?
819デフォルトの名無しさん:2008/07/27(日) 21:58:48
irb(main):029:0> a,*b = 1,2,3
=> [1, 2, 3]
irb(main):030:0> a
=> 1
irb(main):031:0> b
=> [2, 3]
820デフォルトの名無しさん:2008/07/28(月) 00:18:51
Record = Struct.new(:x, :y, :z, :u, :t, :s)
records = ARGF.readlines.map{|line|
 Record.new *line.split(/\s+/, Record.members.size)
}
821デフォルトの名無しさん:2008/07/29(火) 20:13:59
awkのような列単位での読み込みってどういうふうにできますか?
例えば
3列目 + 5列目
みたいな計算がしたいのですが
822デフォルトの名無しさん:2008/07/29(火) 20:29:20
rubyでオブジェクト指向の意味とかありがたさを勉強したいのですが、定番の書籍はありますか?
823デフォルトの名無しさん:2008/07/29(火) 21:03:06
>>821
あ、それRubyではできないんでawk使ってくれ
Rubyでは全部読み込んでから配列へ分割することしかできない
824デフォルトの名無しさん:2008/07/29(火) 21:06:20
>>821
一応、Perlを踏襲して -a オプションはある。

ruby -ane 'puts $F[2].to_i + $F[4].to_i'
825デフォルトの名無しさん:2008/07/29(火) 21:23:33
>>823
> Rubyでは全部読み込んでから配列へ分割することしかできない
メモリに全部読み込んでからさらに分割するもんだから、超巨大ファイルの場合は大変なことに…
826デフォルトの名無しさん:2008/07/29(火) 21:24:31
>>825
1行単位の話だろJK
827デフォルトの名無しさん:2008/07/29(火) 21:57:40
>>821
#!ruby -n
BEGIN { $count = 0 }
$count += $_.to_i if [3,5].include?($.)
END { puts $count }
828デフォルトの名無しさん:2008/07/29(火) 22:14:24
あれ、列だろ? 行じゃなく。

829827:2008/07/29(火) 22:37:15
>>821,828
失礼しました >>827 は間違いです
>>824 の方が回答としてふさわしいかと
830デフォルトの名無しさん:2008/07/29(火) 23:12:39
>>822
俺は Ruby は Thomas+Hunt の Pragmatic Programmer's Guide から入った。
これは波長があったんですんなり使い始められた。

日本語訳「達人プログラマーガイド」もあるけど訳の質は知らん。
題は誤訳に近いと思うから不安を感じるが。

「たのしい Ruby」なんかも良さそうだけど。

OOP って何を勉強したいの?OOP と言っても上段に構えるものじゃなくて
プログラミングをしていて、そのうちなるほどってわかるものだと思うけど。
逆に手動かさなきゃわからない。あまり概念にとらわれず coding した方が良いと思う。

831デフォルトの名無しさん:2008/07/29(火) 23:51:50
せっかくみんなスルーしてたのに

>>822
Rubyはオブジェクト指向の学習には向かない(そう、Javaのように)
832デフォルトの名無しさん:2008/07/29(火) 23:54:29
オブジェクト指向ってプログラミングの実際とは対極に位置してるよな
833デフォルトの名無しさん:2008/07/29(火) 23:56:56
プログラム言語を作るときには便利らしいぞ>オブジェクト指向

Rubyで身につくのはRubyプログラミングで有効なテクニックだけだよね
834デフォルトの名無しさん:2008/07/30(水) 00:21:46
>>822
rubyだとダッグタイピング指向を推奨する人が多いので、
OOP自体の勉強するには向かないかな。

C++か、Javaのほうが、
OOP指向の本が沢山あるはずだから
有り難みを感じられると思う。
835821:2008/07/30(水) 03:55:52
>>824
ありがとうございました。なんとかできそうです
836デフォルトの名無しさん:2008/07/30(水) 07:35:53
>>834
>rubyだとダッグタイピング指向を推奨する人が多いので、
>OOP自体の勉強するには向かないかな。

なんでや? ダックタイピングこそオブジェクト指向的ではないか。
型にとらわれず、メッセージを送るのが本来のオブジェクト指向的だと思うけど。
837デフォルトの名無しさん:2008/07/30(水) 07:42:49
>>822
書籍見るよりも、自分でプログラム書いたり
人の書いたソースコードを読んだ方が早いと思う

書籍の中で良さそうなのは、>>830で挙げられてるものに加えて
「オブジェクト指向スクリプト言語Ruby」もお勧め。ただし値段が高い&内容が古い

>>832
んなこたねーよ
小規模なプログラムだって、オブジェクト指向使うだけでだいぶすっきりすることが多い
少なくとも「実際のプログラムの対極」なんてことはありえない
「自分の環境ではオブジェクト指向なんて使えない」というのであれば、その辺もっと詳しく
838デフォルトの名無しさん:2008/07/30(水) 07:42:55
オフィスのエアコンが壊れて汗ダックタイピングなんですがどうしたらいいですか?
839デフォルトの名無しさん:2008/07/30(水) 08:05:22
railsに限らないけどフレームワークの類を使ってると
自分がオブジェクト指向プログラミングを「させられている」事に
気が付かないんだろうね
フレームワークの自動生成したクラスにメソッド記述するだけだから
840デフォルトの名無しさん:2008/07/30(水) 10:27:05
今わかったが>>838はだじゃれ
841デフォルトの名無しさん:2008/07/30(水) 10:45:19
ユーザー名とパスワード(と必要なデータ1個)を受け取って
Webサイトにログインしてクッキーを返す、みたいなメソッドを作ります

def login(data, param, _pass = nil)
if param.is_a?(Hash) then
username = param[:user]||param[:username]||param['user']||param['username']
password = param[:pass]||param[:password]||param['pass']||param['password']
else
username = param
password = _pass
end
raise 'ユーザー名またはパスワードの指定が不正です' unless username && password
...

と書いたんだけど、処理の書き方がややアホっぽいです
「login(data, {:username => ユーザー名, :password => パスワード}) 以外の形は受け付けませんバーカバーカ」
とマニュアルに書いてもいいんですが、未来の自分があまり信頼できないので、練習も込めてできれば
login(data, {:user => ユーザー名, :pass => パスワード})
login(data, ユーザー名, パスワード)
みたいなよくある形式にも対応してみたいです
842デフォルトの名無しさん:2008/07/30(水) 11:05:05
どこで覚えたか知らんがそれが妥当だ
そこであまりテクニカルにしても却って読みづらい
多少冗長でもそれくらいにしておいてくれると助かる

しかしキーワード引数風のハッシュって流行ってるなあ
843デフォルトの名無しさん:2008/07/30(水) 12:26:20
たかがメソッド呼び出しでハッシュオブジェクトが毎回作られるのが気に入らない

そんな内部で頻繁に使用されるメソッドにハッシュ引数なんていらねーだろというのはまあその通りだが(w
844デフォルトの名無しさん:2008/07/30(水) 19:26:01
良い子のみんなはキーワード引数をできるだけ使わないようにしようね!
いやマジで
845デフォルトの名無しさん:2008/07/30(水) 19:28:02
Perlではもう常套手段だけどね。メソッド内部の書き方はともかく、APIとしては。
846デフォルトの名無しさん:2008/07/30(水) 19:52:57
外部提供するメソッドで使われる潮流は止められないだろうな
引数の解説したマニュアルも平均してわかりにくいしな
847デフォルトの名無しさん:2008/07/30(水) 20:27:28
重いアロケーションはは最初だけで、以降は書きかえだけにするとかC書いてたときはよくつかってた
rubyのこういう例でも同じようにinithialized?とか用意したら
何とかできるんじゃないかな?とか素人の意見ですがどうでしょう?
848デフォルトの名無しさん:2008/07/30(水) 20:38:53
だめです
849デフォルトの名無しさん:2008/07/30(水) 21:03:37
C++いきなりなんてのは、コンパイラのエラーとれなくて厳しすぎる。
いや、俺のような老人だと、Fortran=>C=>C++
ときたんだけど、大規模C++でメモリリークとったりするのにかなり苦労した。
いまみたいにリーク検出してくれるアプリなかったしな。sed, awkでDelete漏れないか
しらべまくるくらいだったわ。
850デフォルトの名無しさん:2008/07/30(水) 21:05:18
どこからの誤爆?www
851デフォルトの名無しさん:2008/07/30(水) 21:44:54
俺は、CORBAがらみの大規模で地獄みた口だな。舐めるようにソースみてもエラーの原因わかんねええええ
っていう地獄。
C++の暗黒にはもうもどりたくないぜ。。。
852デフォルトの名無しさん:2008/07/31(木) 00:02:06
++の暗黒面を見たのか
アナキン君
853デフォルトの名無しさん:2008/07/31(木) 00:52:40
>>844
>良い子のみんなはキーワード引数をできるだけ使わないようにしようね!
>いやマジで

なんで?
854デフォルトの名無しさん:2008/07/31(木) 01:02:19
キーワード引数が役に立つのって引数が大量にあるようなメソッドでしょ?
そういうのって設計がおかしいのがほとんど
他にDSLを作るのに役に立つけど、そんなの玄人でも自分で作る人は少ない
855デフォルトの名無しさん:2008/07/31(木) 01:23:04
キーワード引数を使うのはお客さま用総合メソッドなことが多いな
たくさんメソッドを提供しても仕方あんめー、みたいな感じ
856デフォルトの名無しさん:2008/07/31(木) 01:51:05
そすね。パラメーターが少ない場合でも、
変な意味でユーザーフレンドリーな関数作ろうと思うと名前付き引数使おうとする
使いたてのうちは覚えやすくていいけど、だんだんその冗長さにイライラしてくる

最近名前付き引数がデフォの言語作って、保守する度にその時の自分の設計を呪っている
857デフォルトの名無しさん:2008/07/31(木) 02:13:05
{:url => login_uri } って、そりゃ変数見りゃ URL だってわかるわぼけー、みたいな感じ
しかも URI オブジェクト使ってるもんだからうっかり {:uri => login_uri } とか書いて動かない
858デフォルトの名無しさん:2008/07/31(木) 02:26:39
html tagの属性を指定するとかはキーワード引数でないと
メソッド増え過ぎで破綻しない?

ああいう時は、こういう手があるのかと感心したんだが
それも設計がおかしいんだろうか
859デフォルトの名無しさん:2008/07/31(木) 02:26:43
どうでもいいッス
860デフォルトの名無しさん:2008/07/31(木) 07:33:39
>>858
そういうときはハッシュで正解だと思う
htmlの属性は、多くの種類の名前(ほぼ無限)をとりうるわけだから
引数の数が限られている通常のキーワード引数とは質が違うし
ハッシュを使わないとどうにもならない

というか、たぶんそれは「キーワード引数」とは呼ばない
861デフォルトの名無しさん:2008/08/01(金) 10:30:41
Array#size とかあるよね
ああいうのって毎回数えてる?
内部的に

def size
c = 0
self.each{ c +=1 }
return c
end

とかいうような処理だったりする?
862デフォルトの名無しさん:2008/08/01(金) 10:52:50
さすがにオブジェクトの状態変化に応じてキャッシュはしてると思う
863デフォルトの名無しさん:2008/08/01(金) 11:04:50
確かめてはいないが、さすがにその実装は無いと思う
864デフォルトの名無しさん:2008/08/01(金) 11:09:28
ruby1.9のソースをみるとsizeはlengthへのエイリアスで
lengthは内部に保持されてる長さの値を返すだけだった
キャストとかビットシフトぐらいはしてたけど
関数呼び出しはrb_int2inumぐらいかな
まぁ毎回数えるってことはない
865デフォルトの名無しさん:2008/08/01(金) 11:19:17
どっちがお得か議論ってあまりRubyでは聞かないよね
変数を含まない固定の正規表現は変数に代入するよりそのまま書いてたほうが効率はいいんだっけ?
866864:2008/08/01(金) 11:20:26
Cの上では可変長配列だから長さが変わる処理がされる度に差分が処理されてる
ary<<objの度に+1されて
ary_a+ary_bだとary_bの長さだけ<<が呼ばれるような感じ
で長さが変わる処理の前後で正しい長さを保持するのは保障されてるから
size(length)で参照するときはその保持している値を返すだけでおkと
CAPAとかあったからC++で言ったらvectorみたいなものかな?
867デフォルトの名無しさん:2008/08/01(金) 11:21:58
よーわからんが

arr.each do |line|
data << line if /hogehogehoge/ =~ line
end

にするか

re = /hogehogehoge/
arr.each do |line|
data << line if re =~ line
end

にするかって話?
868デフォルトの名無しさん:2008/08/01(金) 11:25:28
>>866
> ary<<objの度に+1
うん、そんな賢い感じのイメージでいいと思う
Cレベルではあまり潔癖なことはしてない印象

>>867
前者のほうがわずかに速いとか聞いた
869デフォルトの名無しさん:2008/08/01(金) 11:29:16
>>865
アカデミックな興味はあるかも知れんが、そういうレベルの効率を
気にする状況ではあまり Ruby なんて使わないんじゃない?

自分で coding しやすい方を選ぶだけでは。少なくとも俺はそうする。
870デフォルトの名無しさん:2008/08/01(金) 11:37:31
ものすごく違うとか、ファイルやメモリのアクセス頻度が変わるとかなら興味ある
ハッシュのキーはシンボルにすると速いんだぜ~というレベルの話なら興味ない
871デフォルトの名無しさん:2008/08/01(金) 11:42:48
ブロック外の変数を参照すると外部のオブジェクトのリストも辿っていく必要があるからじゃないのかな
ブロック内の埋め込みの値ってそのブロック内だけの木辿れば参照できるし
ループ回数が多くなってくるとその差*ループ回数分の差がでてくるのは予想できる
でも大した差はでないでしょう
872デフォルトの名無しさん:2008/08/01(金) 11:48:34
なーなー、PStore の

 ・ 存在しないキーを参照したら nil
 ・ 存在しないファイルを指定しても nil

という変な仕様に文句を言うやつはおらんかったんか?
873デフォルトの名無しさん:2008/08/01(金) 11:52:16
なぜに?
874デフォルトの名無しさん:2008/08/01(金) 12:08:48
どの辺が「変な仕様」なのか詳しく
875デフォルトの名無しさん:2008/08/01(金) 12:21:43
ファイルが存在しないなら ENOENT 投げて欲しいんだろ
21世紀にもなってユーザーレベルで goto 文の変種使って喜んでる奴は臭いから寄るな
876デフォルトの名無しさん:2008/08/01(金) 14:52:09
まずは>>872が思う「まっとうな仕様」を聞かせてもらおうか。

ちなみに>>872の前者はPStore#fetchを使えばいい。
PStoreはHashに合わせているから連想しやすいと思う。
877デフォルトの名無しさん:2008/08/01(金) 15:16:49
pstoreを使う方が間違い
MatzはCとelispが大好きなオールドハッカーだから、そういう仕様なんだろう。

仕様が文書化されてない永続化形式は使っちゃダメ。
YamlとかXMLとか使っときなさい。それが嫌ならplain textのほうがまだマシ
878デフォルトの名無しさん:2008/08/01(金) 15:59:24
仕様が文書化されてない!出た!非文書化出た!得意技!仕様の話出た!仕様なし!これ!使用文書化なし出たよ~~!
879デフォルトの名無しさん:2008/08/01(金) 16:18:17
>>877
話題がズレてるぞ
>>873の言ってるのはあくまで「PStoreの」仕様であって、Marshalの仕様ではない
880デフォルトの名無しさん:2008/08/01(金) 16:38:30
>>877
Marshalのフォーマットは文書化されていると思うけど。
ttp://www.ruby-lang.org/ja/man/html/Marshal_A5D5A5A9A1BCA5DEA5C3A5C8.html
…という話ではない?
881デフォルトの名無しさん:2008/08/01(金) 17:30:36
「emptyではない」という長文の比較条件を読みやすく書く方法ないかなあ

if !hoge.data.hage.pick.result.empty? then ...

みたいに長いとの先頭の ! が微妙に読み下しにくい

if hoge.data.hage.pick.result.empty? == false then ...

if !hoge.data.hage.pick.result != [] then ...
はどっちがいいかな
882デフォルトの名無しさん:2008/08/01(金) 17:36:24
unless hoge.data.hage.pick.result.empty?
883デフォルトの名無しさん:2008/08/01(金) 17:37:11
それとthenてつける人いるのか・・・
884デフォルトの名無しさん:2008/08/01(金) 17:39:40
>>881
前者と後者で処理が微妙に違うのが気になる。
また、素直に日本語的な語順で「emptyではない」と書きたいなら

if hoge.data.hage.pick.result.empty? != true then ...

じゃない?どうやればあなたが読みやすいのかは知らないけど
885デフォルトの名無しさん:2008/08/01(金) 17:50:28
>>882のunlessか、もしくはnotでいいんじゃない?

if not hoge.data.hage.pick.result.empty? then ...
886デフォルトの名無しさん:2008/08/01(金) 17:52:05
unless だな
elsif のとこに入れられないのが難点か
887デフォルトの名無しさん:2008/08/01(金) 18:22:27
unlessだな。
俺もthenは書きたい派
英語みたいに読み下せるからね
888デフォルトの名無しさん:2008/08/02(土) 00:34:34
ActiveSupportのblank? は便利だが逆が欲しいと常々思っていたのだが、
最近は blank? の逆の present? というメソッドも出来たらしい。
889デフォルトの名無しさん:2008/08/02(土) 01:08:25
すみません、rubydbを使用したいのですが、

=> require 'fileutils'
p "hoge"

なんてソースでnextで
p "hoge"に進みたいのですが、
fileutilsのソースに入ってしまいます。

これって仕方ないのでしょうか?
890デフォルトの名無しさん:2008/08/02(土) 01:20:30
>>889
fileutilsの中身が表示されるけど、次のnではfileutilsを1行ずつ追わずに
p "hoge"の行に来るんじゃない?
891デフォルトの名無しさん:2008/08/02(土) 03:00:58
CGI::Sessionのことで質問なのですが、通常通りセッションを生成して、
次にsession['hoge']を呼び出したり
session['hoge'] = "xxx"とするとエラーになってしまいます。
内容はメソッド[]がない、メソッド[]=がない、というNoMethodErrorです。

環境が少し古く1.8.1なので、書き方が違うのかと思ったんですが
それらしき情報が見あたりません(1.8.7環境では動作しています)
理由のわかる方いますか?
892891:2008/08/02(土) 03:02:12
追記
session.session_idのようなクラスメソッドは大丈夫です。
893デフォルトの名無しさん:2008/08/02(土) 03:33:55
ていうか、その1.8.1は外部に公開するんじゃないだろうな?
パッチあててなくて、セキュリティホール空きまくりとかだったら、答えるに答えられん
894デフォルトの名無しさん:2008/08/02(土) 04:33:04
session.rb に [] が定義されてないなら使えないんじゃね
895デフォルトの名無しさん:2008/08/02(土) 04:51:21
俺も then は意図的に書く
まー確かに若干面倒ではあるんだが
896デフォルトの名無しさん:2008/08/02(土) 05:42:52
>>875
例外頼りのプログラミングってなんか格好悪いよな
1990年代って感じだ
897デフォルトの名無しさん:2008/08/02(土) 07:16:41
>>891
書き方が違うはずはない(実際、俺は1.8.1でCGI::Sessionを使ったことがある)
おそらく他の箇所に、何かバージョン非互換の書き方があるのだと思われる
これ以上はソースコード見ないと分からん

>>893
レンタルサーバーなら1.8.1が入ってるとかよくある話だよ
898デフォルトの名無しさん:2008/08/02(土) 10:52:15
>>854
>キーワード引数が役に立つのって引数が大量にあるようなメソッドでしょ?
>そういうのって設計がおかしいのがほとんど

そうなの?
たとえば Rails では ActiveRecord#find とか、あとは render とかもキーワード引数を使いまくっているけど
これって設計がおかしいのかな。
>>854だったらどう設計しなおすの?
899デフォルトの名無しさん:2008/08/02(土) 10:57:18
Railsのそういうとこは参考にしたらいかんぞ
900デフォルトの名無しさん:2008/08/02(土) 11:13:12
いちばん妥当なのはデータ用クラスを作ることだろうな
Net::HTTPの返り値がNet::HTTPResponseであるように
あれが {:header=> {...}, :body=>"....", :code=>xxx, ...} というハッシュで返ってきてたらうざい
901デフォルトの名無しさん:2008/08/02(土) 11:58:03
Rubyにはキーワード引数がなくて単なるハッシュをそれっぽく見せてる
っていう問題があるからなあ。
なるべくならちゃんとRuby世界で意味のあるメソッドとかにしようぜ
902デフォルトの名無しさん:2008/08/02(土) 12:02:37
↓ここで満を持してStruct厨が登場!
903デフォルトの名無しさん:2008/08/02(土) 12:11:06
Structはなにやら便利っぽいが最初の指定が小難しくて憶え切れない

というか、Rubyの世界にやってきたJava概念でーすみたいな雰囲気が気に食わない
904デフォルトの名無しさん:2008/08/02(土) 12:47:24
キーワード引数という言語機能は、エレガントにデザインするのがとても難しい。
あえて「手を出さない」というのもひとつの正解。
905デフォルトの名無しさん:2008/08/02(土) 13:39:47
>>899
> Railsのそういうとこは参考にしたらいかんぞ
だから、find や render はどういう設計にすべきだったわけ?
それを示してもらわないと、キーワード引数を使わないようにしたくても
どう設計したらいいかわからない。

>>900
>Net::HTTPの返り値がNet::HTTPResponseであるように
今は引数の話をしているんであって、返り値の話をしているんじゃない。
906デフォルトの名無しさん:2008/08/02(土) 14:30:22
>>905
何が引っ掛かってるのか分からんが、引数も返り値も同じ話だ
データ用のクラス作ればいいのは変わらない
907デフォルトの名無しさん:2008/08/02(土) 14:35:36
fluent interfaceとか
908デフォルトの名無しさん:2008/08/02(土) 17:14:40
外部ライブラリのメソッド定義の30行目くらい(つまり、そのクラスとメソッドを上書きするのは面倒)に、

obj = Hoge.new(param1, param2)

という処理があります。
んで、param1 の内容で
「Hogeを継承して改造したHogeA」「同じくHogeB」「元のHoge」
の3つに分岐させたいです。
obj.class の値を利用することはありません。とにかくクラスの動作を切り替えたいです。

ほんとは
obj = Hoge.hogechanger(param1,param2)
と書き換えて
def Hoge.hogechanger(param1, param2)
case param1
when patternA return HogeA.new(param1,param2)
when patternB return HogeB.new(param1,param2)
else return Hoge.new(param1,param2)
end
end
とかすれば一発なんですが、できればこれはやりたくありません。
909891:2008/08/02(土) 17:15:44
>>893-894 >>897
ありがとうございます。参考に調べていったところ、解決できました。
まずかった箇所は、CGI::Sessionとは直接関係ない部分のミスから
結果的にCGI::Sessionのエラーのように見えていた、といった感じでした(言葉足らずですが・・)

セキュリティホールの情報についてもたいへん参考になりました。
いくつかチェックしたところ、パッチは当たってないようなんですが、
商用や個人情報を扱うようなプログラム(セッション)ではないこともあり
スクリプト側で解決できる部分をできるだけカスタマイズして対応してみようと思います。
ありがとうございました。
910デフォルトの名無しさん:2008/08/02(土) 19:36:33
>>908
class Hoge
 class << self ; alias super_new new ; end
 def self.new(p1,p2)
  return self.super_new(p1,p2) if self != Hoge
  case p1
  when patA then return HogeA.new(p1,p2)
  when patB then return HogeB.new(p1,p2)
  else return Hoge.super_new(p1,p2)
  end
 end
end

こんなやり方もあるけど最後の手段て感じだな
ライブラリ側でHoge.newが書き換えられてたら動作しないだろうし
そのライブラリを良く読めば、別の場所で何とかできる方法が見付かるかも
911デフォルトの名無しさん:2008/08/02(土) 21:33:36
>>908
>obj.class の値を利用することはありません。
ならこういうのは?
class Hoge
 module HogeA; ~; end
 module HogeB; ~; end
 def initialize(p1,p2)
  case p1
  when patA then extend HogeA
  when patB then extend HogeB
  end
 end
end
912デフォルトの名無しさん:2008/08/02(土) 23:54:59
>>906
>何が引っ掛かってるのか分からんが、引数も返り値も同じ話だ
なんで引数と返り値が一緒なのかわからんから、教えてくれ。
ぐぐってもそんな話はでてこなかった。
返り値にキーワードつけるというのからしてわからん。
あと、いいかげん具体例を示してくれよ。データ用のクラスを作ればいいってだけじゃわかるかよ。
こっちはRailsの設計を参考にすることが多いから、find や render がどうよくなるのかを知りたいんだよほんとうに。
913デフォルトの名無しさん:2008/08/03(日) 00:31:30
>>912
906じゃないが、Javaやったことないの?
あすこにはデータ用クラスなんて腐る程あると思うぞ
914デフォルトの名無しさん:2008/08/03(日) 00:42:19
>>912
・メソッドの引数が、キーワード引数的なHashだと使いづらい
・メソッドの返り値が、キーワード引数的なHashだと使いづらい
という話
「返り値にキーワードをつける」に関しては、>>900にそのものズバリな具体例があるだろ

データ用クラスの作り方に関しては、webrick関連のマニュアルや記事読め
(とくにWEBrick::Request、WEBrick::Responseの周り)
Railsの設計は知らないから他の人に任せる
915デフォルトの名無しさん:2008/08/03(日) 00:44:08
わざわざ引数に渡すためだけの専用のクラス作るなんて(Rubyでは)愚の骨頂
Hash使え
916デフォルトの名無しさん:2008/08/03(日) 00:49:06
Javaがまんど臭くてRuby使ってる俺は、
Hashでいいと思う
クラス作ったら仕様考えるのが面倒
Hashなら適当でいい。
だが、何かを犠牲にしてるような気も
917デフォルトの名無しさん:2008/08/03(日) 00:55:41
>>915
引数に渡すためだけにHashクラスのインスタンスを作ることについて一言
918916:2008/08/03(日) 00:56:51
俺は気にしないな
性能気にするなら別の言語使うし
919デフォルトの名無しさん:2008/08/03(日) 00:58:13
>>917
引数に渡すためだけにデータ用のクラスのインスタンスを作ることについて一言
920デフォルトの名無しさん:2008/08/03(日) 01:02:53
データ用インスタンス作るのもnewメソッド呼ぶわけじゃん
そのときの引数はどうするの
921デフォルトの名無しさん:2008/08/03(日) 01:11:09
>>919-920
その設問には意味がない
スクリプト中でHashのインスタンスを数十個作るのも自作データクラスのインスタンス数十個作るのも
実コスト的にはほとんど変わらないだろ
自作データクラスを使わないのなら、ハッシュも使わないというのが一貫した態度だと思わない?
922デフォルトの名無しさん:2008/08/03(日) 01:14:57
引数に渡すためだけにデータ用のクラス定義をコーディングすることについて一言
923916:2008/08/03(日) 01:19:31
面胴
924デフォルトの名無しさん:2008/08/03(日) 01:27:53
>>920 の言いたいのはパホーマンスの件ではなく
キーワード引数(っぽいハッシュ)の対案としてデータ受け渡し用のクラスを作れって話だが
そもそもそのクラスに変数をどうやってセットするのさ?
という事だと思う
925デフォルトの名無しさん:2008/08/03(日) 01:34:27
object allocation during garbage collection phaseってどうやって対処すればいいのでしょかね
926デフォルトの名無しさん:2008/08/03(日) 01:37:33
HogeTable.find :all, :conditions=>"name='foo'", :order=>"created_at", :limit=>100
------
option=FindOption.new
option.conditions="name='foo'"
option.order=>"created_at"
option.limit=100
HogeTable.find :all, option
------
HogeTable.find :all, FindOption.new.conditions("name='foo'").order("created_at").limit(100)
------

どれが分かりやすくて憶えることが少ないかという問題でしょう
927デフォルトの名無しさん:2008/08/03(日) 01:40:31
ん?

wwwget(:url => 'http://~', :header => ['Accept-Language','ja-jp'], redirect => true)

の代わりに

req = WWWRequest.new
req.url = 'http://~'
req.header = ['Accept-Language','ja-jp']
req.redirect = true
wwwget(req)

とか

wwwget(WWWRequest.new{|r|
r.url = 'http://~'
r.header = ['Accept-Language','ja-jp']
r.redirect = true
}
)

とかしようってことだろ?

ってめんどくさいなオイ
928デフォルトの名無しさん:2008/08/03(日) 01:45:30
引数にHashを使うと、スペルミスがあっても例外を出してくれないのが困る
929デフォルトの名無しさん:2008/08/03(日) 01:50:19
>>925
1.9ならrb_during_gc()でどうですか。
1.8ならアルゴリズム見直すしか思いつきません悪しからず。
930デフォルトの名無しさん:2008/08/03(日) 01:52:06
それはそうだな。
まあRubyでスペルミスで例外出すように書いたことないけど
931デフォルトの名無しさん:2008/08/03(日) 01:58:17
>>926
ああ、なるほど…。3番目の例は思いつかなかったな。
キーワード引数もどきよりは、使いやすそうですね。
932デフォルトの名無しさん:2008/08/03(日) 02:10:31
>>927
下のnewにブロックを渡せるデータクラスはgemで時々見るな
933デフォルトの名無しさん:2008/08/03(日) 02:25:03
blockのはありかな
934デフォルトの名無しさん:2008/08/03(日) 05:27:12
引数用のクラスを作ろうってのはよく、リファクタリング系の書籍なんかにも書いてあるけど、
あれはHashがリテラルでかけない言語用の話だからな。
まあ、とはいえ、スペルミスすんのも痛いから、>>927の一番したのもおもしろいね。

>>926の最後の例は、C++とかで見たことがあったような気がする(boostあたり?)、
何か使っているライブラリとかってあったけ?
935デフォルトの名無しさん:2008/08/03(日) 11:04:28
>>911
それ、Hoge.new(patA,p2) をしたあとに Hoge.new(patB,p2) がくると
HogeA と HogeB のメソッドがある Hoge クラスになったりしないかね
936デフォルトの名無しさん:2008/08/03(日) 14:14:51
>>935
なぜ、自分で試してみないの?
937デフォルトの名無しさん:2008/08/03(日) 18:51:30
例外処理について質問です

begin
 #ここでuriを開いてhtml取得
rescue
 sleep 10
 retry
end

上記のような、あるURLのHTMLを取得するプログラムがあります。
もしデータが取得できなかった場合には例外処理の10秒待ってからretryで再取得しています。
これだと、もし相手のデータが取得できない場合永遠とretryし続けてしまうのですが、こういった場合のループを抜ける方法はあるのでしょうか?

breakは使えないようなので困っています
938デフォルトの名無しさん:2008/08/03(日) 18:53:55
>>937
retryって条件式指定できたよね
回数チェックでもさせればいいんじゃね
939デフォルトの名無しさん:2008/08/03(日) 19:16:27
>>937
標準のtimeoutライブラリは?
940デフォルトの名無しさん:2008/08/03(日) 19:20:09
> retryって条件式指定できたよね
初耳ニャ…

>>937
Ruby に retry_once とかあればよかったんだけど

uris.each do |uri|
retried = false
begin
  #ここでuriを開いてhtml取得
rescue
  sleep 10
  (retried = true; retry) if retried
end
end

こんな感じ?
941デフォルトの名無しさん:2008/08/03(日) 19:48:56
>>940
ごめん。
逆だね。if文の実行側にretryだ
942デフォルトの名無しさん:2008/08/03(日) 22:45:06
breakが使えないのはLocalJumpErrorになるからなので、
begin~end以外のブロックまたはメソッドでくるめばいいと思うな。
loop do
begin
# ...
break
rescue
retry
end
end
とか
943デフォルトの名無しさん:2008/08/03(日) 22:48:29
ageた上にインデントのこと忘れてたorz
ごめんsage
944デフォルトの名無しさん:2008/08/04(月) 11:17:07
>>940 は if じゃなく unless だと思う

retry ループ用変数作るのが普通だな
あまりきれいに見えるやり方じゃないけど
945デフォルトの名無しさん:2008/08/04(月) 20:24:04
>>944
「最大何回までリトライ」とかいう一般化は普通だし、
あんまり美しさという点では気にならんかな。
946デフォルトの名無しさん:2008/08/04(月) 20:51:37
ループ回数はデフォルトで覚えててくれると便利かな~という気はする

begin
web_access
rescue
sleep 5
retry(:max => 3)
end

こんな感じ
retry_once は retry(:max => 1) のエイリアス
繰り返す回数なんて管理したくないじゃん?
947デフォルトの名無しさん:2008/08/04(月) 21:06:36
>>914
>「返り値にキーワードをつける」に関しては、>>900にそのものズバリな具体例があるだろ
あーわかった。さんくす。そういうことか。
キーワード引数の話をしているのに、説明もなしに返り値の話をしだした900がバカで混乱のもとだったわけだ。

>データ用クラスの作り方に関しては、webrick関連のマニュアルや記事読め
>(とくにWEBrick::Request、WEBrick::Responseの周り)

ソース読んだけど、これがどう参考になるの? ここで出しているんだから、この2つのクラスはキーワード引数と対比できるんだよね?
でも見たところ、WEBRick::HTTPRequestもWEBRick::HTTPResponseも、ごくごく普通のクラスで、キーワード引数とどう対応するのかわからない。
ほんとにわかんないので、おしえてください。この2つのクラスをキーワード引数を使ったメソッドに変換して、そしてキーワード引数使うと何がどうまずいのか教えてください。

>Railsの設計は知らないから他の人に任せる

そんなのfind()とrender()のマニュアルみれば済む話じゃん・・・「Rails render」でぐぐれば一発。
じゃあ render() を 簡略化して考えてみよう。render()が
render(:template=>"weblog/show", :partial=>"person", :text=>"hello world!")
というメソッドだったとして、これもrender()専用に
class RenderOption
attr_accessor :template, :partial, :text
end
というクラスを定義しろということ? これを、キーワード引数をつかうメソッドごとに専用のクラスを用意しろと?
948デフォルトの名無しさん:2008/08/04(月) 21:09:55
うおー夏だー
誰もお前なんか覚えちゃいねーっつーの
949デフォルトの名無しさん:2008/08/04(月) 21:17:47
>>926
この3番目の方法ってよさそうにみえるけど、conditions()やorder()やlimit()がselfを返すってこと?
あと attr_accessor :conditions, :order, :limit とかぶってしまうけど、そのへんはどうするの?

>>927
最後のやつは、こういうのはどうだろう?
wwwget(arg) do |r|
r.url = 'http://...'
r.header = ['Acceptt-Language', 'ja-jp']
r.redirect = true
end
つまり wwwget() のなかで、block_given? が true なら r = WWWRequest.new; yield(r) する。
でもまあ、あんまり利点はないな。

キーワード引数のかわりにクラス定義するなら、>>926の3番目のやつがよさそうだなあ。
でもこういうのって初めて見たけど、けっこう知られているの? これ使っているライブラリとかある?
950デフォルトの名無しさん:2008/08/04(月) 21:20:56
>>948
うむ
それには大いに全面的賛同はする

>>926のメソッドチェーンのタイプはどっかのgemで見たんだがどこだったかなあ
951デフォルトの名無しさん:2008/08/04(月) 21:47:59
>>947
自分に理解できない解説をした人をバカ呼ばわりする初心者に教えることはないので
あとは自分で考えてください
952デフォルトの名無しさん:2008/08/04(月) 23:24:40
「あるクラスの配列」にメソッドをつけるRubyらしい良い方法ってありませんか?
例えば、数値の配列に対して平均値を求めるメソッドを定義したいとします。

解1
def avr(ary); ary.inject(0){|r,v|r+v}.quo(ary.length); end
って作ってもいいのですが、このメソッドを配置する場所がどこでもよくて格好よくない。

解2
class Array
 def avr; self.inject(0){|r,v|r+v}.quo(self.length); end
end
自分がやりたいのはこんな雰囲気ですが、
quoなんてダックタイピングしづらいメソッドを含んでるのであまりやりたくない。

解3
class NumericArray < Array
 def avr; self.inject(0){|r,v|r+v}.quo(self.length); end
end
これはないだろ、と思いましたが念のためやってみたら中途半端にいい。
tmp = NumericArray.new.push(1,2,3,4,5,6,7,8,9,10)
p tmp.avr
p tmp[0..4].avr
p tmp.map{|v|v+1}.avr
2つ目まで良かったんですが、最後の行でエラーが出るのでやっぱり挫折。
953デフォルトの名無しさん:2008/08/04(月) 23:26:33
解4
class Array
 def to_numeric_array
  def self.avr; self.inject(0){|r,v|r+v}.quo(self.length); end
 end
end
tmp = [1,2,3,4,5,6,7,8,9,10]
tmp.to_numeric_array
p tmp.avr
インスタンスを作るごとに一手間めんどいのが難点。

皆さんに、俺ならこうするを聞きたいです。
954デフォルトの名無しさん:2008/08/04(月) 23:33:21
> 数値の配列に対して平均値を求めるメソッド
Array クラスに「あるべきではない」ので、1が答っすかね
self から平均値を計算して返すというのは気持ち悪い
引数でいいじゃん引数で
955デフォルトの名無しさん:2008/08/04(月) 23:39:18
「すうじのはいったはいれつ」でないと値が不正になるわけだから、
Array を継承かなにかしたクラスを新設すべきと考える
…が、sum メソッドくらいかなあ
算術平均なら Math クラスにくっつけるかもしれない
あるいは NumericArray クラスの特異メソッドにするかも
956デフォルトの名無しさん:2008/08/04(月) 23:45:14
「あるクラスの配列」というのがよくわからん
実際は Hoge#data の返り値が配列で、その平均をメソッドチェーンで取得したいとかそんなとこか?
957953:2008/08/04(月) 23:52:01
>>956
わかりやすいため数値にしてますが、
本当は自分で作ったFooオブジェクトの配列なんです。

だからといって
module FooUtil; ... ; end
なんてのもJava臭くて嫌だなあと思うわけです。
958デフォルトの名無しさん:2008/08/04(月) 23:57:00
言葉を正確に使えない子は没落するぞ

・Arrayを継承したクラスFooである
・クラスFooの属性(インスタンス変数等)にArrayが入ってる

どっちよ
959デフォルトの名無しさん:2008/08/05(火) 00:05:36
後者ならave_dataメソッドとか作るだけだし、前者じゃね?

Arrayにメソッド追加するのは気分的にありえないなあ
Arrayを継承したデータクラスを作って

class FooData < Array
def sum; self.inject(0){|r,e| r += e} ;end
def ave; sum.to_f/size; end
end

かな
960デフォルトの名無しさん:2008/08/05(火) 00:06:53
>>958
すいません、日頃からよく言われてますorz
「クラスFooのインスタンスの配列」というものについての話です。
Javaが動的言語だったら ArrayList<Foo> にメソッドをひっつけてやるんだが。という。
961デフォルトの名無しさん:2008/08/05(火) 00:12:41
> クラスFooのインスタンスの配列
余計わかりにくくなったので寝る
962デフォルトの名無しさん:2008/08/05(火) 00:15:57
やっとわかった

foo1 = Foo.new
foo2 = Foo.new
foo3 = Foo.new
foo4 = Foo.new
arr = [foo1, foo2, foo3, foo4]

で、arr に対して平均を取りたいと
Foo は関係ないな
963デフォルトの名無しさん:2008/08/05(火) 00:33:54
どうしても Foo に入れたいなら配列受け取って平均返す特異メソッドにすると思う
Foo の下に Array 継承した Data クラス作るかもしれない
その場合は3だな

俺は1だけど
配列の平均は配列と関係ないと感じる
964デフォルトの名無しさん:2008/08/05(火) 01:44:53
>>949>>950
sequel とかそんな感じかも。っていうか limit だの order_by だのはそのものがある。

texts = TextItem.order_by(:ctime.desc).limit(n)

とか書ける。適当に雰囲気は察してくれ。
965デフォルトの名無しさん:2008/08/05(火) 06:51:50
>>952-953
俺なら解2を少しいじってこうするな

class Array
 def avr; self.inject{|r,v|r+v} / self.length; end
end
966デフォルトの名無しさん:2008/08/05(火) 07:13:08
place = []
File.open("place.csv").each{|line|
place << line.split(",")
}
こうしたeach文で読み込んだfileの行数を数えるのにはどうすばいいですか?
後から
p File.read("place.csv").count("\n")
とやると時間がかかりそうなので配列にいれるときに数えたいのですが
967デフォルトの名無しさん:2008/08/05(火) 08:21:12
place.sizeじゃだめなん?
968966:2008/08/05(火) 08:57:57
>>967
できました!sizeって行にも使えるんですね。
知りませんでした。ありがとうございます。

というか普通に下のようにやれば数えられますね。
すみませんでした。

i=0
place = []
File.open("place.csv").each{|line|
place << line.split(",")
i=i+1
}
969937:2008/08/05(火) 11:50:10
>>937で例外retryについて質問した者です。
以下のようにretry用の変数を使う形で落ち着きました。
皆さんアドバイスありがとうございます!

def get_url
 i = 0 #retryループ用の変数
 begin
  #open_urit処理
  i += 1
 rescue
  sleep 10
  retry if i < 4 #3回まではやり直す
 end
end
970デフォルトの名無しさん:2008/08/05(火) 11:55:24
それだと i が加算されるのは open_uri の処理が正常終了して次の行に移ったときだけだぞ
例外が起きたときの回数を憶えていてほしいわけだから、 i の加算は rescue の中に書く

あと open_uri のタイムアウトは引数なし rescue では捕捉できないから rescue Timeout::Error とか明示的に書いとけ
971デフォルトの名無しさん:2008/08/05(火) 11:58:53
> sizeって行にも使えるんですね
そんなもんはない
単なる配列
ファイルの中の長い1行がびろーんと配列の要素の中に入ってるイメージをしろ
短冊をずらっと吊るすようなもんだ

まあ本当は配列の中には何もモノは入ってないんだけどな
972デフォルトの名無しさん:2008/08/05(火) 12:02:15
あまりにイディオム過ぎて配列とかには見えないんだろうな
気持ちはよくわかる
973966:2008/08/05(火) 20:49:57
>>971
なるほど。
なんとなくfile.sizeだと列数が返ってくるとおもってましたがファイル全体を見るんですもんね。

>まあ本当は配列の中には何もモノは入ってないんだけどな
というのは?ファイルの中身が入っているのでは?
974デフォルトの名無しさん:2008/08/05(火) 20:55:28
>>974
あと十回は提示した・されたコードを読んだ方がいいと思った
975デフォルトの名無しさん:2008/08/05(火) 20:56:15
>>974 アンカミスw >>973です
976デフォルトの名無しさん:2008/08/05(火) 21:17:54
イメージするのも善し悪しだが、
箱が並んで短冊が入っているというイメージよりは、
箱は並んでいるがそこから短冊がぶら下がっているイメージ。
箱の中には短冊を結んだ糸がくっついてる。

977966:2008/08/05(火) 21:42:31
>>974
そうですね。勘違いしてました。すみません
file.sizeじゃなくて配列.sizeですね。
978952-953:2008/08/05(火) 21:44:16
皆さんご意見ありがとう。

やっぱり無難に解1派が多いんですね。
Rubyだと何か面白い定番な書き方があるんじゃないかと期待してみましたが…。

次点で解3系でしょうか、意味的には自然ですし。
ただ、Enumerableのメソッドを使うにあたっていい書き方がないんですよね。
NumericArray.new(tmp.map{|v|v+1}).avr
みたいに書くしかないんでしょうか?
何かいい案があればお願いします。
979デフォルトの名無しさん:2008/08/05(火) 22:01:59
>>978
「平均値を求める」ならふつーavgだろ、てのは置いておいて
平均値は同種の複数の値から求めるものだから対象は配列でいいと思うけど
要素によって平均値の求め方は違うからArrayにもEnumerableにも実装できない

個人的見解では解1、2は問題ないが解3、4はありえない
解1は無問題
解2は要素が異なれば例外が発生するので問題なし(これがダックタイピングだろ?)
解3の問題点
3.1 Fooの様なクラスを定義する度にArrayのサブクラスを作るなんて馬鹿げてる
3.2 Arrayを返すメソッドを全て上書き(サブクラスを返す)しないと期待した動作をしない
解4の問題点
4.1 美しくない。avgを実装したモジュールをextendするほうがマシ
4.2 3.2 と同じ問題

そんなおれが実装するなら Foo.avg(arr)
980デフォルトの名無しさん:2008/08/05(火) 23:28:51
自分しか使わないアプリなら俺の場合こうするかな。

class Array
def avg_by
self.inject(0){|sum,e| sum + yield(e) } / self.length
end
end

p [Foo.new(12), Foo.new(23)].avg_by{|e| e.foo }

他人が使うライブラリだったり吹く数人での開発の場合は >>959 と同じだな。
981デフォルトの名無しさん:2008/08/05(火) 23:32:34
>>980
ところで、yield の引数の括弧をなくすとエラーになるのはなんで?

> ruby -v a.rb
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
a.rb:10: syntax error, unexpected tIDENTIFIER, expecting '}'
self.inject(0){|sum,e| sum + yield e } / self.length
982デフォルトの名無しさん:2008/08/05(火) 23:38:29
>>980
よければ次スレ立ててくれ
>>2以降のテンプレは義務にしないから
983デフォルトの名無しさん:2008/08/06(水) 00:37:10
>>982
おk

>>382 でテンプレのアップデートしようぜって話があるんだが、
>>1 で直すべきとこってある?

1.8.7 に更新しようかと思ったけど、[ruby-dev:35440] でメンテナが
「ぜひ試してみてください」レベルとか行ってて初心者スレで進めていいのか
不安になる。
984デフォルトの名無しさん:2008/08/06(水) 00:40:17
どっちかというと初心者レベルの方が1.8.7は安全だろう。あ、Rails使いは別として。
985デフォルトの名無しさん:2008/08/06(水) 00:47:07
>>949
> これ使っているライブラリとかある?
ActiveRecord 2.1 の named_scope
986デフォルトの名無しさん:2008/08/06(水) 01:15:29
Ruby 初心者スレッド Part 21
http://pc11.2ch.net/test/read.cgi/tech/1217952441/

とりあえず立てといた。
987デフォルトの名無しさん:2008/08/06(水) 06:32:43
>>981
> ところで、yield の引数の括弧をなくすとエラーになるのはなんで?
カッコがない引数は優先順位が低いから、
(sum + yield) e とみなされてしまう。
988デフォルトの名無しさん
>>987
あ、なるほど。サンクス。