Ruby 初心者スレッド Part 20
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2008/06/27(金) 01:35:19【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を読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0002デフォルトの名無しさん
2008/06/27(金) 01:35:55Q:
いちからRubyを始める初心者向けのRuby入門書は何がおすすめでしょうか?
A:
プログラム作成の初心者だったら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
http://www.amazon.co.jp/dp/4797336617/
他の言語経験があるんだったら
「プログラミングRuby 第2版 言語編」
http://www.amazon.co.jp/dp/4274066428/
0003デフォルトの名無しさん
2008/06/27(金) 01:36:42Ruby 初心者スレッド 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/
0004デフォルトの名無しさん
2008/06/27(金) 01:37:14Ruby 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/
0005デフォルトの名無しさん
2008/06/27(金) 01:38:10http://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/
0006デフォルトの名無しさん
2008/06/27(金) 01:38:56Ruby 初心者スレッド Hiki
http://starlet.s145.xrea.com/ruby/hiki/
Ruby Portal
http://ruby.morphball.net/portal/
0007デフォルトの名無しさん
2008/06/28(土) 07:40:53高速化するための方法として、
FastCGI,Mongrel,mod_ruby等ありますが、
Mongrelは、RoRと組み合わせる以外の使い方は資料が少なく敷居が高そうだし、
FastCGIは不安定ということを、ネットでよく目にするし、
mod_rubyは、最終更新日が随分前なので不安があります
何がいいのでしょうか?
0008デフォルトの名無しさん
2008/06/28(土) 08:02:16Rack + Mongrel とか。
0009デフォルトの名無しさん
2008/06/28(土) 22:04:18以下のようなTSVファイルがあったとします。
1 A あ
2 B い
3 A う
一列目、三列目は無視して二列目のアルファベットだけを対象にuniqにしたいんです。
例えば、
1 A あ
2 B い
です。どのようにすればよいでしょうか。
宜しくお願いいたします。
0010デフォルトの名無しさん
2008/06/28(土) 22:18:010011デフォルトの名無しさん
2008/06/28(土) 22:56:43まあメソッド書けばいいんじゃね?だれか採点よろしく
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)
00129
2008/06/28(土) 23:17:20ありがとうございます!!!
自分の技量で書くと、相当複雑で助長になりそうだったので
綺麗な回答を得られて感謝します。
新しく、hashを覚えられて勉強になりました。
0013デフォルトの名無しさん
2008/06/28(土) 23:23:460014デフォルトの名無しさん
2008/06/28(土) 23:34:38まあTAB区切りのカラムがいくつあるかわからない場合は、正規表現部分を
少し変える必要がある、かも?
あと、Hashのvalues()だから、順不同になる可能性もあるのかな?
でも、凄えwww
0015デフォルトの名無しさん
2008/06/28(土) 23:41:330016デフォルトの名無しさん
2008/06/29(日) 02:48:49以下のような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"/>
お手数をおかけしますが、よろしくお願いします。
0017デフォルトの名無しさん
2008/06/29(日) 03:14:44doc = 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
001816
2008/06/29(日) 03:55:02おおお、取得出来ました!
hpricotでもxmlのparseが出来たんですね、知りませんでした...
しかもrexmlより簡単で分かりやすい(汗
本当にありがとうございました!
仰る通りミスです、すみません(汗 < <person id="111"/> <-- ここの / はミスだよね?
0019デフォルトの名無しさん
2008/06/29(日) 14:07:34つXPath
p REXML::XPath.match(doc, "//person[@id=#{id}]/entry")
002017
2008/06/29(日) 14:13:040022デフォルトの名無しさん
2008/06/30(月) 14:37:39Ruby初心者や俺みたいに知識があやふやな人にとっては特にそうだと思う。
0023デフォルトの名無しさん
2008/06/30(月) 15:23:50ファイルを保存するとき先頭に -*- coding: ほにゃらら -*- がついちゃいます.
これを抑制する方法を教えて下さい
0024デフォルトの名無しさん
2008/06/30(月) 15:35:250025デフォルトの名無しさん
2008/06/30(月) 18:17:42自宅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で、これを比較して異なっているために例外が投げられています。
漠然としてまともに質問にもなってないんですが、なんとなく推測できる方いましたらお願いします。
0026デフォルトの名無しさん
2008/06/30(月) 18:40:36ttp://wiki.rubyonrails.org/rails/pages/MySQL+Database+access+problem
002725
2008/06/30(月) 19:26:31ありがとうございます!
エラーメッセージでググったらいろいろ情報があったようです。
その都度違うと思っていた1<>3の部分までお決まりのエラーだったとは・・・
自分の場合Railsではないのですが、多分同じだと思うので
参考にして探ってみようと思いますm(_ _)m
0028デフォルトの名無しさん
2008/06/30(月) 21:43:45XPで動いていたプログラムが、VistaのUACのせいで動かなくて困っています。
多くのシステムファイルを弄るプログラムでは、
管理者権限を得るために昇格ダイアログを出していますが、
これと同じことをRubyで行う方法はどのようなものがありますでしょうか?
0029デフォルトの名無しさん
2008/06/30(月) 21:59:420030デフォルトの名無しさん
2008/06/30(月) 22:46:420031デフォルトの名無しさん
2008/06/30(月) 23:53:021.9以上が普通になったら必要な記述だから、付けたままにして、
意味のあるコード名を書いておくべし。
コード中にASCIIしか使わないっていうなら別だが。
0032デフォルトの名無しさん
2008/07/01(火) 02:02:30あなたのお使いのOSがサポート切られたら同じことが言えますか?
0033デフォルトの名無しさん
2008/07/01(火) 02:13:27Vistaプログラミングの解説でも読むといい
0034デフォルトの名無しさん
2008/07/01(火) 04:31:21ruby 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
何故エラーになるのか、判る人いますか?
0035デフォルトの名無しさん
2008/07/01(火) 05:18:34i が 1 の時(ループの最初回)、未定義の変数 s の値は nil となる
つまり5行目の s=s+"bbb" は s=nil+"bbb" となり # s = nil.+("bbb")
nil に定義されていないメソッド + が呼び出された為に NoMethodError が発生した
0036デフォルトの名無しさん
2008/07/01(火) 05:21:41ところが、この時点でsは未定義
たぶんsがString扱いになって、文字列連結されるのを期待していたんだろうけど
未定義のローカル変数はRubyではniになっちゃう
解決策。RubyにsがStringだってことを教えてやれば良い
s=String.newを書いておくとか
0037デフォルトの名無しさん
2008/07/01(火) 05:31:021.upto(10){|i|
p i
if i%2==1
s="aaa"
p s
else
s=s+"bbb"
p s
end
}
で、とりあえず動きを見てみれ。
このコード全体の前に
s=""
と書いとけば、おそらく望みの挙動をする。
003836
2008/07/01(火) 05:33:360039デフォルトの名無しさん
2008/07/01(火) 06:04:37状況も含めて導き出される結論に対して、
別の状況を設定して「この状況下でも同じなのか?」とか訊いても無意味。
しかもなんか、状況と共に変わる結論は偽の結論だとでも言いたげだし。馬鹿なの?
0040デフォルトの名無しさん
2008/07/01(火) 06:18:080041デフォルトの名無しさん
2008/07/01(火) 06:41:38ttp://pc11.2ch.net/test/read.cgi/tech/1204466626/482
まずRubyはソースコードをパースしてパースツリーを得る
パースツリーを解釈していく段階で代入文が見つかったら
それをRubyは変数の宣言なり定義と解釈する
>>34のコードでは、変数の宣言は代入文で静的に行われている
しかし(実行時に行われる動的な)初期化が行われていないのでsの値はnilになる
ということだろうと思うんだけど間違ってたら指摘してね
004225
2008/07/01(火) 07:55:59このライブラリ(Ruby/MySQL)はもともとMySQL5用で、
MySQL4.1にはパッチで対応されていました。
自宅Winではこのパッチをあてることで動作確認できたため、
そのままアップロードして使おうとしていたのですが、うまくいきませんでいした。
おしえていただいたリンク先の解説やパッチの内容などから、もしやと思い
パッチなしでアップしてみたところ、正常な動作を確認しました。
詳しい理由はあいかわらずわかりませんが、そんなことがあった、ということで一応・・・アセ
0043デフォルトの名無しさん
2008/07/01(火) 08:16:02% 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が作られている。
0044デフォルトの名無しさん
2008/07/01(火) 08:27:29先頭に 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"
0045デフォルトの名無しさん
2008/07/01(火) 08:37:04>>43
0046デフォルトの名無しさん
2008/07/01(火) 08:37:53ありがとうございます。 状況が理解できました。
0047デフォルトの名無しさん
2008/07/01(火) 08:41:04% 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
0048デフォルトの名無しさん
2008/07/01(火) 08:42:50Cなんかと一緒で{}内でスコーピングが閉じるだけ。
{
s = "hogehoge
}
このあとでsが参照されたらそりゃnilが返るっしょ
004934
2008/07/01(火) 08:50:15という挙動が、外部要因(ブロック内外で同じ変数名があるか)で変わって
くるとすると、ブロック外の変数をうっかり削除するとバグ要因になってしまう・・・・?
0050デフォルトの名無しさん
2008/07/01(火) 09:02:54だから「えす」とか「あい」とか「てぃーえむぴー」とか
てきとうなへんすうめいはつかわないほうがいいね
これがわからないならるびーみたいなじょうきゅうしゃようのげんごじゃなくて
ぶいびーとかしょきゅうしゃようのげんごをつかうといいよ
0051デフォルトの名無しさん
2008/07/01(火) 09:16:49基本的にブロック内の変数はブロックで閉じ込められると思えばよろし。
外部に同じ名前があったらそちらを参照するだけ。
わりとわかりやすいから問題になることはない。
ただし、ブロック変数が1.8までは外部に出ちゃうのが問題になった。
1.9からはブロック変数もブロックローカルになった。
0052デフォルトの名無しさん
2008/07/01(火) 09:26:47トップレベルという台にイテレータとかの各ブロックが乗っかってるような3次元的イメージをするとよい
0053デフォルトの名無しさん
2008/07/01(火) 09:30:02ありがとうございます。 なるほど、そう割り切ればすっきりしますね。
実は、ブロック内の変数が毎回作られる、というのはクロージャの作り方と
関係あるんだろうか?と思案していましたので。
> ただし、ブロック変数が1.8までは外部に出ちゃうのが問題になった。
> 1.9からはブロック変数もブロックローカルになった。
以下の結果が1.8と1.9とで違うと解釈しました。
今まで副作用のバグで苦しむことが多かったので、1.9の方が素直に理解出来そうです。
i=100
1.upto(10){|i|
p i
}
p i
0054デフォルトの名無しさん
2008/07/01(火) 09:47:070055デフォルトの名無しさん
2008/07/01(火) 20:37:540056デフォルトの名無しさん
2008/07/01(火) 21:22:320057デフォルトの名無しさん
2008/07/01(火) 22:09:37Linuxで File.read("/proc/#{$$}/statm").split.first.to_i とかできそうだし、
他の環境でもなんかあるんじゃない?
0058デフォルトの名無しさん
2008/07/01(火) 23:20:49自プロセスのサイズを知るのにそんな回りくどい方法をしないといけないんですか?
PHPですら、memory_get_usageで簡単に知ることができるのに・・
0059デフォルトの名無しさん
2008/07/01(火) 23:23:120060デフォルトの名無しさん
2008/07/01(火) 23:37:18なんでPHPにはあるんだろうね
0061デフォルトの名無しさん
2008/07/01(火) 23:40:35resource.getrusage(resource.RUSAGE_SELF) あたりだなぁ。
0062デフォルトの名無しさん
2008/07/01(火) 23:41:240063デフォルトの名無しさん
2008/07/01(火) 23:41:42eval "foo.#{bar}(baz)"とする以外に方法が思い付かなかったのですが
もっと良い方法はありませんか?
0064デフォルトの名無しさん
2008/07/01(火) 23:49:240065デフォルトの名無しさん
2008/07/01(火) 23:50:56$fooが変数、$barがメソッド名、$bazが引数ってことかいな。
foo.__send__(bar, baz)
__send__はsendでもいい
0066デフォルトの名無しさん
2008/07/01(火) 23:51:200067デフォルトの名無しさん
2008/07/02(水) 00:01:05(grep { $_->pid == $$ } @{Proc::ProcessTable->new->table})[0]->size
0068デフォルトの名無しさん
2008/07/02(水) 00:11:38なるほど、__send__を使うんですね!ありがとう!
>$fooが変数、$barがメソッド名、$bazが引数ってことかいな。
その通りです、舌足らずでごめんなさい><
0069デフォルトの名無しさん
2008/07/02(水) 01:11:14これRubyのプロセスがずっと居座って、foreachで回ってるんですよね。
以前、Rubyはずっと居座っていると使用メモリが肥大化していくということを
どこかで読んだ記憶があるのですが、
こういった問題に対してどのような解決法をとるのが普通なのでしょうか?
0070デフォルトの名無しさん
2008/07/02(水) 01:34:15Rubyで書いたXMLRPCを話すdaemonとか稼動させてたけど、
別にプロセスは肥大化しなかったな。
プログラムの書き方によるんでない。
0071デフォルトの名無しさん
2008/07/02(水) 02:29:28使用しているインスタンス変数がわかりやすいので
あった方がいいのではないかとも思うのですが
本に載ってるサンプルには書いてありません
0072デフォルトの名無しさん
2008/07/02(水) 02:31:25教祖の本に書いてある。
0073デフォルトの名無しさん
2008/07/02(水) 02:36:07ありがとうございました
0074デフォルトの名無しさん
2008/07/02(水) 02:44:12私も使い始めですが、確かに一覧性が無いと思いました。
クラスの記述で、インスタンス変数を初期化する処理は、initialize等のメソッド内に書くしか
無いのでしょうか。
0075デフォルトの名無しさん
2008/07/02(水) 02:50:30attr_reader :size (外部から読み取り専用の場合)
attr_accessor :name(読み書き両方)
のようなクラスメソッドを使うと、@size、@nameなどのインスタンス変数が
使えるようになり、size, name, name=などのメソッドで参照や設定ができる
ようになる。
完全非公開の属性で、name=とか定義する必要がないなら、どこかのインスタ
ンスメソッド(代表的なのがinitialize)で使うことで定義される。
0076デフォルトの名無しさん
2008/07/02(水) 02:55:27@hoge||=1
とかで初期化されてないときだけ初期化することは可能
0077デフォルトの名無しさん
2008/07/02(水) 03:58:080078デフォルトの名無しさん
2008/07/02(水) 06:11:16でも書いてるうちに違和感を覚えるようになるよ
自分の書いたメソッドだけ浮いて見えるから
0079デフォルトの名無しさん
2008/07/02(水) 08:49:36Integer(...)とかPathname(...)とかHpricot(...)とか。
0080デフォルトの名無しさん
2008/07/02(水) 13:30:13requireをイテレータの中で読んだらいいと思うのですが
あまりそういうプログラムを見ません
何故でしょうか?
0082デフォルトの名無しさん
2008/07/02(水) 15:40:38#!/usr/local/bin/ruby -Ku
['net/http', 'uri', 'kconv'].each do |lib|
require lib
end
こんな感じ?
まあ、「スクリプト書いててキモチワルイから」だと思う
0083デフォルトの名無しさん
2008/07/02(水) 16:01:30self::HOGE
等でアクセスできないのって不自然じゃないですか?
クラス名をリテラル的に書くと、クラス名を変更した時に書きなおさないといけないので
selfと書けた方がいいと思うのですが…
0084デフォルトの名無しさん
2008/07/02(水) 16:34:17self.class::HOGE
0085デフォルトの名無しさん
2008/07/02(水) 16:41:37「1.9使うような人は自力でバースしたりTMailを自力でインストールして富豪的に使ってね」とかそんな感じ?
008683
2008/07/02(水) 17:27:02ありがとうございました
0087デフォルトの名無しさん
2008/07/02(水) 17:44:51X クラスメソッドの中から、
O インスタンスメソッドの中から、
前者は普通にself::HOGEできます。念のため。
0088デフォルトの名無しさん
2008/07/02(水) 17:45:22String.subをループさせるだけだと
'a' → 'bbbb'
'b' → 'cccc'
の変換を同時に行いたい時に問題が出ますよね
0089デフォルトの名無しさん
2008/07/02(水) 17:51:140090デフォルトの名無しさん
2008/07/02(水) 17:53:21String#gsubとかいう話じゃなくて?
0091デフォルトの名無しさん
2008/07/02(水) 17:57:11subは最初に見つけたとこしか置換しない。多分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] }
0092デフォルトの名無しさん
2008/07/02(水) 18:05:18ありがとうございます
知らない機能ばかりなので順を追って見ていきたいと思います
0093デフォルトの名無しさん
2008/07/02(水) 22:15:31X=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
クラスメソッドの中でモジュールのメソッドや定数を使いたいんだけど
モジュール名を指定しなくてもいい方法ない?
0094デフォルトの名無しさん
2008/07/02(水) 22:21:11たぶんTMail使えってことだろう
0095デフォルトの名無しさん
2008/07/02(水) 22:21:17Bulk 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]
0096デフォルトの名無しさん
2008/07/02(水) 23:01:240097デフォルトの名無しさん
2008/07/02(水) 23:01:57だからそれがどうした。
言いたいことがあればちゃんと言えこのタコ!
というだけじゃ冷たいので言っておくと、コンパイラ持ってないなら誰かにコンパイルしてもらえ。
0098デフォルトの名無しさん
2008/07/02(水) 23:02:54extend M
0099デフォルトの名無しさん
2008/07/03(木) 01:49:30Moduleいっこincludeするだけなら
ancestors[1].m1
とか。
本題と違うけど引数なしのmodule_functionって非推奨じゃなかったっけ。
なんかリファレンスでみたような。
0100デフォルトの名無しさん
2008/07/03(木) 14:47:311.9.4くらいになる頃にはなんかステキなメール関係ライブラリが標準添付になります
まあ、rubygemが標準につくなら
「RubyでメールいじるならTMailをrubygemでまず入れましょう」
というようになるんじゃないかな
1.8系列がメインな現在は何も考えずにmailread使ってスクリプト書いていていいと思うよ
「1.9では無くなるライブラリなので今から使わないようにしよう」というのはやや大仰だ
というか、mailreadってなんでなくなったの?
メールをファイルからパースするだけのライブラリなんて誰も使わない?
Mailクラスを作る傍若無人さが気に入らないとか?
0101デフォルトの名無しさん
2008/07/03(木) 14:57:320102デフォルトの名無しさん
2008/07/03(木) 16:33:110103デフォルトの名無しさん
2008/07/03(木) 18:56:45と罵られても大丈夫な神経を持つように。
0104デフォルトの名無しさん
2008/07/03(木) 21:59:04MLログ(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 なんて一般的なクラス名を……。 あれ許せないんだけど!
>ささだ あれすごいよね。……で、まぁあれのユーザーなんですけど (笑)
>青木 あれなくして欲しい。
>ささだ いや、でもなくされると私困るんだよ。
>青木 まずライブラリに別名を付けて、それから徐々になくしていく感じでさ。
でも、いきなり消えます、と。
0105デフォルトの名無しさん
2008/07/03(木) 22:00:40Hash[*%w(hoge moge)]
で勘弁してくんろ。
0106デフォルトの名無しさん
2008/07/04(金) 01:57:29ネストされたeachを一気に抜けるにはどうしたらいいでしょうか?
0107デフォルトの名無しさん
2008/07/04(金) 02:21:45catch〜throw
0108デフォルトの名無しさん
2008/07/04(金) 06:52:41a = [1,2,3]
b = [2,4,6]
a.zip
# 結果
# [[1,2],[2,4],[3,6]]
-----------------------------
なぜ a.zip ってだけで b の内容も反映されるのでしょうか?
0109デフォルトの名無しさん
2008/07/04(金) 06:55:11ary.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 があったりなかったり.
0110デフォルトの名無しさん
2008/07/04(金) 07:14:010111デフォルトの名無しさん
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"]
0112デフォルトの名無しさん
2008/07/04(金) 09:15:25j[-1] は意味があるが、 i[-1]は意味がない。(ソートの役にたたない)
0113デフォルトの名無しさん
2008/07/04(金) 09:26:11>>112 そう,それが疑問だったんです.
C/C++/Python/PHP を日ごろ使っているんですが,
Ruby もなかなかよさそうですね.
0114デフォルトの名無しさん
2008/07/04(金) 11:46:47それとも単一プロセス内のマルチスレッド間同期のみですか?
0115デフォルトの名無しさん
2008/07/04(金) 16:03:41後者です。
0116デフォルトの名無しさん
2008/07/04(金) 23:18:15ネストを一気に抜けるcontinue文って何にあるんだ。
Cのcontinueに相当するのはnextだが。
0117デフォルトの名無しさん
2008/07/04(金) 23:35:120118デフォルトの名無しさん
2008/07/04(金) 23:51:210119デフォルトの名無しさん
2008/07/05(土) 00:04:21breakで全部抜けるのか
0120デフォルトの名無しさん
2008/07/05(土) 00:19:43普通は一番内側のループだけ。C言語と同じ > PHPのbreak
ただ、引数?を指定できて、抜ける階数を指定できる。
0121デフォルトの名無しさん
2008/07/05(土) 01:14:18アマ:gotoは使わないほうがいいですよね。
プロ:そうですね。勧められませんね。
(ぼけ 使ったほうがスッキリしてメンテも楽なんだよ。
ま でもある程度わかってからじゃねーと無理だもんな。)
0122デフォルトの名無しさん
2008/07/05(土) 01:30:50あっちこっちに飛び回るようなコードは書きにくい。乱用はしにくいはず
0123デフォルトの名無しさん
2008/07/05(土) 01:31:480124デフォルトの名無しさん
2008/07/05(土) 01:33:560125デフォルトの名無しさん
2008/07/05(土) 02:28:59そうだね
Fiber だね
0126デフォルトの名無しさん
2008/07/05(土) 02:56:480127デフォルトの名無しさん
2008/07/05(土) 02:59:48def double
self + self
end
end
0128デフォルトの名無しさん
2008/07/05(土) 03:02:02class ::String
def hello
puts "Hello #{self}!"
end
end
0129デフォルトの名無しさん
2008/07/05(土) 03:08:00::のあるとなしと
どっちがベターでしょうか?
0130デフォルトの名無しさん
2008/07/05(土) 03:21:10ありがとうございました
0131デフォルトの名無しさん
2008/07/05(土) 05:35:18continueあるよ。nextだよ
0132デフォルトの名無しさん
2008/07/06(日) 01:36:11ロックは気にしなくていいんですか?
複数のプロセスから書き込んだ場合にファイルが壊れたりしませんか
0133デフォルトの名無しさん
2008/07/06(日) 01:48:460134デフォルトの名無しさん
2008/07/06(日) 02:24:30ありがとうございます
ただロックの仕方が分からないのではなく
File.open(filename){|fh| ...}
というファイルクローズまでお任せの書き方の時、
ファイルロックまでお任せできるのか、どうか?と思ったのです
0135デフォルトの名無しさん
2008/07/06(日) 02:31:34パフォーマンスや飢餓の問題があるし
0136デフォルトの名無しさん
2008/07/06(日) 02:38:58というふうに発想したんだろうけど、それは残念ながらないですね。
File.flock(...) do
File.open(...) do
end
end # unlockされる
という形で使えると便利な気はしますが、とりあえずensureで。
0137デフォルトの名無しさん
2008/07/06(日) 03:01:52ではちゃんとロック・アンロックしなきゃいけないんですね
0138デフォルトの名無しさん
2008/07/06(日) 03:13:35alias 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
こんなとこ?
0139デフォルトの名無しさん
2008/07/06(日) 03:22:31少なくともXPとlinuxとmacとFreeBSDでは
0140デフォルトの名無しさん
2008/07/06(日) 03:23:58どうするのがいいですか?
PHPだと
$class_name = 'HogeController'
$controller = new $class_name()
のようにしていました。
evalで生成する文自体を動的に組み立てればできますが
evalはかなり遅いようです
いい方法はないでしょうか?
0141デフォルトの名無しさん
2008/07/06(日) 03:31:31clazz = Object.const_get(class_name)
0142デフォルトの名無しさん
2008/07/06(日) 03:31:56controller = Object.const_get(class_name).new
だな。
0144デフォルトの名無しさん
2008/07/06(日) 08:14:06http://d.hatena.ne.jp/AntiSeptic/20080704/p1
などと思わせぶりな言い方をするものだから覗いてみりゃ、
なんて事無い田舎の零細企業の財務諸表であって、面白くもなーんともなかったわけだ。
それにしても、この程度の収益で2007年度って、
あの会社にとっては多分空前絶後の景気のいい年だったはずだの
Rubyとゆー「鉱脈」があるだの言っているのは何なのだ。
Geekのヨタ話というのは、いつもこんなしょぼいスケールで行われているのか?
あそこの技術者の平均レベルは、他の普通の会社よりはずっと高いと思うって、
これじゃあ、技術なんてIT企業の収益とは何の関係も無いと証明しているようなもんじゃねえか。
そもそも、この会社が何をやっているのかがHPを見た限りではよく分からん。
要は受託開発だろ労働力を人月で売ってるだけだろマーケ屋がこねくりあげた横文字得意げに使ってなに悦に入ってやがんだコラ。
更には製品・サービス部門まであって、なにやら参考価格が書いてあるところを見ると、
多分にパッケージっぽい印象を受けるが、それでいて全体の粗利率が26%程度ではどうしようもないだろ。
あそこに入りたい人は、損益計算書も注意して見ておくといい。まぁこれはどんな会社でも同じだけど、
ここを見るといろんなことが見えて来る。株価指標を計算してみるのもいい(非公開会社でもね)。
0145デフォルトの名無しさん
2008/07/06(日) 12:04:08おいしいところはCTCなりがもってけばいいんじゃないの。
0146デフォルトの名無しさん
2008/07/06(日) 12:12:570147デフォルトの名無しさん
2008/07/06(日) 12:56:33これ他のエントリも結構面白いこと書いてあるな
0148デフォルトの名無しさん
2008/07/06(日) 13:00:50他のエントリも爆釣りで吹いたwww
0149デフォルトの名無しさん
2008/07/06(日) 16:12:45Rubyが最初から起動するほどの待ちはありませんが、
それでもなんとなくモッサリしています
こんなものなのでしょうか?
0150デフォルトの名無しさん
2008/07/06(日) 17:06:15まあそんなもんです
そんな日常的アクセスで遅すぎるほど遅いこともないと思うんだけど
0151デフォルトの名無しさん
2008/07/06(日) 17:14:06*.ico フォーマットになってるとうれしい.
64x64 フルカラーとかいろんなフォーマットでください.
0152デフォルトの名無しさん
2008/07/06(日) 17:29:05好きなのを選べ
ttp://homepage1.nifty.com/a_nakata/ruby/
ttp://devadjust.exblog.jp/4673237/
ttp://rubyidentity.org/
0153デフォルトの名無しさん
2008/07/06(日) 17:38:490154デフォルトの名無しさん
2008/07/06(日) 18:21:110155デフォルトの名無しさん
2008/07/06(日) 18:28:270156デフォルトの名無しさん
2008/07/06(日) 18:42:02横からだがありがとう
0157デフォルトの名無しさん
2008/07/06(日) 19:29:40ロゴコンテストじゃなくてアイコンコンテスト
0158デフォルトの名無しさん
2008/07/06(日) 19:53:39という形式の文字列にするにはどうしたらいいですか?
to_sだと全部繋がってしまいます
0159デフォルトの名無しさん
2008/07/06(日) 19:58:16irb> h = {1=>"a", 2=>"b", 3=>"c"}
irb> puts h
1a2b3c
irb> puts h.inspect
{1=>"a", 2=>"b", 3=>"c"}
0161デフォルトの名無しさん
2008/07/06(日) 20:19:380162デフォルトの名無しさん
2008/07/06(日) 20:30:12もうちょい早く直るとよかったんだけどねえ
まあ変なのがなくなりつつあるだけでも良しとせねば
0163デフォルトの名無しさん
2008/07/06(日) 21:57:00$ ruby script/generate scaffold user name:string ...
$ rake db:migrate
とやってモデルとDBのテーブルを作成したのですが、
新たに列を追加したくなりました。
モデルを再作成しないで列を追加する方法を教えて下さい。
このWebサイト見ろ!ごるぁでも結構です。
0164デフォルトの名無しさん
2008/07/06(日) 23:59:22script/generate migration AddXxxToUser
だけど。
未公開の開発途上なら、db:migrate:downしてから CreateUsersマイグ
レーションを書き換えてマイグレーションやり直してもいいよ。
0165デフォルトの名無しさん
2008/07/07(月) 00:20:17def hoge()
end
hoge()
のような順番じゃなくて、
hoge()
def hoge()
end
のように書いてみたいんですが。
0166デフォルトの名無しさん
2008/07/07(月) 00:39:250167デフォルトの名無しさん
2008/07/07(月) 00:46:52できる。というか、Rubyの標準ライブラリは
多くがCで書かれている
0168デフォルトの名無しさん
2008/07/07(月) 00:49:37するくらいしかないかなー。
main = proc { hoge }
def hoge
end
main.call
0169163
2008/07/07(月) 00:54:23ありがとうございます。
まだ勉強中なんで色々なやり方を覚えておきたいなぁと。
db:migrate:down ってのも知りませんでした。
とりあえず↓これ見つつ
http://rails.to/files/four-days-on-rails-2-ver-1.1.pdf
ネットで検索しながら色々やってるんですけど、
他に良い情報無いですか?
0170デフォルトの名無しさん
2008/07/07(月) 02:20:25個々の要素にはキーでアクセスしたいし、
取り出す時は決まった順番で取り出したい、っていう時に欲しいです
0171デフォルトの名無しさん
2008/07/07(月) 02:22:420173170
2008/07/07(月) 02:39:52たのしいRubyの練習問題の中にありました!
OrderdHashじゃなくてOrderedHashだと思いますが
案外簡単に実装できるんですね
0174デフォルトの名無しさん
2008/07/07(月) 03:33:410175デフォルトの名無しさん
2008/07/07(月) 03:38:521.9でActiveSupportをロードすると、Hashの別名として定義するようになってる(笑)
0176デフォルトの名無しさん
2008/07/07(月) 06:30:27順番枚挙機能が欲しいだけならハッシュ登録時に配列にキー入れといて orders.map{|k| h[k]} とかで取得しれ
0177デフォルトの名無しさん
2008/07/07(月) 06:34:04gemでhashで検索したら2つくらいあったぞ
0178デフォルトの名無しさん
2008/07/07(月) 08:59:04$ 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
0179デフォルトの名無しさん
2008/07/07(月) 12:05:24(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
0180デフォルトの名無しさん
2008/07/07(月) 12:13:370181デフォルトの名無しさん
2008/07/07(月) 13:54:23本当だ。
(4)irb(main):010:0> a=b=Hash.new; p a,b; a={'A'=>1};p a,b
{}
{}
{"A"=>1}
{}
=> nil
これは、仕様ですか?
0182デフォルトの名無しさん
2008/07/07(月) 14:32:44読んでないならオブジェクトについて勉強することをお勧め
0183デフォルトの名無しさん
2008/07/07(月) 20:18:05gem install ZenTest
としたのですが、コマンドプロンプトが固まってしまいます。
0184183
2008/07/07(月) 20:23:46gem不安定なのかな?
0185デフォルトの名無しさん
2008/07/07(月) 21:37:41当然仕様。
0186デフォルトの名無しさん
2008/07/08(火) 13:13:58puts 長文入り配列.map{|e| addtag(e).toeuc}
と
puts 長文入り配列.map{|e| addtag(e)}.join("\n").toeuc
では、後者のほうが NKF の使用が1回だけで済んですっきりさんですか?
やっぱ NKF って使用回数が少ないほうが好ましいですよね?
0187デフォルトの名無しさん
2008/07/08(火) 14:13:38標準組み込みライブラリの net/http の定数か何かを流用することはできませんか?
Net::HTTPOK が '200' になるとか、Net::NotFound が '404' になるとか、そんな感じのステキなやつです
Net::HTTPResponse::CODE_TO_OBJ.index(Net::HTTPOK) は確かに '200' ですが、
これなら '200' # HTTPOK と注釈つきで数字を書いたほうがまだわかりやすそうです
0188デフォルトの名無しさん
2008/07/08(火) 14:25:48class Net::HTTPResponse
def self.code
Net::HTTPResponse::CODE_TO_OBJ.index(self)
end
end
p Net::HTTPOK.code # => "200"
0189デフォルトの名無しさん
2008/07/08(火) 17:41:27when Net::HTTPOK
puts "OK"
end
0190デフォルトの名無しさん
2008/07/08(火) 18:18:07require 'webrick/httpstatus'
include WEBrick
HTTPStatus::OK.code #=> 200
HTTPStatus::OK.reason_phrase #=> "OK"
HTTPStatus::RC_OK #=> 200
詳しい使い方は、httpstatus.rbのソースコード読めばたぶん分かる
0191デフォルトの名無しさん
2008/07/08(火) 19:38:47HTTPOK = "200"
でいいような気もする
0192デフォルトの名無しさん
2008/07/08(火) 21:38:53上の方は .join("\n") が抜けてるんだよな?そうでないと結果が同じにならないし
メソッド呼び出しを無視すれば変換処理自体はどっちもほとんど同じじゃないかな?
ただし toeuc は元のエンコードを自動識別する(nkf -em と等価、kconv.rb 参照)
一つにまとまってればこれは一回ですむから、後者の方が効率がいいといえる
# 当然だけど配列内のエンコードは統一されていることが前提
気になるんなら自分でベンチマークでもしてみたら?
0193デフォルトの名無しさん
2008/07/08(火) 23:19:300194デフォルトの名無しさん
2008/07/09(水) 00:09:41このvalueの値が["aaa","bbb","ccc"]のような形式になっています。
このvalueを","で区切り配列を[key,aaa,bbb,ccc]のようにするにはどうすればよいでしょうか?
spliteを使用しようとするとエラーが出て使用できませんでした。private〜というエラーです。
0195デフォルトの名無しさん
2008/07/09(水) 00:17:420196デフォルトの名無しさん
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となるのでしょうか?
0197デフォルトの名無しさん
2008/07/09(水) 00:44:14nil.<< b することになってエラーになってるだろ?
そうでないなら初期値はあなたがきめた何か "" や [] であるはずで、
それらに定義された << の動作に従う。
0198デフォルトの名無しさん
2008/07/09(水) 00:45:22○ nil << b
0199デフォルトの名無しさん
2008/07/09(水) 01:07:34配列のように追加したければハッシュの宣言部で配列が初期値だとしておけばいいということでしょうか?
0200デフォルトの名無しさん
2008/07/09(水) 01:37:420201デフォルトの名無しさん
2008/07/09(水) 02:16:14あなたはおそらく、訊く前にまず自分で考えるべきだ
あと質問する側の「書き忘れていました」は、回答する側に相当悪い印象を与えるからできる限り止めろ
0202デフォルトの名無しさん
2008/07/09(水) 03:30:26rubymanjp.chmくらいですか?
ADSLの切り替えで一時的にネットにつなげないのですが
rubymanjp.chmのerbの資料が少なすぎて泣きました
もっとごっそり入ってる、オフラインで閲覧可能な情報源があれば教えてください
0203デフォルトの名無しさん
2008/07/09(水) 08:09:12> 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 が詳しい
0204デフォルトの名無しさん
2008/07/09(水) 09:41:20まあ、「すっきりさん」という表現も曖昧模糊だが
要素内文字を操作したあと一気に文字列にするのと
文字入り配列をjoinして文字列操作するのでは
配列のままを使用する前者のほうがRubyっぽい書き方だと思う
0205デフォルトの名無しさん
2008/07/10(木) 03:21:06print("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
ってやってみたんだけど、はじかれちゃう
なんでだ?
0206デフォルトの名無しさん
2008/07/10(木) 03:24:45はじかれる?とはどういう意味?
構文解析でエラーになる件なら、
ソースに全角空白が混じっているが
0207デフォルトの名無しさん
2008/07/10(木) 03:30:43for i in 1...n
for j in 2...n
C[i][j] = C[i-1][j-1] + C[i-1][j]
ここら辺がうまくいっていないっぽい
0208デフォルトの名無しさん
2008/07/10(木) 03:31:05evalを使わずにする方法はありませんか?
0209207
2008/07/10(木) 03:34:49C:/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
0210デフォルトの名無しさん
2008/07/10(木) 03:56:430211デフォルトの名無しさん
2008/07/10(木) 04:01:01何故俺がお前の、ポイントも提示されず、読ませるための工夫も無い
糞ソースを、一から読まなきゃいけないんだ
0213デフォルトの名無しさん
2008/07/10(木) 04:21:05http://www2a.biglobe.ne.jp/seki/ruby/erbquote.html
こちらを見ると1.8のERBに既にこの機能が入ってるとのことですが、
ライブラリマニュアルにも記述箇所が見あたりません
0214デフォルトの名無しさん
2008/07/10(木) 06:28:53そのページの「新しいインターフェイス」は「自動quote」のことじゃないと思う
そこの文章(と実験スクリプト)を良く読んでみ
0215デフォルトの名無しさん
2008/07/10(木) 06:50:03> 一から読まなきゃいけないんだ
義務があると思っているなら、あなたはただの馬鹿です。
0216デフォルトの名無しさん
2008/07/10(木) 09:06:010217デフォルトの名無しさん
2008/07/10(木) 09:19:56print("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
0218デフォルトの名無しさん
2008/07/10(木) 09:36:140219デフォルトの名無しさん
2008/07/10(木) 09:52:280220デフォルトの名無しさん
2008/07/10(木) 16:26:52配列のソートがうまくいかない。
x[n]<<[ホスト名,日付]
の配列をホスト名ごとに時系列順にソートしたいんです
0221デフォルトの名無しさん
2008/07/10(木) 17:04:28どのようにうまくいっていないかが知りたい。
なにかしらエラーが出てるならエラーメッセージを書いてほしいし、
間違った動作をしているならそれを再現するソースコードがあるといいな。
0222デフォルトの名無しさん
2008/07/10(木) 17:09:51単に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読んだだけでもいろいろ要因を思いついてしまうので、
(しかも外している可能性大) 詳細を希望します。
0223デフォルトの名無しさん
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]) とかしれ
0224デフォルトの名無しさん
2008/07/10(木) 17:16:210225デフォルトの名無しさん
2008/07/10(木) 17:17:49言われたことにちゅういしてやってみます
エラーが何だったかわかったらまたかきます
0226デフォルトの名無しさん
2008/07/10(木) 17:20:00疎な配列を作りたかったのかもしれないじゃないか
0227デフォルトの名無しさん
2008/07/10(木) 17:59:2706/6/2007
06/6/2007
06/6/2007
06/9/2002
てなるんですがどうすればなおせますか?
0228デフォルトの名無しさん
2008/07/10(木) 18:17:04少しはマニュアルとか読んで自分で考えようぜ
文字や数字として大小を考えて欲しいんじゃなくて、日付として大小を考えて欲しいんだろ?
Rubyには日付を扱う添付ライブラリdateがあるぞ
ttp://www.ruby-lang.org/ja/man/html/Date.html#parse
0229デフォルトの名無しさん
2008/07/10(木) 18:31:380230デフォルトの名無しさん
2008/07/10(木) 19:45:56日本Rubyの会はどう考えているのでしょうか?
0231デフォルトの名無しさん
2008/07/10(木) 19:51:370232デフォルトの名無しさん
2008/07/11(金) 01:22:29[10/May/2008:06:47:07 +0900]
をまとめて文字列として抽出したいのですがどのような記述をすればよいですか?
0233デフォルトの名無しさん
2008/07/11(金) 01:32:53すこしはsage覚えような
ほんのちょっとデータが変わっただけで全く使えなくなるから
データと正規表現の関わりそのものを覚えたほうがいい
ほぼ確実にマッチするパターンを見つけるんだ
ひとつの正規表現で難しかったら複数のif文と変数使用を躊躇ったらイカン
案外Stringクラスのsplitメソッドで配列にするだけで用が済んだりしないか?とか
0234232
2008/07/11(金) 01:46:22あと自分はこのスレで質問するのは初めてです。
上の方で似た状況の方がソートについて質問されていますが
私は抽出したものをそのまま表示したいだけです。
0235デフォルトの名無しさん
2008/07/11(金) 01:50:08それとも正規表現を使って複数の一致する文字列を取り出す方法を知りたい?
0236232
2008/07/11(金) 01:54:34この文字列にあう正規表現を教えていただきたいです
よろしくおねがいします。
0237デフォルトの名無しさん
2008/07/11(金) 01:56:550238デフォルトの名無しさん
2008/07/11(金) 01:58:340239デフォルトの名無しさん
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]")}! とか
書いてみる。
0240デフォルトの名無しさん
2008/07/11(金) 02:05:13マ板はID無いし最新10スレで見かけたくらいでは誰も答えられないし
スレ住人の多くは専用ブラウザで新着チェックしてるだろうし
あんまり意味ないかもしれん
0241デフォルトの名無しさん
2008/07/11(金) 02:06:310242デフォルトの名無しさん
2008/07/11(金) 02:09:04>正規表現を使って
>[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
0243232
2008/07/11(金) 02:13:330244デフォルトの名無しさん
2008/07/11(金) 03:21:46>>239 >>241 >>242 のどれを参考にしてどのように解決したのかがわからないと、
質問に(エスパーして)回答した人間にも、また後から検索等でこのスレを参照する
人間にも、何一つ残らないんだがな。
これってわざと?
0245デフォルトの名無しさん
2008/07/11(金) 04:01:000246デフォルトの名無しさん
2008/07/11(金) 04:07:21のように添字が0から順に入っているのではなく乱数が入っている配列があり
添字の小さい順に中身を表示したいのですがどうすればいいですか?
0247デフォルトの名無しさん
2008/07/11(金) 04:14:18"2000年01月02日" という文字列をDateクラスに変更する
場合どうやりますか?
もちろん正規表現を使って2000, 01, 02 をy, m, d という
変数に入れてってやればできるのはわかりますが、
Rubyっぽく書くにはどうすればいいでしょう?1行で。
2行で書くやり方はわかりました。
0248デフォルトの名無しさん
2008/07/11(金) 04:32:11nilで埋まってると仮定して、
添字が必要ないなら、list.compact
必要なら each_with_index で回して条件式付けるだけじゃない
0249デフォルトの名無しさん
2008/07/11(金) 04:46:47Arrayやめて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
0250デフォルトの名無しさん
2008/07/11(金) 04:48:24Date.parseは日本語表記には対応してないから、正規表現使うしかないんじゃないかな。
date = (require "date"; Date.new(*/(\d+)年(\d+)月(\d+)日/.match("2000年01月02日").captures.map(&:to_i)))
0251249
2008/07/11(金) 04:51:17×list.keys.sort.each {|key,val| p val }
○list.keys.sort.each {|i| p list[i] }
0252デフォルトの名無しさん
2008/07/11(金) 04:51:58ruby -Ku -rdate -e "p Date.parse('2008年07月11日'.gsub(/[^\d]/u,'-')).to_s"
0253247
2008/07/11(金) 05:37:40特に秘密にしたわけでもなく、しょぼいコードなんで特に書くまでもないかなぁと思って。
元のコード↓
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})
ついでにもうひとつ質問ですが、最初の * ってどういう意味ですか?
0254247
2008/07/11(金) 05:38:49それでもいけました。
0255デフォルトの名無しさん
2008/07/11(金) 07:37:370256デフォルトの名無しさん
2008/07/11(金) 07:41:41感覚だもの
制御構造と増分パラメータでデータに順にアクセスする代わりに
データ自体をコレクションにしてeachでぶん回すとか
そういう目に見えてわかりやすい「Rubyらしさ」だけではないからな
0257デフォルトの名無しさん
2008/07/11(金) 08:33:430258247
2008/07/11(金) 08:40:08おっしゃる通り特に大した意味はないです。
「あー、それであってるしJava(C, PHP, etc)では確かに
そうやるんだけど、Rubyだと普通はこうやるねー。」
みたいなのがあればそう言う方法を知りたいなと思っただけです。
0259デフォルトの名無しさん
2008/07/11(金) 12:29:24いや全然
そういう意味でRubyの再帰はオマケ
0260デフォルトの名無しさん
2008/07/11(金) 13:24:43・1週間の体重の推移がシンプルな折れ線グラフで表示される
・フォームからその日の体重をPostすれば、グラフに反映される
・体重の入力は、携帯から行う
なんとか体重の入力と記録、重複のチェックは作ったのですが、
肝心の「グラフ化」をどうすればよいのかわかりません
以下の一連のレス(Nで前進、Pで後退)も参照したのですが、
携帯で使えるかどうかがわからないもので…
(今ならば、もっと新しい方法があるのでしょうか)
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/30426
見た目にはこだわりませんので、
初心者でも比較的簡単に実装できるグラフ化の方法がありましたら
どうか教えてください。
0261デフォルトの名無しさん
2008/07/11(金) 13:32:23えーと、そのRubyスクリプト(たぶんCGI)を動かすためのサーバに
どんなソフトがインストールされてるかに完全に依存する
授業やら演習やらでの話なら、その前の授業とかでグラフや画像の作成の問題が出てるはず
全く出てないなら極悪授業だな
0262デフォルトの名無しさん
2008/07/11(金) 13:52:36…まあそりゃ画像フォーマットにもよるけどさ
でもXBMとか作っても仕方ないだろ
0263260
2008/07/11(金) 14:42:43サーバはロリポップを使う予定です。
ttp://lolipop.jp/?mode=manual&state=hp&state2=cgi
…何が入っているんでしょうね。
お勧めのものを伺って、使えるかどうかサポートに尋ねることにいたします。
なお、授業や演習の課題ではなく、趣味とダイエットを兼ねた練習です。
>>262
最悪、XBMの白黒グラフでも良いですが、やはりできれば色が欲しいです。
「外部プログラム」の使い方(設置の仕方)を把握していない程度には
初心者ですので、お勧めのものがあれば設置方法も教えてえくださいますと
大変助かります。
(今から自分でも検索してみます。外部プログラムが必要なんですね…)
初心者なのに微妙にハイレベルな問題に足を突っ込んでしまっていますが、
「身の程知らずめ!」と思わず、ぜひお力をお貸しください。
0264デフォルトの名無しさん
2008/07/11(金) 15:41:24もし、個人で使うだけで、なおかつ携帯電話が 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画像を変換させれば問題なし
0265デフォルトの名無しさん
2008/07/11(金) 15:52:19pack とか unpack とかそもそもナンデスカという人向けの勉強になるサイトとか誰かご存知ないですかね
C 言語に習熟していれば素直に理解できたりするのかな?
0266260 263
2008/07/11(金) 16:02:05Google Chartを使うとは。色々な方法があるものですね
データの渡し方は、いまからシコシコ試してみます
rubygemsの可否は、オペレーターのお姉さんに聞いてみます
ImageMagickのこととかも調べていると、明日になりそう…
でも、おかげさまで助かりました。
とりあえず、いただいた回答&ヒントでがんばってみます
結果はまたご報告します
0267デフォルトの名無しさん
2008/07/11(金) 18:58:06PNGでいいならPureImage/Rubyでいいんじゃない?
しかしダイエットのためにプログラミングとは素敵な動機だな
0268デフォルトの名無しさん
2008/07/11(金) 19:26:37折れ線描くための計算をするのも手作業だろ
0269デフォルトの名無しさん
2008/07/11(金) 19:42:42折れ線グラフなら、計算つったって画像サイズを元にした割合からpx座標の
整数値に落とすだけじゃない?
その程度の計算は、中学生でも多分可能だと。
0270デフォルトの名無しさん
2008/07/11(金) 21:23:37cattle = "yahoo"
の後に
cattle[2] = ?p
でcattleの参照先が
yapoo
になるのが不思議です。
?pは
1.8では112
1.9では"p"
だから、cattle[2] = ?p
っていう代入が正しく動作するのは1.9だけだと思うのですが、
どうして1.8でも正しく動作するのでしょうか?
0271デフォルトの名無しさん
2008/07/11(金) 21:35:17マニュアルくらいは読んでくれ
ttp://www.ruby-lang.org/ja/man/html/String.html#self.5bnth.5d.3dval
そのように []= メソッドが作られてるからだ
0272デフォルトの名無しさん
2008/07/11(金) 21:51:21おお!そういうことか!納得。
でもこのマニュアルの探しにくさどうにかならんかなあ・・・。
「配列への部分的な代入について調べたい」っていう目的意識があっても、
俺のようなクソ初心者はマニュアルのトップページからは絶対にここまでたどり着けんぞ。
0273デフォルトの名無しさん
2008/07/11(金) 21:54:03文字化けかはぐれ三項演算子かとオモタ
0274デフォルトの名無しさん
2008/07/11(金) 21:59:30こっち見ようぜ
0275デフォルトの名無しさん
2008/07/11(金) 22:02:40安心しろ
刷新と称した新版ではさらに一覧性が下がっている
ttp://doc.loveruby.net/refm/api/
なんかうまくいかんね
0276デフォルトの名無しさん
2008/07/11(金) 22:09:000277デフォルトの名無しさん
2008/07/11(金) 22:16:27irb(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?
0278デフォルトの名無しさん
2008/07/11(金) 22:23:43cattle[2] = 112
0279デフォルトの名無しさん
2008/07/11(金) 22:25:42じゃなくて、cattle[2] = 'p' じゃダメなの?っていうこったね。
その ?リテラルが非常に直感的じゃないっていう。
Cやってる人は、そうやってバイト操作するのが直感的なのかな?
#それでも、1.9でやっとString#ordが実装って、正直どうなんだろうw
0280デフォルトの名無しさん
2008/07/11(金) 22:26:030281デフォルトの名無しさん
2008/07/11(金) 22:26:32pのアスキーコードを暗記してるruby初心者ならそうやるでしょうね。
0282デフォルトの名無しさん
2008/07/11(金) 22:28:07そこでTypeErrorになっているのは、pメソッドの返り値(nil)を代入しようとしているため
0283デフォルトの名無しさん
2008/07/11(金) 22:29:30#\p と書かされるよりはマシ
0284デフォルトの名無しさん
2008/07/11(金) 22:29:31Encodingが無いとちゃんとしたordは無理だろう
0285デフォルトの名無しさん
2008/07/11(金) 22:43:140286デフォルトの名無しさん
2008/07/11(金) 22:44:50"yahoo"
[2]> cattle
"yahoo"
[3]> (aref cattle 2)
#\h
[4]> (setf (aref cattle 2) #\p)
#\p
[5]> cattle
"yapoo"
0287デフォルトの名無しさん
2008/07/11(金) 22:47:580288デフォルトの名無しさん
2008/07/11(金) 23:09:00kwsk
0289デフォルトの名無しさん
2008/07/11(金) 23:59:130290デフォルトの名無しさん
2008/07/12(土) 00:06:060291デフォルトの名無しさん
2008/07/12(土) 00:17:29cattle[2] = 'p'
じゃ駄目なの?この辺はCを意識した作りになってるだけだと思うけどなあ。
イテレータ引数が外部に出ちゃうのも同じ。
0292デフォルトの名無しさん
2008/07/12(土) 06:14:480293デフォルトの名無しさん
2008/07/12(土) 06:55:55awkでのやり方と完全に同じことができるなら、それは単にawkだ
0294デフォルトの名無しさん
2008/07/12(土) 07:01:54記述子が長いとか文句言った人がいたんだが、
スクリプトが短いのがいいって人は素直にedかsedでも使っとけ
0295デフォルトの名無しさん
2008/07/12(土) 07:57:190296デフォルトの名無しさん
2008/07/12(土) 08:09:41ない。
class Foo
def f
raise NotImplementedError.new("Foo#f(): not implemented yet")
end
end
とするだけ。
0297デフォルトの名無しさん
2008/07/12(土) 08:18:25jlengthを使っていたのですが、
マニュアルで
「jcode ライブラリはプロセス全体に影響するため、
中程度以上の規模プログラムで用いることは推奨できません。」
という記述を見つけました。
jcodeを使わずに文字列の長さを取得するにはどうしたらいいのでしょうか?
0298デフォルトの名無しさん
2008/07/12(土) 08:21:36str.split(//e).size
ShiftJISな文字列の場合は正規表現を //s に
0299デフォルトの名無しさん
2008/07/12(土) 08:30:53今となってはEUCとかSJISとか全部、言って見れば後方互換だろ?
ここでする話では無いのかもしれんけど
0300デフォルトの名無しさん
2008/07/12(土) 08:31:19初心者が見つけられる位置になければ、書いてないのとおなじ
0302デフォルトの名無しさん
2008/07/12(土) 08:51:38そうしたのがPython
「いや、どんなエンコーディングもそのまま扱えるようにすべき」
としたのがRuby1.9
0303デフォルトの名無しさん
2008/07/12(土) 08:57:54きっと壮大な実験なんだと思う。
0304デフォルトの名無しさん
2008/07/12(土) 09:05:490305デフォルトの名無しさん
2008/07/12(土) 09:29:35文字コードの問題はあと10年は続くと思われ。
0306デフォルトの名無しさん
2008/07/12(土) 10:13:12どうだろう。EmacsなんかはCSIだけどね。
後方互換が重要なんだ!って人もいるにはいるだろう
日本でRubyがこれほど普及したのも日本語(EUC, SJIS, JIS)処理が得意だったからだし。
個人的にはUCS2/4とかをサポートする言語があってもいいと思う。
>>304
まだ誰もRuby1.9は使ってない。
0307デフォルトの名無しさん
2008/07/12(土) 10:14:46NKFのマニュアルページ見てもやり方がわかりません
どうしたらいいのでしょうか?
0308デフォルトの名無しさん
2008/07/12(土) 10:36:37ttp://www.google.co.jp/search?hl=ja&q=%91S%8Ap%83J%83i+%94%BC%8Ap+ruby
試してないけどこれが使えそう
ttp://gimite.net/gimite/rubymess/moji.html
0309デフォルトの名無しさん
2008/07/12(土) 11:22:430310デフォルトの名無しさん
2008/07/12(土) 13:39:33どうやれば出来ますか?
0311デフォルトの名無しさん
2008/07/12(土) 13:44:37extend
0312デフォルトの名無しさん
2008/07/12(土) 13:48:11ありがとうございます。
もともとこういう機能があったんですね・・
便利だなぁ
0313デフォルトの名無しさん
2008/07/12(土) 17:45:32外見上はプロパティーへの直接アクセスに見えるものが普通ですが、
プロパティーが何らかのコレクションの場合は、
そのコレクションの要素へのアクセスを提供するメソッドは
どうしてもset_hoge(key,value)的なものになりますよね?
命名規則が一貫しなくてなんかモヤモヤするのですが、
こういうやり方であってるのでしょうか?
0314デフォルトの名無しさん
2008/07/12(土) 17:50:28B: 破壊的メソッド含め、何でも出来てしまうのがよろしくないなら、
必要なインターフェイスだけを定義したオブジェクトを公開して、
内部で実体へdelegateする。
こんなとこ?
0315デフォルトの名無しさん
2008/07/12(土) 18:04:37obj.params[key]=value ←params のクラスに[]=定義
0316デフォルトの名無しさん
2008/07/12(土) 18:20:39str1 = str0
この後、変数str1を使ってstr0の値を変えたいのですが(PHPのリファレンスのように)
そういうことできますか?
0317デフォルトの名無しさん
2008/07/12(土) 18:31:37http://www.geocities.jp/titohaihu/
お小遣いの稼ぎ方載ってる、いいサイトだよ
http://www.geocities.jp/kodohaihu/
0318316
2008/07/12(土) 18:43:32http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/33931
ここで、Matzが破壊的代入は出来ないと言っているのですが
replaceと破壊的代入は別物なんでしょうか…
0319デフォルトの名無しさん
2008/07/12(土) 18:44:02315も言ってるように、Rubyでは[ ]や[ ]=をメソッドとして定義できるので
コレクションにそれっぽくアクセスしたいなら、これ使うと便利
0320デフォルトの名無しさん
2008/07/12(土) 18:46:490321デフォルトの名無しさん
2008/07/12(土) 18:51:26って言われたぜヘヘッ!
0322デフォルトの名無しさん
2008/07/12(土) 19:11:310323デフォルトの名無しさん
2008/07/12(土) 19:17:250324デフォルトの名無しさん
2008/07/12(土) 19:56:07[] = って左辺値一般を定義できるのかなあ…
array[index] += hoge;
ってやりたいときは [] += とかあるの?それとも + を使って暗黙に定義されるの?
0325デフォルトの名無しさん
2008/07/12(土) 20:25:37こう解釈される
array[index] = array[index] + hoge
詳しくはこのページの「自己代入」を参照
http://www.ruby-lang.org/ja/man/html/_B1E9BBBBBBD2BCB0.html
0326デフォルトの名無しさん
2008/07/12(土) 23:35:12---- 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
------------
0327デフォルトの名無しさん
2008/07/12(土) 23:51:49Aの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された時点で実行される意味で)。
0328デフォルトの名無しさん
2008/07/12(土) 23:55:38a.rbの最後の行はa.rbをライブラリとして
requireしたときにも評価(実行のことな)されてしまうから、
削除して、b.rbのほうに
if $0 == __FILE__
B.new ARGV.shift.to_i
end
とするのがよいんじゃなかろうか。
0329デフォルトの名無しさん
2008/07/13(日) 01:06:03何時何分、という情報だけを”○○:○○”という形式で
出力するにはどうしたらよいのでしょうか
0330デフォルトの名無しさん
2008/07/13(日) 01:13:14DB?
0331デフォルトの名無しさん
2008/07/13(日) 01:21:16さすがにこれはエスパーできん
あのさ、その質問で相手に通じると思う?
0332デフォルトの名無しさん
2008/07/13(日) 01:35:45eclipseってnetbeansの使えない環境でしか使うメリットないよねヘヘッ!
0333329
2008/07/13(日) 01:54:22DBに入れてるデータに時間情報もたせています
RoRを使っていて、helperを用いて解決しようとしましたがやり方がわかりません
0334デフォルトの名無しさん
2008/07/13(日) 02:10:280335デフォルトの名無しさん
2008/07/13(日) 02:32:07カーソルキーで移動や履歴参照ができません orz
C-P、C-N、C-F、C-Bとかemacsみたいなキー操作は利くのですが、カーソルで操作したいものです。
cygwin版のRubyのirbだとできるんですが、
何か足りないライブラリなどあるのでしょうか?
0336デフォルトの名無しさん
2008/07/13(日) 03:39:48deadline が Timeオブジェクトだとして
print deadline.strftime('%H:%M')
実際にはapp/helpers/application_helper.rbに
def format_time(t)
t.strftime('%H:%M')
end
みたいなのを定義して、viewで <%= format_time(deadline) %> とする
0337デフォルトの名無しさん
2008/07/13(日) 04:10:09また、UTF-8を任意バイト長で丸めたいのですがよい方法はありませんでしょうか?
0338デフォルトの名無しさん
2008/07/13(日) 04:38:41バイト配列にする方法はこれでいけました。
a = "ほげほげ".unpack("C*")
0339260
2008/07/13(日) 04:45:39おかげさまで、グラフはいい感じになりました。
>>264
ありがとうございました。Google Chartの説明を読んで初めて
私用のグラフを書いてくださってたことに気付きました。
なお、アルファベットへの変換は諦めて、数字で入れることにしました。
http://www.ajaxtower.jp/googlechart/data/index.html
↑ここの「簡易形式」ではなく「数値形式」
>>267
夏までに!って思っていたら、もう夏です。
クラゲが出るまでには、人様に見せられるBodyになりたい…
でも、なんだか手段が目的になっている気がします。
>>268 >>269
手作業で画像を組成するという方法は、
Google Chartを知った瞬間に頭からベイルアウトされました。
中学生時の記憶など遠い霧の向こうです。
0340260
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 #これは同じに見えるが、違うと判定される
0341デフォルトの名無しさん
2008/07/13(日) 05:01:29p datet.to_s
0343デフォルトの名無しさん
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』
やねうらお語録
>「ワシのほうが潔癖やと思うんやけどな。
>絶対に違法コピーのソフトしか使わんし。
>たとえば強盗に入ったときに、ちょっとかわいそうになって
>十万円だけ残してったら、おかしいやろ?
>自分の『強盗する』という意思に対して矛盾やろ?
>だからワシは、一個も買ったソフトを使ったことがない!!」
0344デフォルトの名無しさん
2008/07/13(日) 12:40:480345デフォルトの名無しさん
2008/07/13(日) 12:50:29反応してるのお前だけだぞ
0346デフォルトの名無しさん
2008/07/13(日) 12:55:47ここで質問させてください。
Rack + Mongrelでウェブアプリを作ろうとしているのですが、
これをデーモン化する簡単な方法はないんでしょうか?
Mongrelだけなら-dオプションでOKなんですが・・・。
0347デフォルトの名無しさん
2008/07/13(日) 14:04:45半端なバイトが出来ないように指定バイト数以下に切り詰めたいということですか?
UTF-8のエンコードの仕組みを調べればいいんじゃないでしょうか。
0348デフォルトの名無しさん
2008/07/13(日) 15:16:57で、以下のコードを実行してもタイムアウトが起こりません。
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
なぜでしょうか?
0349デフォルトの名無しさん
2008/07/13(日) 15:29:42いぇすそういうことです。
サックリできる方法ないかと思ってたんですが、先頭からナメていくしかないのかなあ・・・
0350デフォルトの名無しさん
2008/07/13(日) 15:51:36修士で就職できなかった人間が博士も終了できないので
早々に大学院から去ったときにとるのが単位取得退学
修士以下の学歴だ
0351デフォルトの名無しさん
2008/07/13(日) 15:52:240352デフォルトの名無しさん
2008/07/13(日) 16:51:27s =~ /{/ とか /\{/ とかやってみても動かず・・・
0353デフォルトの名無しさん
2008/07/13(日) 17:29:23"int main(void) {...}" =~ /\{/ #=> 15
0354デフォルトの名無しさん
2008/07/13(日) 17:46:42ほんとうだ・・・別なとこで弾かれてたッぽい orz
ありがとうです
0355デフォルトの名無しさん
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です。
0356デフォルトの名無しさん
2008/07/13(日) 17:53:020357デフォルトの名無しさん
2008/07/13(日) 17:54:06オールインFXってどうよ?5コピペは勘弁 [ベンチャー]
【三洋薬品】 大日本販売 【社名変更】 [ちくり裏事情]
【肯定/否定】オールインFXってどうよ その21 [ベンチャー]
韓国人と仕事し な ら が 困ったこと@P板★4 [プログラマー]
【鬱病】 壊れたプログラマー 12人目 【爆発】 [プログラマー]
Rubyistのイメージが・・・
0358デフォルトの名無しさん
2008/07/13(日) 17:56:37とにかく該当部のコードを貼って
エスパー回答はやりたくない
0359デフォルトの名無しさん
2008/07/13(日) 17:58:57array = []
data = open("sample1")
array = data.split(/\t/)
print array
0360デフォルトの名無しさん
2008/07/13(日) 18:00:32文字列を切り分けるんだからsplitはStringに対して呼ばなきゃダメよ
0361デフォルトの名無しさん
2008/07/13(日) 18:01:220363デフォルトの名無しさん
2008/07/13(日) 18:17:300364デフォルトの名無しさん
2008/07/13(日) 18:22:52・躓かないために原因を探る人
・根性と運で躓きを乗り越えようと考える人
どっちも一定割合で存在する
0365デフォルトの名無しさん
2008/07/13(日) 18:49:15openしっぱなしになるので、長時間メモリに載ったまま動くスクリプト
では注意。
0366デフォルトの名無しさん
2008/07/13(日) 18:55:370367デフォルトの名無しさん
2008/07/13(日) 19:10:27それはともかくGCに外部リソースの回収は期待しちゃいかんよ。
0368デフォルトの名無しさん
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 してないんじゃね?」と悩むことがある
0369デフォルトの名無しさん
2008/07/13(日) 20:27:52ありがとう。理解があやふやだったんでとても参考になった。
File.read ってあんまり見ない気がするけど
ファイナライザ / ensure で close されることが保証されてるなら
もっと積極的に使うようにするよ。
こういうことがマニュアルに書いてないのは、あまり意識されてないからかな?
0370デフォルトの名無しさん
2008/07/13(日) 21:07:33可搬性がすこしだけ低いからだ
バイナリモードにしない・できないから、Windowsでテキストファイル以外を読むと危険
これのおかげで、せっかくの close いらずの便利機能なのに
「うっかり使ってしまわない」ように大多数の人間の記憶から取り除かれてる
(ほとんどの場合はテキストファイルとみなせるものしか読み込まないから問題ないんだけど、時々うっかり使うことがありえる)
だから、ファイルの読み込みは file = File.open(path, 'rb'){|f| f.read} という固定イディオムだ
そんなわけで、公開スクリプトや配布スクリプトで File.read(path) を見ないのは意図的なもんだ
0371デフォルトの名無しさん
2008/07/13(日) 21:35:21IOのとこ見ろ
0372デフォルトの名無しさん
2008/07/13(日) 21:43:56この辺りにMatzのWindowsへの興味の無さが現れているな
0373デフォルトの名無しさん
2008/07/13(日) 21:48:49あああ書いてあった。ボケててごめん
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 だとモードを指定できないから・・・
なるべくイディオムのほう使うよう肝に銘じときます
0374デフォルトの名無しさん
2008/07/13(日) 21:50:32でも既に Ruby 1.8.7 だぜ
しかも、binmode を追加すると何か困るんか? 普通困らないだろ?
0375デフォルトの名無しさん
2008/07/13(日) 21:57:241.9.0-2あたりじゃ出来そうだな
0376デフォルトの名無しさん
2008/07/13(日) 22:05:240377デフォルトの名無しさん
2008/07/14(月) 02:10:440378デフォルトの名無しさん
2008/07/14(月) 04:35:06今時、data = open("sample1").read()
なんて薦めるなよ
data = IO.read "sample1"
か、
data = open("sample1") {|f| f.read}
だろJK
0379デフォルトの名無しさん
2008/07/14(月) 05:04:090380デフォルトの名無しさん
2008/07/14(月) 07:18:35直後で否定されてるってどんな感じ?
直後で否定されてるってどんな感じ?
0381デフォルトの名無しさん
2008/07/14(月) 07:25:27多少無理しても最新レスから遡って読むのがベター
0382デフォルトの名無しさん
2008/07/14(月) 11:21:42最新安定版は一応 1.8.7 だ
あと、他言語習得者がRubyとしての書き方を学ぶ本として『初めてのRuby』を入れておきたい
0383デフォルトの名無しさん
2008/07/14(月) 11:31:53Linuxで自力コンパイルして入れたRuby1.8.6-p0を、パッチレベル最新の1.8.6にしたいです。
どうすればいちばん安全に「上書きアップデート」できますか?
OSはDebianのSargeです。p0をインストールしたときのソースコードディレクトリはそのまま残ってます。
0384デフォルトの名無しさん
2008/07/14(月) 11:34:32rubygemが/usr/local/lib/ruby/gems/1.8/以下にわーっとあったりするので、
「なんかRubyっぽいディレクトリ全部消してからmake installすればOKじゃね?」というのは不安です。
0385デフォルトの名無しさん
2008/07/14(月) 11:57:000386デフォルトの名無しさん
2008/07/14(月) 12:06:54900越えた辺りでもう一度提案するといいんじゃないかな
0387デフォルトの名無しさん
2008/07/14(月) 12:30:19テンプレ案はなるべくスレの最初のほうで提案するのがベター
900過ぎてから書かれてもたまたまその場にいたごく一部の人間しか議論に参加できん
0388デフォルトの名無しさん
2008/07/14(月) 12:40:16議論に関してはその通りだろうけど、次スレ立てる人は
その「たまたまその場にいた」人なわけで
どのみち、最後にまとめはいると思うが
「テンプレ」で抽出出来るように、とりあえず無理にでも
「テンプレ」って書いて議論すればいいのか
0389デフォルトの名無しさん
2008/07/14(月) 13:29:45class Foo
def bar(&block)
#ここでlambdaを使ってbaz()を定義
block.call
end
end
foo = Foo.new
foo.bar do
#ここでコールしたい
p baz
end
0390デフォルトの名無しさん
2008/07/14(月) 13:36:150391デフォルトの名無しさん
2008/07/14(月) 13:48:13説明がわかり辛くてすみません。
例えば、以下のコードで
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 のように表記したいです。
0392デフォルトの名無しさん
2008/07/14(月) 13:59:501.8.6なら、コンパイルしたディレクトリの .installed.list というファイルに、
インストールしたファイルの一覧があるはず。
sudo xargs rm < .installed.list
0393デフォルトの名無しさん
2008/07/14(月) 14:01:43class Foo
def bar(&block)
def self.baz
p 'lambda'
end
block.call
end
end
Foo.new.bar do
baz
end
0394デフォルトの名無しさん
2008/07/14(月) 14:13:34試してみましたが
undefined local variable or method `baz' for main:Object
とエラーが出ました。
Rubyのバージョンはruby 1.8.6 (2007-06-07 patchlevel 36) [i486-linux]です。
0395デフォルトの名無しさん
2008/07/14(月) 14:31:300396デフォルトの名無しさん
2008/07/14(月) 15:19:48def 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
0397デフォルトの名無しさん
2008/07/14(月) 17:02:29まず、もともとのコードと目的を書いたほうがいい
たぶんそういう風な表記よりも、もっと良い方法がある
0398デフォルトの名無しさん
2008/07/15(火) 00:59:00C言語を書いていたころは
ifdef DEBUG
printf("デバッグ")
end
とか書いて、printfデバッグやってました
rubyだと、デバッグ時にのみ出力したログなどはどのように記述するのが王道でしょうか?
あと、JavaだとeclipseなどのIDEを使いブレイクポイントの指定やステップ実行を行っていました
rubyで同様の機能を持つIDEは存在するのでしょうか?
もし、IDEが存在するならば、コード補完とか可能でしょうか?
rubyの場合、動的型付なので、コード補完は難しいですかね?
よろしくお願いいたします
0399デフォルトの名無しさん
2008/07/15(火) 01:07:45RDE
0400デフォルトの名無しさん
2008/07/15(火) 01:14:22スクリプトの中の最初に指定することもできるし、
ruby に -d オプションをわたして起動させるとオプションが勝手に指定される
warn 'エラー出力に出力' if $DEBUG
とか
require 'logger'
$LOG = Logger.new('log.txt') if $DEBUG
$LOG.info("data is #{data}") if $LOG
とか使う
ブレークポイントは一応 debug.rb に入ってるがあまり期待しないこと
0401デフォルトの名無しさん
2008/07/15(火) 08:31:530402デフォルトの名無しさん
2008/07/15(火) 09:07:06この事リファレンスマニュアルに書かれてないんだが、ML等で今までに誰か指摘してる?
(ruby 1.8.7で確認)
>>400
上の例では$DEBUGで判定しなくても、単にwarnだけでいいんじゃないか?
冗長モードが存在するRubyで、わざわざ$DEBUGで判定する意義はあまりないと思う
0403402
2008/07/15(火) 09:09:39「単にwarnだけでいい」じゃなくて、「if $VERBOSEで判定すればいい」だった
0404デフォルトの名無しさん
2008/07/15(火) 16:57:13他の標準ライブラリのログも一緒に出力される $VERBOSE はとても使いづらい
$DEBUG は名前はいいんだがデバッグモードになって動作が変わるのがちとアレだ
というわけで、何かオリジナルのグローバル変数を設定してそれが真ならログを吐く、というスクリプトにならざるを得ない
0405398
2008/07/15(火) 20:06:14レスありがとうございました
$DEBUGってそのまんまの名前の変数があったんですね、、、
気が付かなかった自分はアフォです
それと、
>というわけで、何かオリジナルのグローバル変数を設定してそれが真ならログを吐く、というスクリプトにならざるを得ない
との指摘を受けましたが、これでも十分対応できそうですね
それか、デバッグ用ログ吐く専用のクラス作って指定したレベルに応じて出力するログの詳細を決定するとかありそうですね
0406デフォルトの名無しさん
2008/07/15(火) 21:04:48つ Logger
0407デフォルトの名無しさん
2008/07/15(火) 21:35:19失礼しました
Log機能なんて、いかにもありそうな機能ですよね(ちゃんと調べてから喋れよ、自分!)
レスありがとうございました。
0408デフォルトの名無しさん
2008/07/15(火) 22:45:11Webアプリで使うデータを外部からを取り込むプログラムを
Rubyで書いてます。
1.その際、そのスクリプトはどこに置くべきでしょうか?
RoRのプロジェクトディレクトリ(?)の外?
2.そのスクリプトからデータベースにアクセスする必要があります。
RoRのコードを極力使いたいと思うのですが、生成された
app/models/foo.rb とかを使うと、Ruby:DBIとかそういうのを
使わずに済みますか?
0409デフォルトの名無しさん
2008/07/15(火) 23:00:591.
script/というディレクトリがあるからそこにおけばよいんじゃないでしょうか。
2.
./script/runner [-e ENV] 所望のスクリプト
とすると該当のRails環境ENVで動きます。(デフォルトはdevelopmentね)
Rakeタスクとして書くのもあり。
lib/tasks/mytask.rake みたいな名前でタスク定義を置く。
Railsのコードを使うなら、
task :mytask => :environment do
...
end
とすると環境変数RAILS_ENVの環境(or development)で動く。
0410408
2008/07/15(火) 23:04:26script ってそういう為にあったんですね。なるほど。
runner で簡単にいけそうですね。ありがとうございます。
rakeタスクも調べてみます。
0411デフォルトの名無しさん
2008/07/16(水) 00:13:26やっぱ公立の学校が無難だろ
0412デフォルトの名無しさん
2008/07/16(水) 00:36:16どういう誤爆?
0413デフォルトの名無しさん
2008/07/16(水) 02:43:140414デフォルトの名無しさん
2008/07/16(水) 04:51:39cp_rでディレクトリのコピーする時、
中にsymlinkなファイルがある時、cp -rLと違う。
0415デフォルトの名無しさん
2008/07/16(水) 08:41:01その説明じゃわからん
0416デフォルトの名無しさん
2008/07/16(水) 13:09:55オブジェクトに加えた変更をハッシュに反映するようにしたいと思います
そのためハッシュツリーの位置を示したポインタが欲しいのですが、
Rubyにはポインタがありません
どうすればポインタ的なことを実現できますか?
0417デフォルトの名無しさん
2008/07/16(水) 13:11:360418デフォルトの名無しさん
2008/07/16(水) 13:14:210419デフォルトの名無しさん
2008/07/16(水) 13:29:030420デフォルトの名無しさん
2008/07/16(水) 13:46:43irb> 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 でアクセスできるようにするとかなんかそんな感じ
0421デフォルトの名無しさん
2008/07/16(水) 14:01:40とすると秒単位で出るみたいなのですが
ミリ秒マイクロ秒で得たいときはどうするのでしょう?
0422デフォルトの名無しさん
2008/07/16(水) 14:03:34ObjectSpace._id2refでオブジェクトの参照得ても、
代入した時点で違うオブジェクトの参照になってしまうので。
420さんのreplaceは、Stringの値を変えているので、別種のクラスのインスタンスに
置き換えることはできません。
確かに変なやり方ですが、ネストされたハッシュが規定なんです。
具体的にいうと、HTTPのリクエストパラメータを、
フォーム管理オブジェクトにバインドして、
そこで処理した結果を、リクエストパラメータのハッシュにも同時に反映させたいんです
参照をオブジェクトにできないというのはRubyの致命的な欠点ではないでしょうか?
0423デフォルトの名無しさん
2008/07/16(水) 14:04:45該当クラスのマニュアルくらい読めやおらー
ttp://www.ruby-lang.org/ja/man/html/Time.html#to_f
こういうのって実行結果が表示されてるとひと目で見てわかりやすいよね
0424デフォルトの名無しさん
2008/07/16(水) 14:04:53to_f
0425デフォルトの名無しさん
2008/07/16(水) 14:06:310426デフォルトの名無しさん
2008/07/16(水) 14:08:35>実行結果が表示されてるとひと目で見てわかりやすいよね
Rubyはこのへん結構手ぇ抜いてるよな
マニュアル書いてる人には自明なんだぜ、きっと
0427デフォルトの名無しさん
2008/07/16(水) 14:24:38そりゃ単にあんたがハッシュオブジェクトを自分から破壊して同一性を破棄してるだけだ
オブジェクトについて語るならもうちょっと勉強しとけ
ハッシュや配列は要素の参照や追加でオブジェクトIDが変更されることはない
= でハッシュの変数にハッシュ全体を上書きしてるとかなんじゃね
個人的にはグローバル変数と同じような危険性を感じるので
self 以外の引数のオブジェクト内部をいじるという処理はお勧めしない
単一オブジェクトの使いまわしは最初は「理知的でカッコイイ」んだが、実際にメンテするともう面倒で面倒で
0428デフォルトの名無しさん
2008/07/16(水) 14:26:46ハッシュの変更をオブジェクトに反映させる必要はないんだよね。なら
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 を直接変更しないようにすればいいんと違うか?
なんかみんな難しい話してるけど俺が読み違えてるのかな。
0429デフォルトの名無しさん
2008/07/16(水) 14:42:39いや、正しい
そもそもの問題として、ほんとうにハッシュなら「オブジェクトIDが食い違って困る」ことのほうが珍しいんだ
オブジェクトIDが違うハッシュの複製をいじったものを返り値として返されても、ハッシュとしては機能するはずだからね
・メソッドの中でハッシュ全体を複製していじってるか、ハッシュを新規に作って更新データを登録している(これありがち)
・なおかつそのメソッドからの返り値は一切利用しない
・その状況でありながら、元のハッシュオブジェクトの中のデータを変更して欲しい
と言ってるように見える
無茶言うな
ハッシュの複製や新規作成をやめるか、複製や新規に作ったハッシュを返り値にして利用するかにしとけ
0430デフォルトの名無しさん
2008/07/16(水) 17:56:18継承されるのがいやなんだけど
0431デフォルトの名無しさん
2008/07/16(水) 18:22:40継承先で別の値入れたい場合はクラス名で場合分けするしかないな
0432デフォルトの名無しさん
2008/07/16(水) 18:25:19アクセサ経由になるのがめんどくせえけど
0433デフォルトの名無しさん
2008/07/16(水) 18:33:30インスタンスメソッド内から見える?
0434デフォルトの名無しさん
2008/07/16(水) 18:42:11変数アクセスをシステム的に禁止することはRubyではそもそもできないよ
定数すら警告だけで2度目の代入が可能な言語だし
「継承したらこれは使わないでください」って赤字でマニュアルに書いておけ
0435デフォルトの名無しさん
2008/07/16(水) 18:45:470436デフォルトの名無しさん
2008/07/16(水) 18:47:51見えない
ただし、その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
0437デフォルトの名無しさん
2008/07/16(水) 19:51:350438デフォルトの名無しさん
2008/07/16(水) 20:14:25Pythonも似たようなもんだろ
0439408
2008/07/16(水) 20:39:09scriptフォルダ以下に自前のスクリプトを置こうとして気づいたんですが、
何でこのフォルダにあるスクリプトはrbという拡張子がついてなくて、
その他のフォルダにあるファイルには拡張子がついているんですか?
0440デフォルトの名無しさん
2008/07/16(水) 20:40:04ぶっちゃけた話、精度や速度には期待しないで
そこだけPerlでPerlのモジュール利用して書くとかにしたほうが正確かもしれない
0441デフォルトの名無しさん
2008/07/16(水) 20:40:51Rails固有の話は基本的にスレ違い
0442439
2008/07/16(水) 20:45:280443デフォルトの名無しさん
2008/07/16(水) 20:56:11return @bar
end
インスタンスメソッド内で見えてるじゃん
0444デフォルトの名無しさん
2008/07/16(水) 21:23:10>>422
>objectのid使っても、読み込みはできますが書き込みはできないですよね
>ObjectSpace._id2refでオブジェクトの参照得ても、
>代入した時点で違うオブジェクトの参照になってしまうので。
これ、どういう意味?
>確かに変なやり方ですが、ネストされたハッシュが規定なんです。
>具体的にいうと、HTTPのリクエストパラメータを、
>フォーム管理オブジェクトにバインドして、
>そこで処理した結果を、リクエストパラメータのハッシュにも同時に反映させたいんです
これも日本語の意味がわからん。コードで書いてくれ。
たとえば x=abc&y=123 があったとして、これが {'x'=>'abc', 'y'=>'123'} になって、そっからどうなるの?
>参照をオブジェクトにできないというのはRubyの致命的な欠点ではないでしょうか?
参照をオブジェクトにするというのはどういうこと? どの言語だったらできるの?
0445デフォルトの名無しさん
2008/07/16(水) 21:25:29http://www.google.co.jp/search?q=Ruby+数値計算
>>439
.rb がついているのはライブラリとして読み込むファイル
ついてないファイルは単独のスクリプトとして実行するファイル
0446デフォルトの名無しさん
2008/07/16(水) 21:28:09どういうこと?Rubyって演算関係ぐだぐたなの?
0448デフォルトの名無しさん
2008/07/16(水) 21:33:32見えてないからnilになってるんだぞ?
0449デフォルトの名無しさん
2008/07/16(水) 21:33:45え、もしかして「速度が気になるならアセンブラで書け」とか言ったりする極論馬鹿ですか?
0450デフォルトの名無しさん
2008/07/16(水) 21:34:460451デフォルトの名無しさん
2008/07/16(水) 21:45:33数値演算のAPIというのがよくわからないが
Mathモジュールのことか?
0452デフォルトの名無しさん
2008/07/16(水) 22:03:270453デフォルトの名無しさん
2008/07/16(水) 22:08:59【三洋薬品】 大日本販売 【社名変更】 [ちくり裏事情]
【肯定/否定】オールインFXってどうよ その21 [ベンチャー]
さすがスレ参加者の質悪いww
0454デフォルトの名無しさん
2008/07/16(水) 22:22:100455デフォルトの名無しさん
2008/07/17(木) 00:01:54ローカル変数かメソッド名かわかりにくくなります
特にvalueなんて、プロパティー名としても、ローカル変数としてもよく使います
そういう混同を防ぐためのコツとかありますか?
0456デフォルトの名無しさん
2008/07/17(木) 00:10:57俺は引数なしメソッドもローカル変数もこっちから見れば値を返す点で一緒だと思ってるからつけないけどな
0457デフォルトの名無しさん
2008/07/17(木) 00:11:430458デフォルトの名無しさん
2008/07/17(木) 00:20:11じゃあ get_〜〜, set〜〜 ?
0459デフォルトの名無しさん
2008/07/17(木) 00:21:490460デフォルトの名無しさん
2008/07/17(木) 00:28:26ローカル変数と区別が付かない=selfなしのアクセサ単独で呼べるコンテキスト
ってことは、インスタンス変数(@valueトカ)を直接読み書きすればいいんじゃないの?
# 確かに、対応するインスタンス変数がないsetter/getterてのもあるが……
0461デフォルトの名無しさん
2008/07/17(木) 00:33:50valueはvalueだろ
0462デフォルトの名無しさん
2008/07/17(木) 00:52:36本スレなりアンチスレなりに移動すればいいんじゃないかなと思う
・・・けど、まあそんなに気になる話題でもないからここでやってる
んだろうなw
とりあえず、最初に無駄に広げる奴が自重しろということだと思った
0463デフォルトの名無しさん
2008/07/17(木) 06:16:430464デフォルトの名無しさん
2008/07/17(木) 08:09:16手っ取り早いんじゃね?
ところでググったときにこんなの見つけた。
http://www.nicovideo.jp/watch/sm3721257
0465デフォルトの名無しさん
2008/07/17(木) 12:23:59Tcl/Tkの勉強をする野田手っ取り早いかも知れない
0466デフォルトの名無しさん
2008/07/17(木) 16:56:24aa,ab,ac→a[a-c]
みたいな操作をしたいのですが
0467デフォルトの名無しさん
2008/07/17(木) 17:13:14むしろそうやって自動で最短の正規表現にまとめられる言語を知りたい
人間の頭で考えて書いたほうが安全確実だぞ
一応、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
0468デフォルトの名無しさん
2008/07/17(木) 17:23:240469デフォルトの名無しさん
2008/07/17(木) 17:33:06migemoがそういう処理をやってたな。
0470デフォルトの名無しさん
2008/07/17(木) 17:39:59どれも未完成で「正規表現パート2」みたいな感じで
頭で考えるの面倒だからツール使う、みたいなもので
動的に使えそうなものではなかった印象がある
0471デフォルトの名無しさん
2008/07/17(木) 18:52:50(クラス定義の中で、宣言的に使うメソッド)
親クラスのクラスメソッドとして定義し、
子クラスで呼び出せるようにしたのですが、
このメソッドが実行されるタイミングではインスタンスが出来ていないので
メソッドの中でアクセスできるのはクラス変数だけですよね
で、複数の子クラスからアクセスさせると、親クラスのクラス変数が
共有で使用されてしまうので、動作が希望したとおりになりません
宣言した内容を、子クラスそれぞれに持たせたいんです
どうするのが正しいやり方なのでしょうか?
0472デフォルトの名無しさん
2008/07/17(木) 18:58:34正しいかどうかは知らないけど、
クラス変数じゃなくて、子クラスのインスタンス変数を使う、とか。
0473デフォルトの名無しさん
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"
0474471
2008/07/17(木) 20:02:37ありがとうございます
attr_accessorみたいな、
クラス定義直下のメソッド呼び出しが実行されるのは、
クラスの定義時ですよね?
class Hoge < BaseHoge
hoge_accessor :fuga,:piyo
end
こういう形で呼び出すメソッドを作りたいんです
クラスの定義時にはインスタンスは存在しないので
hoge_accessor内から
インスタンス変数にはアクセスできないですよね。
attr_accessorも
親クラスにハッシュとして持たせて実現しているのでしょうか。
0475デフォルトの名無しさん
2008/07/17(木) 20:14:15471と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]
0477デフォルトの名無しさん
2008/07/17(木) 20:21:49attr_accessorはリフレクションとeval系メソッドで実現できる
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20070604/273453/?ST=oss&P=1
0478デフォルトの名無しさん
2008/07/17(木) 20:25:08とか書いてたら>>477で書いてた
0479デフォルトの名無しさん
2008/07/17(木) 20:28:55a=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番目のボタンしか変化しません。
どこが不味かったんでしょうか?
0480デフォルトの名無しさん
2008/07/17(木) 21:30:38(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変数に入ってるので加工は面倒かもしれん
0481デフォルトの名無しさん
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
0482デフォルトの名無しさん
2008/07/18(金) 00:37:16たとえばさ、どっかが5になったときに
「おめでとうございます! 5です!」
ってウィンドウを出すとかどうするんだ?
loopで無限ループ作って値をチェックし続ければいいの?
0483デフォルトの名無しさん
2008/07/18(金) 00:40:29「イベント駆動」「イベントドリブン」でぐぐるんだ
RubyやRuby/Tkでどうやるかは知らない
困ったときに調べることにする
0484デフォルトの名無しさん
2008/07/18(金) 03:20:38こういうところに気をつけろとかあったら教えてください
0485デフォルトの名無しさん
2008/07/18(金) 03:44:35「生産性」には期待しないようにすること。
ぶっちゃけ、使えるライブラリの選定・評価からWEBサーバでの動作やエラーの
確認その他、Perl等でのCGIとやることはほぼ変わらない上に、その手の書籍が
少ない(Railsに埋もれてるから?)という茨の道です。
むしろ、趣味の道と覚悟してやった方がいいかと思います。
0486471
2008/07/18(金) 04:01:12BaseHogeに定義したインスタンスメソッドから、
それを継承した子クラスのClassオブジェクトのget_accsessorsを呼ぶには
どう書けばいいのでしょうか?
インスタンスの中から自分のClassオブジェクトを取得できれば
できるのではと思うのですが・・
0487デフォルトの名無しさん
2008/07/18(金) 06:29:01ttp://www.ruby-lang.org/ja/man/html/Object.html#class
0488471
2008/07/18(金) 06:36:14ありがとうございました
classでクラス名が分かるのは知っていたのですが返り値をStringと思っていました
これがクラスオブジェクトだったんですね
0489デフォルトの名無しさん
2008/07/18(金) 09:16:22ちなみにRailsを使わない理由は何?
後、Rails使わない場合でもActiveRecordは使ったほうがいいよ。便利だし。
0490デフォルトの名無しさん
2008/07/18(金) 16:36:230491デフォルトの名無しさん
2008/07/18(金) 16:42:24Array#[]=に「selfの引数番目の要素が5になるんだったらウィンドウ出す」を追加する
というのを思いついた
0492484
2008/07/19(土) 00:20:58イバラの道ですか〜
生産性の高さというか、書いていてイライラしないのでRubyにしました
それまではPHPを使っていたのですが、基本思想が美しくないので
どうやっても美しくならないというか、
書いていて退屈でイライラしてくるんですよね
rubyはそういう退屈さがないので気に入っています
ただ、そういう感覚が、あまり知らないという新鮮さから来るのか、
Rubyの本質的な設計思想に依るのかは、まだよく分からないのですが
>>489
railsは既に重厚すぎる感じがするのと
自由度が欲しいからです
0493デフォルトの名無しさん
2008/07/19(土) 00:55:08merbとか・・・
オススメできるほど知ってるわけじゃないけど、
探せばいろいろあるのでは?
rails以外の情報って、あんまりないから、たしかに茨の道だと思いますけど。
0494デフォルトの名無しさん
2008/07/19(土) 02:43:38まあ、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とか大きすぎずオススメ
0495デフォルトの名無しさん
2008/07/19(土) 07:16:24あれ、こんなところに俺がいる
CGIスクリプトで自由度と軽さが欲しいなら
Rackや、CGI互換ライブラリ(cgisup/cgialt)を使うのがシンプルでお勧め
今使うならたぶんRackの方が良い。WEBrickやFastCGI等への対応がとても楽だ
webrick/cgi(標準添付)も、一応シンプルさという点では優れているが
情報がきわめて少ないのでお勧めしない
0496デフォルトの名無しさん
2008/07/19(土) 09:57:30RackはCGIでは重くない? CGIにはもうちょっと軽いのが欲しいんだけど。
0497デフォルトの名無しさん
2008/07/19(土) 10:44:400498デフォルトの名無しさん
2008/07/19(土) 10:54:44ライトなFWも結構ありますね
自作するにしても参考に出来る部分が多そうです
さっそくerubisの存在を知りました
あとcgi.rbはイケてないということとか・・
Rackを使うのも今後主流になりそうですね
0499デフォルトの名無しさん
2008/07/19(土) 11:24:45本来ならもっとずっと早いうち、具体的には1.6時代、に何か他のCGIライブラリに置き換わるべきだったもの
ちょろっと使うぶんには問題なくて、もっと凝ったものや正しい動作をするものをやりたかったら
自力で実装したほうが早いという困った人たちがML近辺には溜まってたので今までずるずる置き換えが延びた
webrick/cgiに自前で継ぎ足して頑張るというのが正しい姿だが、cgi.rbと同じように使うためのマニュアルすらない状況
0500デフォルトの名無しさん
2008/07/19(土) 11:32:190501デフォルトの名無しさん
2008/07/19(土) 11:56:310502デフォルトの名無しさん
2008/07/19(土) 12:03:31学ぶところの多い、ライブラリなのかな?
ライブラリ読んでみようかって思ってるんで、
これがいい!って奴があったら聞きたいんですが。
できれば、難易度別に
0503デフォルトの名無しさん
2008/07/19(土) 12:09:00ここに
class Index < R '/'
def get
render :index
end
end
ってあるんですが、Rの後ろの'/'はなんですか?
0504デフォルトの名無しさん
2008/07/19(土) 12:11:500505デフォルトの名無しさん
2008/07/19(土) 12:30:56どういう意味があるんですか?クラス名は単なる名前でメソッドではないのでは?
0506デフォルトの名無しさん
2008/07/19(土) 12:31:08Rubyとしてクラスオブジェクトを返せるものなら何でもよい
class Base
CONST='yahoo!'
end
def hoge
return Base
end
class A < hoge
end
p A::CONST
========
"yahoo!"
とここまで書いて、定数をメソッドのように扱うことの話かもしれないと思った
0507デフォルトの名無しさん
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くらい書けよって感じであまり好きではないが、ある程度の市民権は得ている書式だ
0508デフォルトの名無しさん
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
引数カッコを省略したら定数と間違われるから省略すんなと注釈がある
メソッドとローカル変数の関係と一緒か…
0509デフォルトの名無しさん
2008/07/19(土) 13:19:40なるほどですね
ありがとうございました
なんかすごい言語ですね・・
0510デフォルトの名無しさん
2008/07/19(土) 13:26:22クラスオブジェクトに引数をつける用法があるわけじゃない
内部的にはクラス定義とは無関係だ
0511デフォルトの名無しさん
2008/07/19(土) 15:12:19またスレッドセーフか否かをチェックする方法はどのようなものでしょうか
0512デフォルトの名無しさん
2008/07/19(土) 15:32:560513デフォルトの名無しさん
2008/07/19(土) 16:20:11kwsk
0514デフォルトの名無しさん
2008/07/19(土) 16:39:14変数名やメソッド名に関するrubyの一般的な命名規則はどのようなものが存在するのでしょうか?
@が頭についていたらインスタンス変数、@@でクラス変数、などはわかるのですが、それ以外の部分で一般的な命名規則があれば教えて欲しいです
具体的に言えば、Cのハンガリアン記法やJavaのらくだ記法のような、守らなくても動作するけれども、守るのが一般的な規則です
よろしくお願いいたします
0515デフォルトの名無しさん
2008/07/19(土) 16:46:18自分では絶対に見ない人がいるそうだね。
0516デフォルトの名無しさん
2008/07/19(土) 16:58:55ぐーぐるさんにきいたほうがはやいとおもいます
0517デフォルトの名無しさん
2008/07/19(土) 17:01:49http://shugo.net/ruby-codeconv/codeconv.html
0518デフォルトの名無しさん
2008/07/19(土) 17:03:52メソッド名と変数名は大文字で区切ったりせずに全部 _ で区切る
これに沿わないメソッドも少なくないが、とりあえず初心者で自分から書くうちは全部 _ で区切っとけ
Rubyの実際におけるクラスとモジュールの意味的関係は最初は結構曖昧なので、
そのクラスがインスタンス作れたら嬉しいかどうかだけでクラスにするかモジュールにするかを決めてもよし
ずーっとあとになれば、モジュールが好ましいかクラスが好ましいかどうかには気づけると思う
自分用適当スクリプト以外でクラスを作って運用する場合、とりあえずモジュールで括ることが多い
てきとーなモジュール::ファイル名と同等な大きいクラス::細かいクラス
という構造になることがほとんどだ
てか、どっかにこういうの書いてなかったっけ
0519デフォルトの名無しさん
2008/07/19(土) 19:28:04どこかにまとめて書いてあった気がするが忘れた
リファレンスにあったのかもしれないが、いま読み返しても見つからないぐらいなので
初心者が見つけるのは絶望的かもしれない
基本的には>>517の規約を参考にすれば、おおよそ問題ないだろうと思う
>>515
マニュアルのどこに書いてあったか教えてほしい
俺では見つけられなかった・・・
0520デフォルトの名無しさん
2008/07/19(土) 20:23:48添え字アクセスした配列の要素にブロック使いたい
arr[3]{|e| ... }
tap を使えば arr[3].tap{|e| ... } で実現できるんだけど、何もメソッド挟みたくないんだ
0521デフォルトの名無しさん
2008/07/19(土) 20:35:170522デフォルトの名無しさん
2008/07/19(土) 21:37:40class 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は、定数でもないのに、クラス直下に書かれています
これは何でしょうか?
0523デフォルトの名無しさん
2008/07/19(土) 21:46:33いやそのりくつはおかしい
0524デフォルトの名無しさん
2008/07/19(土) 21:52:40「ruby trait」でぐぐると最初にこれがでた。
ttp://d.hatena.ne.jp/sumim/20071105/p1
ようは、moduleよりもさらに動的にメソッドを追加したり変更したりする仕組みのことみたい。
そして、それを実現するライブラリがあって、ramazeはそれを使っているんだろう。
0525デフォルトの名無しさん
2008/07/19(土) 21:59:25Objectにメソッドが追加されていました
RubyTraitsなのかramazeの独自実装なのかはわかりませんが
0526デフォルトの名無しさん
2008/07/19(土) 22:01:02>メソッド定義か何かで、インスタンスに直接ブロックをつけるようにすることはできない?
>添え字アクセスした配列の要素にブロック使いたい
>arr[3]{|e| ... }
文法的に無理みたい
a = [1,2,3]
a[0] {|x| p x }
#=>syntax error, unexpected '{', expecting $end
0527デフォルトの名無しさん
2008/07/19(土) 22:33:18別に何書いてもいいんだよな
class Ruby
puts "#{self}はうんこ"
end
Rubyはうんこ
def と定数しか書いてはいけないと思う時期は確かにある
0528デフォルトの名無しさん
2008/07/19(土) 22:33:37>命名規則に関して質問させてください
>
>変数名やメソッド名に関するrubyの一般的な命名規則はどのようなものが存在するのでしょうか?
>@が頭についていたらインスタンス変数、@@でクラス変数、などはわかるのですが、それ以外の部分で一般的な命名規則があれば教えて欲しいです
>
>具体的に言えば、Cのハンガリアン記法やJavaのらくだ記法のような、守らなくても動作するけれども、守るのが一般的な規則です
いまならRailsをまねするのがいいとおもう
「rails coding standard」でぐぐってみれ
0529デフォルトの名無しさん
2008/07/19(土) 22:36:450530デフォルトの名無しさん
2008/07/19(土) 22:41:560531デフォルトの名無しさん
2008/07/19(土) 22:46:41まあだからこそRuby知らない層が飛びついたとも…
Railsの文法面とか書き方とかは参考にしないほうがいいな
あれは言ってみれば言語内DSLだからRubyに似た別言語と考えたほうがよい
目的志向で割り切って便利に使い倒すのがよろしいかと
0532デフォルトの名無しさん
2008/07/19(土) 22:56:53ぐぐってみた
コーディング規約そのものというより、もっと大きなレベルでの取り決めが多いな
とりあえずHAMLを勧めるのはやめて欲しい
0533デフォルトの名無しさん
2008/07/19(土) 23:03:040534デフォルトの名無しさん
2008/07/19(土) 23:06:130535デフォルトの名無しさん
2008/07/20(日) 00:27:03って
Hash.new{{}}
と同じですか?
0536デフォルトの名無しさん
2008/07/20(日) 00:46:10hash1 = Hash.new{|h,k| h[k] = {} }
hash1['a']['A'] = 'AAAA'
p hash1 #=> {"a"=>{"A"=>"AAA"}}
hash2 = Hash.new{ {} }
hash2['a']['A'] = 'AAAA'
p hash2 #=> {}
後者は元のハッシュに代入しないで単に空のハッシュを返すだけ。
0537デフォルトの名無しさん
2008/07/20(日) 00:53:51あまり最初だとどう試していいかよくわからないけどな
0538536
2008/07/20(日) 02:40:54一次元で実験したら同じ挙動だったので、同じと思い込んでました
ハッシュは素の状態ではネストできないんですね
このようなブロックでは、二次元までしか出来ませんが、
何次元でもネストできるハッシュはないのでしょうか?
hash['a']['b']['c']['d'] = 'A'
といきなり代入できるような
0539デフォルトの名無しさん
2008/07/20(日) 02:58:03多次元とかそういう概念はない
arr[3][5][1][0] は 位置(3, 5, 1, 0)に対応する4次元配列ではなく、
「「「arr[3]の返り値の配列」の5要素目の返り値の配列」の1要素目の返り値の配列」の0要素目
0540デフォルトの名無しさん
2008/07/20(日) 03:05:57hash[ ['a', 'b', 'c', 'd' ] ] = 'A'
のようにキーの集合となる配列自体をキーにしてしまうとか。
0541デフォルトの名無しさん
2008/07/20(日) 05:05:27['a', 'b', 'c', 'd' ]が毎回生成されてHashキーが変わるかと思ったけどそうでもないんだね
0542デフォルトの名無しさん
2008/07/20(日) 05:56:09なんとなくそれっぽいものをちろっと書いてみた。
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 の方が使いやすいかもね。
参照痕だけでも除去できないか…とおもったがいいかげん眠いのでパス。
0543デフォルトの名無しさん
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
0544541
2008/07/20(日) 08:40:46中身同じならhashは同じになるんか 勉強になった
0545デフォルトの名無しさん
2008/07/20(日) 10:50:35535とは別人だが参考になった
さんくす
0546デフォルトの名無しさん
2008/07/20(日) 11:05:44こうなるのは、配列と文字列と数値だけ?
その他のオブジェクトでは、中身?が同じでもhash値はちがうっぽいんですが
0547デフォルトの名無しさん
2008/07/20(日) 11:09:18そうみたい
ttp://www.ruby-lang.org/ja/man/html/Object.html#hash
0548デフォルトの名無しさん
2008/07/20(日) 12:03:150549デフォルトの名無しさん
2008/07/20(日) 12:06:36http://jp.rubyist.net/magazine/?0019-BundledLibraries
Rubyの正規表現では、^と$が文字列先頭や文字列末尾の意味ではなく
行頭・行末の意味だという衝撃の事実を知りました
^[0-9]+$というようなテストに通ってしまうので
勘違いしたまま問題ないと思ってる人多いんじゃないですか?コワス
0550デフォルトの名無しさん
2008/07/20(日) 12:10:40Rubyだけじゃない。PerlやPythonも同じ。
0551デフォルトの名無しさん
2008/07/20(日) 12:13:33出たなハッシュキーシンボル教信者め
ハイフン! ハイフン! ハイフン!
>>549
いやいや Perl でも ^ と $ は行頭と行末だから
vim でも ^ 押すとカーソルが論理行先頭に飛ぶだろ
0552デフォルトの名無しさん
2008/07/20(日) 12:19:56^ は文字列の先頭としか書いてないサイトとかあるし
0553549
2008/07/20(日) 12:24:58あれ本当ですね
今まで勘違いしてた・・
記事の「Perl などの他の言語の正規表現とは意味が違うので気をつけてください」
っていうのも勘違いかな?
0554デフォルトの名無しさん
2008/07/20(日) 13:43:580555デフォルトの名無しさん
2008/07/20(日) 13:44:40同値判定やハッシュコードは、使いやすいように再定義してるわけですよ。
0556デフォルトの名無しさん
2008/07/20(日) 15:26:48dimension == 1 ? {} : Hash.new { |h,k| h[k] = multi_hash(dimension -1) }
end
これ0以下の時無限ループしないのはなぜ?
0557デフォルトの名無しさん
2008/07/20(日) 15:47:48むしろ、無限ループすると思った理由を知りたい
0558542
2008/07/20(日) 16:00:31えーと、無限ループですが、何か?
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の場合多倍長整数だから、永久に戻らない。
無限ループするという彼の言は正しいよ。
0559デフォルトの名無しさん
2008/07/20(日) 16:06:53Hash.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回繰り返して多次元ハッシュの型が作られると思ってる
0560542
2008/07/20(日) 16:20:21別に意地悪ではぐらかすつもりではなかったんだが。
無限ループは適切でないとすると、無限リスト構造と呼べばよかったかな?
0561sage
2008/07/20(日) 17:21:03だいたいわかりました どうもありがとう
もう一つ質問があります
この関数を連続して違う引数で呼び出しても大丈夫みたいです
dimensionの値はどこに残ってるのですか
ハッシュオブジェクトの中? それともマルチスレッドなの?
0562デフォルトの名無しさん
2008/07/20(日) 17:40:32closure
0563デフォルトの名無しさん
2008/07/20(日) 18:07:01rubyはwebappに適してないのではと思ってしまう
0564デフォルトの名無しさん
2008/07/20(日) 18:10:41PerlとRubyではmオプションの効き方が違う。
Perlでは、mオプションが有効なときだけ、^が行頭にマッチする。
Rubyでは、mオプションの有無にかかわらず、^が行頭にマッチする。
0565デフォルトの名無しさん
2008/07/20(日) 18:12:04最初に呼び出されたメソッドのローカル変数(引数含む)と、そこから呼び出された
同じメソッドの変数は、別の領域に確保されてるから上書きされない
「再帰呼び出し」でぐぐれ
0566デフォルトの名無しさん
2008/07/20(日) 20:04:02>>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) はハッシュ生成時に作られたクロージャ
の中にあるので、ハッシュのインスタンスが保持しているのではないし、
もちろんスレッドローカルな領域にあるわけでもない。
0567デフォルトの名無しさん
2008/07/20(日) 20:09:08単にマルチスレッドではないと言いたかっただけなんだ。
0568デフォルトの名無しさん
2008/07/20(日) 20:40:53クロージャはマイクロスレッド(ファイバー)に相当するが、
これを処理するのもマルチスレッドと呼ぶなら
クロージャはマルチスレッドだ。
0569デフォルトの名無しさん
2008/07/20(日) 20:51:150570デフォルトの名無しさん
2008/07/21(月) 07:20:44実戦投入はまだできないレベルですか?
0571デフォルトの名無しさん
2008/07/21(月) 09:06:17あなたの意に添うものになる可能性はゼロでしょう
0572デフォルトの名無しさん
2008/07/21(月) 09:12:15安定版の1.9.1が出るまでは我慢しなさい
あと、速度アップしてると言ってもベンチマーク上での話なので
実戦投入においてどのくらい差が出るかは怪しい
少なくとも「格段に遅い」ということは無くなるだろうが
0573デフォルトの名無しさん
2008/07/21(月) 09:28:420574デフォルトの名無しさん
2008/07/21(月) 09:34:15「Ruby1.9は速い速い!爆速!」とか言ってるのは、1.9への開発を促進させるための
釣り文句みたいなもん。実際は、スクリプト言語がカバーすべき分野においてRubyは
遅くない。単なる数値計算ならそりゃ遅いけど、rubyがやってる分野で遅さがでることは
めったにないし、もしそうだったらC拡張書けばいいだけの話。
Railsとかが遅い遅いって言われてるのも実際はDBがチューンされてなくて遅いだけ。
ベンチマークが付属してるからやってみればわかるけど、Ruby1.9になって
返って遅くなったところもある。Erbとかな。
0575デフォルトの名無しさん
2008/07/21(月) 09:35:08それまでに安定したとしても、本格的なチューニングはまだまだだろう
0576デフォルトの名無しさん
2008/07/21(月) 09:37:47次に遅いのが gem でインストールされたライブラリのメソッド動作
0577デフォルトの名無しさん
2008/07/21(月) 09:41:33自作のライブラリと条件は同じでは?
0578デフォルトの名無しさん
2008/07/21(月) 09:48:15前者はインストール時に依存してたライブラリを基本的に全部 require するわけだから遅いのは当然だわな
0579デフォルトの名無しさん
2008/07/21(月) 10:25:32は?
0580デフォルトの名無しさん
2008/07/21(月) 11:33:30日本語とかが入ってるので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
0581デフォルトの名無しさん
2008/07/21(月) 11:35:50いや1.9.1はクリスマスに出るだろう。
だが安定版かどうかといえば、きっとそうではない。
また「リリースは無事行われるが、それを手にする人は無事ではない」式
0582デフォルトの名無しさん
2008/07/21(月) 12:31:02熟成するまで待つほうがいいみたいね。
0583デフォルトの名無しさん
2008/07/21(月) 13:42:34本質的に、URLエンコードはそういうものなので、既存の%だけは無視するようなものを
自分で作るしかないと思う。
0584デフォルトの名無しさん
2008/07/21(月) 15:00:341.8より遅くなるって、載ってたんですけど、
そうすると、その辺を多用してる、railsとかは却って遅くなったりするんですかね・・
0585デフォルトの名無しさん
2008/07/21(月) 18:18:081.9使ってないから実際のところはしらんけど、それはよく言われていること。
0586デフォルトの名無しさん
2008/07/21(月) 19:34:21gemとライブラリのメソッド動作に何の関係が
0587デフォルトの名無しさん
2008/07/21(月) 20:29:371.9.1って安定するのかwww
0588デフォルトの名無しさん
2008/07/21(月) 21:00:371.9が出たらそれにしなきゃいかん という法律もないべ。
0589デフォルトの名無しさん
2008/07/21(月) 22:53:25世に出てるRubyプログラムは型チェックしないでどうやって整合性保ってるの?
0590デフォルトの名無しさん
2008/07/21(月) 22:56:490591デフォルトの名無しさん
2008/07/21(月) 23:02:33型をチェックする必要がない…というのはちと言いすぎだが、
型のチェックが大事になるようなプログラムというのは実は少数だろ
それ以外の大多数のプログラムを書くためにRubyを使う
0592デフォルトの名無しさん
2008/07/21(月) 23:07:23結局は is_a 関係をチェックしてるというのはまあ隠しようのない事実ではある
0593デフォルトの名無しさん
2008/07/21(月) 23:08:48文字列が来るべきところに数字が来たらどうするかどんなプログラムでも考える必要がある
0594デフォルトの名無しさん
2008/07/21(月) 23:10:390595デフォルトの名無しさん
2008/07/21(月) 23:12:390596デフォルトの名無しさん
2008/07/21(月) 23:20:22if c=="b"
・・・・・・
end
end
s="abcd"
hoge s[1]
0597デフォルトの名無しさん
2008/07/21(月) 23:21:37そうだね。自分もそうしてる。
例えば、文字列を半角にする関数の例だと自分はこうやってる。
nilの場合は、''にして、それからとりあえずto_sして文字列であることを確保してから
本来の処理をする。
本当にその型じゃないと困るというときは型を比較してるけど、やっぱり頻度は少ない。
def to_hankaku(str)
text = str || ''
text = text.to_s
(処理)
text
end
0598デフォルトの名無しさん
2008/07/21(月) 23:25:120599デフォルトの名無しさん
2008/07/21(月) 23:27:04記述が冗長で遅い静的言語という酷いものにしかならんなw
0600デフォルトの名無しさん
2008/07/21(月) 23:31:04ほう
nil.to_s は 何を返すべきだと思う?
Nilクラスのインスタンスの nil ?
文字列 "nil" ?
空の文字列 "" ?
NoMethodError?
0601デフォルトの名無しさん
2008/07/21(月) 23:34:41irb> puts nil.to_s
irb> puts nil
nil
0602デフォルトの名無しさん
2008/07/21(月) 23:46:070603デフォルトの名無しさん
2008/07/21(月) 23:58:460604デフォルトの名無しさん
2008/07/22(火) 01:27:200605デフォルトの名無しさん
2008/07/22(火) 02:19:49学生なんで無料と言うところに引かれてきました
自分のような初心者には難しいでしょうか?
将来的にネットワーク関係とか、画像処理とかを見てみたいです
0606デフォルトの名無しさん
2008/07/22(火) 02:31:48文字列処理も普通に得意だ(詳しい人黙ってるように)
画像処理はわりと苦手(外部プログラムの使い方を学ぶ必要がある)
一般論として、プログラミング初心者にとってはRubyは難しい言語ではない
プログラミングという行為自体に合わない人というのは一定数いるが、そういう人でさえなければ普通に使えるはず
ただ、もし、あなたがWindowsしか持っていなくて、プログラムというものが
たとえばワードやインタネットエクスプローラーのようなものしか思いつかないとしたら、
Rubyはそういうプログラムを作るのには向かないので、他のプログラム言語を使うといい
0607デフォルトの名無しさん
2008/07/22(火) 08:21:490608デフォルトの名無しさん
2008/07/22(火) 11:57:280609デフォルトの名無しさん
2008/07/22(火) 12:02:17つってもよく考えると当たり前だよな
0610デフォルトの名無しさん
2008/07/22(火) 15:09:29というより、書いてあることに対しても何も言ってない。
目隠ししたまま書ける。
0611デフォルトの名無しさん
2008/07/22(火) 15:18:520612デフォルトの名無しさん
2008/07/22(火) 16:09:401
富士の樹海
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
のように奇数番目の正規表現で分けてやってますが、
位置が決まってるんだからもう少し賢いやりかたがあると思うのですが
わかる方お願いします
0613デフォルトの名無しさん
2008/07/22(火) 16:20:420614デフォルトの名無しさん
2008/07/22(火) 16:23:36まあいいや
0615デフォルトの名無しさん
2008/07/22(火) 16:36:40万一 test.dat のファイルの最後が改行で終わってない場合、>>613では最後のペアを取得することができない
File.open('test.dat', 'r'){|f| f.read}.scan(/(.+?)\n(.+?)$/)
これでよろしく
0616デフォルトの名無しさん
2008/07/22(火) 17:12:12scanなんてものがあるんですね、
入力から一発で変換できるのでコレがベストっぽいです
ありがとうございました
0617デフォルトの名無しさん
2008/07/22(火) 18:01:56こりゃ便利だなあ
0618デフォルトの名無しさん
2008/07/22(火) 21:27:040619デフォルトの名無しさん
2008/07/22(火) 22:31:22バックエンドにRubyのプロセスを複数立ち上げてリバースプロキシするのが
普通のようですが、
立ち上げるプロセス数ってどうやって決めるのでしょうか?
0620デフォルトの名無しさん
2008/07/22(火) 22:42:15勘
いやマジで
何か計算式があるわけじゃないし、何か目安があるわけでもない
そのへんは実際に動かしていろいろ決める他のWebシステムと変わらないな
0621デフォルトの名無しさん
2008/07/22(火) 22:48:08そういう目的に使うプログラムってありますか?
0622デフォルトの名無しさん
2008/07/22(火) 22:51:52数値を取ってみるとか。
JMeterでもいいかもしれん。
0623デフォルトの名無しさん
2008/07/22(火) 23:18:02また知らない関数が…しかも速い
each_sliceって1.8,6で追加されたもの?
0624デフォルトの名無しさん
2008/07/23(水) 00:20:07require 'enumerator' すれば 1.8.6 でも使える
ファイルが大きい場合は正規表現 (.+?)\n(.+?) が重いから each_slice がよく動く
…というか、enumerator を読み込んでいいのなら each_slice がたぶん一番速い
言ってみれば、配列の要素を先頭から n 個ずつ取って新規配列に入れていくだけのシンプルな処理だから
あと Ruby には関数は存在しない
0625デフォルトの名無しさん
2008/07/23(水) 00:33:480626デフォルトの名無しさん
2008/07/23(水) 00:40:240627デフォルトの名無しさん
2008/07/23(水) 00:43:55そこまでやらなくてもとは思うが、ある程度用語はしっかりしたものを使って欲しいとも思う
意外なところでトラブルの元になったりするし
0628デフォルトの名無しさん
2008/07/23(水) 00:46:46関数って言葉を使うってことはC系列のプログラミング言語の経験があるってことなんだろうけど
0629デフォルトの名無しさん
2008/07/23(水) 00:46:46伝統的なワーカスレッドの決定方法だけど
0630デフォルトの名無しさん
2008/07/23(水) 00:47:27関数と呼ばれたりするけどね
0631デフォルトの名無しさん
2008/07/23(水) 00:56:19つか、それは「StringIO は IO クラスと同じ動作をします」と同じくらい胡乱
0632デフォルトの名無しさん
2008/07/23(水) 00:57:080633デフォルトの名無しさん
2008/07/23(水) 00:57:360634デフォルトの名無しさん
2008/07/23(水) 08:33:30Smalltalkやった人は-ectシリーズ慣れてるんだけどねぇ。
0635デフォルトの名無しさん
2008/07/23(水) 09:01:47detect と select のほうは find_all と find だ
0636デフォルトの名無しさん
2008/07/23(水) 21:22:15今rubyで
「XPathとDOMが相互変換できるライブラリ」
というものを探しています。
結構調査してるのですが、なかなか見つからず。。
どなたか教えてください。
0637デフォルトの名無しさん
2008/07/23(水) 21:42:29皮肉にも紛らわしさを裏付ける結果になったな。
0638デフォルトの名無しさん
2008/07/23(水) 22:17:35ないと思います
他の言語でそういうのがあれば紹介してください
0639デフォルトの名無しさん
2008/07/23(水) 22:21:52ご回答ありがとうございます。
無いですか、そうですか。。。
XPath文書→DOM文書に変換
って片側通行だけのでも良かったのですが。。
0640デフォルトの名無しさん
2008/07/23(水) 22:29:30XPath文書とかDOM文書が何を指しているのかわからんけど
REXMLでならXPathでelementを検索できたと思う
0641デフォルトの名無しさん
2008/07/23(水) 22:41:16それくらいぐぐれよ
8件しかねええええええええ
ttp://www.google.com/search?num=50&hl=ja&q=%22XPath%E6%96%87%E6%9B%B8%22&lr=lang_ja
0642デフォルトの名無しさん
2008/07/23(水) 22:41:36BitClust、mailread.rb、WEBrick、BitChannel
ものがあげられています。
Ruby には Perl の Plagger のようなお手本はないの? - gan2 の Ruby 勉強日記
http://d.hatena.ne.jp/gan2/20080721/1216634044
ところでこれらのソースを読み漁るのによいツールはありませんでしょうか?
コードレビューツールというような感じのものです。
0643デフォルトの名無しさん
2008/07/23(水) 22:42:19XPathはアクセス方法だけじゃないか?
変換とはどういう意味だろうか。
0644デフォルトの名無しさん
2008/07/23(水) 22:48:12どっちもXML的なアレを触る手段で、フォーマットじゃないっしょ。
>>642
地味なところでいうとrdefs。
るびまの添削連載から辿れる。
0645642
2008/07/23(水) 22:52:16>>644
redefいいですね。メソッド列挙できるんだ
ありがとうございます。
0646デフォルトの名無しさん
2008/07/23(水) 22:58:47度々のご回答ありがとうございます。
XPath、DOMも調査段階で自分なりに調べた程度だったもので。
やりたいこととしては
DOMを扱って処理するプログラムがあったが、急遽XPathも扱うことになった。
だからXPath→DOMにして、プログラムで処理をしたい・・・。
そんな感じなんだと思います。
「思います」というのは、私に知識が無いのと、作る機能が掴めない状態なもので。
申し訳ないです。。
0647デフォルトの名無しさん
2008/07/23(水) 23:04:29DOMを使って触るなら、どういう手順になるか、みたいな
コンパイラのようなものほしいわけ?
0648デフォルトの名無しさん
2008/07/23(水) 23:13:59そのコンパイラのようなものの
ご教授をお願い致します。
※手順、処理の流れ等なんでもOKです
0649デフォルトの名無しさん
2008/07/23(水) 23:16:39どうでもいいがこれでは回答無いのもむべなるかなって感じだ
ttp://oshiete1.goo.ne.jp/qa4199017.html
0650デフォルトの名無しさん
2008/07/23(水) 23:17:040651デフォルトの名無しさん
2008/07/23(水) 23:18:42普通に考えるとどっちも使えるライブラリを既に入れてるはずなんだけどな
NIHでもあるのだろう
0652642
2008/07/23(水) 23:26:09ソースの色分け、クラス構造のツリー表示、
定義元へのジャンプ等一通りの機能がついていたので、
これでコードリーディングしてみようと思います。
ありがとうございました。
0653デフォルトの名無しさん
2008/07/24(木) 00:21:040654デフォルトの名無しさん
2008/07/24(木) 00:22:59普通に使ってる分には。
0655デフォルトの名無しさん
2008/07/24(木) 01:55:30Array#reverse_each_indexはありません。こういう風に書きたいんです
ary.reverse_each_index do |i|
#・・・・
end
今はこうやっているんですが、ちょっと汚いなあと
もっとうまい方法はありませんか?
ary.reverse.each_index do |index|
i = ary.size - index - 1
#・・・・
end
0656デフォルトの名無しさん
2008/07/24(木) 02:03:26(ary.size-1).downto(0) do|i|
end
とか
0657デフォルトの名無しさん
2008/07/24(木) 02:11:10ありがとうございました
0658デフォルトの名無しさん
2008/07/24(木) 17:27:17日本語文字列を puts で表示したいんですが、普通に puts とだけ書いて文字列を表示させると、
文字エンコードの関係で端末表示がすごいことになる可能性があります。
そこで、 puts result.toeuc とか書きたいんですが、実行者の端末が日本語 EUC だとは限りませんよね。
「puts のとこの toeuc の部分を自分の環境に合わせて適宜書き換えてね」と言ってもいいんですが、
puts が何個もあるとさすがに面倒だろうなと思います。というか、自分なら面倒でやりたくありません。
何かわかりやすくてうまい方法はありませんか?
output に溜めて最後に一括変換一括表示というのは、puts したい文字列の文字エンコードが複数あるのでやりたくないです。
0659デフォルトの名無しさん
2008/07/24(木) 17:45:410660デフォルトの名無しさん
2008/07/24(木) 18:46:390661デフォルトの名無しさん
2008/07/24(木) 21:58:20何のことはない文字コードを%r{}sとしてShiftJIS指定したら
マッチした。それまでは意味不明なエラーが・・・
しかもnkfライブラリというものが入ってるらしいね
後で入れなきゃいけないと勘違いしてて
それなら(ソースごと配布する時に)めんどくさいから、
利用するのやめとこうと思ってた。
0662デフォルトの名無しさん
2008/07/24(木) 22:04:32print "#{str.toeuc}\n"
end
と require の直後に書かれてればわかるかも
0663デフォルトの名無しさん
2008/07/24(木) 22:26:54メソッド名は適当に変えれ
class String
def tolocal ; Kconv::kconv(self,Kconv::AUTO) ; end
end
puts '日本語'.tolocal
0664デフォルトの名無しさん
2008/07/24(木) 22:39:33ruby標準ライブラリにHTMLパーザって無いんでしょうか?
0665デフォルトの名無しさん
2008/07/24(木) 23:11:52XMLパーサのREXMLならあるが、HTMLのいい加減さに対しては無理があるな。
つーか、初心者が1.9使ってはいかんよ。
0666デフォルトの名無しさん
2008/07/24(木) 23:14:01仕様がどんどん変わってるんだし(今はもう落ち着いたのかな?)
make test-allなんてやるとrindaが未対応なのを未だに晒してて恥ずかしいけどね。
対応する気がないならはずせばいいのにね。どうせ誰も使ってないんだし
0667デフォルトの名無しさん
2008/07/25(金) 00:16:450668デフォルトの名無しさん
2008/07/25(金) 10:35:01現時点では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変換の定数などが存在しないため)となっています。
0669デフォルトの名無しさん
2008/07/25(金) 10:41:210670デフォルトの名無しさん
2008/07/25(金) 10:45:550671668
2008/07/25(金) 12:09:58ありがとうございます!
レン鯖なのでUconvはあきらめてたのですが、
言われてもう一度調べてたらPureRuby版があったことに気づき、
さっそく試してみたところ、解決できたようです。
よかった・・・
>>670
非公式に(?)Rubyがこっそりインストールされてる鯖で、標準ライブラリしかないんです。
たいしたことやってないので今のところは間に合ってるんですが^^
0672デフォルトの名無しさん
2008/07/25(金) 15:24:05何言ってるかわかんね レン鯖なのでUconv・・・のレン鯖って何?
breakとnext間違えてるのを使ったことないデバッガで
何時間もかけてやっと気づいた
いやーデバッガ使えるって便利だねw なかったらどうなってたかわからん
ほんとに助かる
0673デフォルトの名無しさん
2008/07/25(金) 15:42:170674デフォルトの名無しさん
2008/07/25(金) 15:42:24というか、チラシの裏でおk
0675デフォルトの名無しさん
2008/07/25(金) 17:18:46railsのform_forのcheck_boxで、デフォルトでチェックされた状態にすることは可能でしょうか?
0676デフォルトの名無しさん
2008/07/25(金) 19:26:29ttp://pc11.2ch.net/test/read.cgi/php/1207425569/
0677デフォルトの名無しさん
2008/07/25(金) 21:10:41val = *row.search("//td/text()")
あと、Ruby のチュートリアルとかでよいのがあれば教えてください。
0678デフォルトの名無しさん
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]
おそらくはこれの効果を狙ってたんだろう
0679677
2008/07/25(金) 21:47:56詳しい説明ありがとうございます。
Mechanizeってのを使ってますが、中でHpricotを使ってるみたいなので、
Hpricotのsearchだと思います。
0680デフォルトの名無しさん
2008/07/25(金) 21:54:56リファレンスマニュアル>Rubyの文法>演算子式>代入>多重代入
ついでだから
リファレンスマニュアル>Rubyの文法>メソッド呼び出し
も読んどけ
0681デフォルトの名無しさん
2008/07/25(金) 22:20:00form_forなら、対象ARの該当属性をtrueにしておけばいいよーな。
0682デフォルトの名無しさん
2008/07/25(金) 22:22:15>>676
0683デフォルトの名無しさん
2008/07/26(土) 00:07:06算出プログラムで以下の部分の意味が分かりません。前から順番に読んでいってるのに
いきなり配列っぽい文法が出てきて困っています。この本、初心者が読む本じゃないんでしょうか?
特に2行目の[0]ってなんですか?
#最初の行の値を初期化する
dm[0]=(0..self.length).collect{|i| i * ins}
fill=[0]*[self.length-1]
0684デフォルトの名無しさん
2008/07/26(土) 00:10:39>本書は、Rubyの広範囲なプログラミングテクニックについて解説したものである。
>大半が実践的内容となっており、Rubyプログラミング経験者が対象になると考えられる。
>そのため、Ruby初心者には理解が難しいかもしれない。
0685デフォルトの名無しさん
2008/07/26(土) 00:19:13self の 大きさマイナス1のぶんだけ [0, 0, 0, 0, ..., 0] を作るんだ
レーベンシュタイン距離を筆算で出せてRubyで記述できる人じゃないと一発で読み解くの無理だろうな
0686デフォルトの名無しさん
2008/07/26(土) 00:24:21irb(main):001:0> [1,2,3]*3
=> [1, 2, 3, 1, 2, 3, 1, 2, 3]
って辺りで納得してくれ。
0687デフォルトの名無しさん
2008/07/26(土) 00:25:58えっ、それって[3,6,9]になるんじゃないんだ
0688デフォルトの名無しさん
2008/07/26(土) 00:29:46じゃあ [1, 2, 3] + 3 は [4, 5, 6] になっていい?
0689デフォルトの名無しさん
2008/07/26(土) 00:33:26その辺をRubyがどう解釈するのか勉強たりないや
0690デフォルトの名無しさん
2008/07/26(土) 00:37:22配列はまだ分からないのですがこんな感じのことでしょうか?
fill=[]
for i in 0..self.length-1
fill[i]=0
end
>>686
すみません、初心者なのでむしろ分かりませんw
0691デフォルトの名無しさん
2008/07/26(土) 00:44:23fill = []
0.upto(self.length-1) { |i|
fill << 0
}
こうやってそうだが、
[0]*[self.length-1]
これでもいいのか
0692デフォルトの名無しさん
2008/07/26(土) 00:46:14まあリクツ上はダメじゃないんだが、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]
0693デフォルトの名無しさん
2008/07/26(土) 00:52:01でも高かったのでもう少し頑張ってみます
ところで100ページぐらい読みましたが、幾度となく注釈に
「ruby1.9.0より動作が変わる予定です」とか書いてます。
1.9.0って地雷なんですか?
0694デフォルトの名無しさん
2008/07/26(土) 00:56:49その本自体はかなり良い本だ(サンプルの題材が若干変だけど)
あと、Ruby1.9.x は過去のしがらみを捨てて新しく使いやすいRubyを目指したもの
過去との書き方や動作とは全く違うという場面が多いからそういう注釈がついてるのだろう
0695デフォルトの名無しさん
2008/07/26(土) 00:57:55irb> a = [0] * [1]
TypeError: can't convert Array into Integer
動かないんだけど、答えてる人はどんな結果になる?
0696デフォルトの名無しさん
2008/07/26(土) 01:00:53話の流れから考えると、>>691のは単なる記述ミスだろう
0697デフォルトの名無しさん
2008/07/26(土) 01:01:10[0] *1
なら上手くいった
本の誤植?
俺は横から質問してる方だけど
0699デフォルトの名無しさん
2008/07/26(土) 01:05:29fill=[0]*(self.length-1)
でした
0700デフォルトの名無しさん
2008/07/26(土) 01:12:43わからないことがあったら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>
なんてやれば、どうなるか直ぐ確認できるよ
0701デフォルトの名無しさん
2008/07/26(土) 01:19:59Rubyのブロックつき写像はRubyっぽさが出てて素敵だと思う
ちなみにPythonでは map(lambda x: x * 3, [1, 2, 3]) と書く
無名関数を使わなければならない場合はRubyのほうが見やすいね
0702デフォルトの名無しさん
2008/07/26(土) 01:21:53皆様ありがとうございました。
本は最後まで読まないと気がすまないほうなので分からないなりに
一回は最後まで目を通したいと思います
また質問するかもしれませんがよろしくお願いします
0703デフォルトの名無しさん
2008/07/26(土) 02:02:36使用がよくわからないからif文と正規表現ばっかり使ってるけど
それでいいことがあったのか
0704デフォルトの名無しさん
2008/07/26(土) 02:13:56こっちは君が何を指して喋ってるのかわからなくて怖いよ
0705デフォルトの名無しさん
2008/07/26(土) 02:14:52かなり近所のようだが
0706デフォルトの名無しさん
2008/07/26(土) 02:44:58多重代入とかメソッド使ってると仕様が変わって動かない・・・
刷新するっていってもそんなに刷新しない? わからないので
言ってること変でサーセン
text == ("abya" || "ahya" || "gugege")
この書き方するとどれかに当てはまっても
falseみたいだね 文字列型の条件式は
注意しないとやはりまずいのか
同じオブジェクトでないと同じとみなされないが、
例外的に二つのオブジェクトを等号でつなぐと
値が同じがどうかが判定されるために
当てはまる条件緩くするとtrueがfalseになる、
という風に見える
あってるかどうか知らないけどこじつけて覚えとこ
0707デフォルトの名無しさん
2008/07/26(土) 02:56:42は常に一番左の true である 'abya' を返す
演算子 || は左辺から順に評価して true を探すだけだ
選択を行いたいなら
text == "abya" || text == "ahya" || text == "gugege"
["abya", "ahya", "gugege"].include?(text)
とかきちんと書いてくれ
0708デフォルトの名無しさん
2008/07/26(土) 03:05:23○ 真を探して返す
0709デフォルトの名無しさん
2008/07/26(土) 05:45:22プログラムを習い始めた時、何でこれがダメなのかわからなかったよ
学校の先生も正しくは教えてくれなかった
わかりはじめたのは演算子の優先順位を知ったあたりかな
0710デフォルトの名無しさん
2008/07/26(土) 06:32:190711デフォルトの名無しさん
2008/07/26(土) 10:25:48text == "abya" || text == "ahya" || text == "gugege"
が希望通りに動作するというのは一見して理解できるが
text == ("abya" || "ahya" || "gugege")
が駄目な理由というのはちと直感に反する、というか最初は絶対こう書く
注意深く追うと変な動作を期待してるってのはわかるんだがね
>>706の理解は変だが
0712デフォルトの名無しさん
2008/07/26(土) 10:30:10> 最初は絶対こう書く
みんな、そんなに始めからフリーダムなの?世界観が変わるわw
普通は、「書いたとおりに動く」っていうのをまずたたき込まれるん
じゃないの?
0713デフォルトの名無しさん
2008/07/26(土) 10:34:52このへんになると演算子の動作とかを自分で考えて書き下す頃合のはず
ここで引っかからないのはセンス持ちかコピペ君かどっちかだな
0714デフォルトの名無しさん
2008/07/26(土) 10:40:49??
if( ほげ || ぱげ || もげ ) { ほげほげ }
いや、普通に初歩の初歩ですが。
「教わる」場合、AND・ORの論理演算すら教えてもらえないって
いうのは無いんじゃないかな?
0715デフォルトの名無しさん
2008/07/26(土) 10:52:12↓ これが、多分「習う」書き方。
( str == 'aaa' || str == 'bbb' )
↓ これは、多分(普通には)習わない書き方。
str == ('aaa' || 'bbb')
後者の方をよくわからずに書いちゃう人間は、それこそ
ダメセンス持ちかコピペ君かどっちかじゃね?
0716デフォルトの名無しさん
2008/07/26(土) 10:52:48他人にもの教えるときには気をつけたほうがいいぞ
0717デフォルトの名無しさん
2008/07/26(土) 10:56:18自分ひとりしかいない環境で育ってきた人は「間違うなんてありえない」と言うだろう
0718デフォルトの名無しさん
2008/07/26(土) 10:58:400719デフォルトの名無しさん
2008/07/26(土) 11:33:060720デフォルトの名無しさん
2008/07/26(土) 12:03:19初心者はいるだろJK
a < b < c で (a < b) && (b < c) になる言語を除く。
0721デフォルトの名無しさん
2008/07/26(土) 12:49:40["aaa","bbb"].include? s
0722デフォルトの名無しさん
2008/07/26(土) 12:52:010723デフォルトの名無しさん
2008/07/26(土) 12:53:27>>707
0724デフォルトの名無しさん
2008/07/26(土) 15:00:390725デフォルトの名無しさん
2008/07/26(土) 15:32:52昔は最初の言語としてCをやることが
多かったからCのif文で同じようなことやってる奴はいたわな
最近の学生はrubyでプログラミング始めるの?
恵まれてるのか恵まれてないのか微妙だけど
時の流れを感じるな
0726デフォルトの名無しさん
2008/07/26(土) 15:39:15こういうコンピュータ関連の本は入荷を激烈に絞るから、売り切れは人気のバロメータにならない
たとえば、3冊だけ入荷したのが2度売り切れたからといって、大人気とは言えんだろ
まあ、実際には都会の本屋で売り切れって程度にはわりと売れてるわけだが…
Gaucheの本があっさり重刷かかったときもビビったが、なにかあるのかね
0727デフォルトの名無しさん
2008/07/26(土) 15:45:55実際に必要なのは変数宣言とバイナリ列とポインタの操作ではなく
データを格納した配列と文字列の操作と正規表現であるということに
やっと皆が気づいたのだよ
いやわりとマジで
ふだん必要とされるのはデータをいじって結果出すことだろ
プログラムを作ることそのものじゃない
0728デフォルトの名無しさん
2008/07/26(土) 15:47:230729デフォルトの名無しさん
2008/07/26(土) 15:49:03%w:foo bar baz:.each(&:require)
なんでできないのん?
0730デフォルトの名無しさん
2008/07/26(土) 15:50:01経済とか生物学部の学生ならそれでいいけど
情報系はもちろん数学や物理の学生は計算機の仕組みを
意識させるためにCからやって欲しいね
0731デフォルトの名無しさん
2008/07/26(土) 15:53:29その書き方だと
'foo'.require
'bar'.require
の意味になる。
さあString#requireを定義するんだ。
0732デフォルトの名無しさん
2008/07/26(土) 15:59:00ブロックつきメソッドで require はむしろカッコ悪いと思うんだが
%w(foo bar baz).each{|e| require(e)}
0733デフォルトの名無しさん
2008/07/26(土) 16:00:25いらねーよ
Cで書かなければならない(状況に陥った)人だけ勉強しろ
全員に最初から学ばせる理由はもはやゼロだ
0734デフォルトの名無しさん
2008/07/26(土) 16:04:31できました
でも細工無しで[].eachなんとかって形でできればもっといいと思いました
>>732
僕はlispで(apply 'load file-list)ってやるみたいで格好いいと思いますけど
ブロック付きメソッドの記法を使うところだけなら同感ですが
0735デフォルトの名無しさん
2008/07/26(土) 16:06:250736デフォルトの名無しさん
2008/07/26(土) 16:14:380737デフォルトの名無しさん
2008/07/26(土) 16:16:280738デフォルトの名無しさん
2008/07/26(土) 16:27:16頭のいいやつが楽をするために使ってる場合と
他の言語が使えない頭悪いやつが使ってる場合があるみたいよ
0739デフォルトの名無しさん
2008/07/26(土) 16:29:300740デフォルトの名無しさん
2008/07/26(土) 16:33:22素質さえあれば誰でもある程度はできる
素質がないと、指短い人がギターやピアノ弾きにくいのと同程度には辛い
使えるようになるまでがめっちゃ小難しい言語というのは稀にあるが、少なくともRubyはそうじゃない
0741デフォルトの名無しさん
2008/07/26(土) 16:38:15効率を度外視して毎回loadで呼べばいいじゃない。(.rb限定)
0742デフォルトの名無しさん
2008/07/26(土) 16:40:38例えばCやその子孫と比べて、
何かつまづく要素があるとも思えないが(あえて言うならブロック?)
0743デフォルトの名無しさん
2008/07/26(土) 16:41:35>>733
みたいな考えもあるし
ゆとりの流れが加速し続けなければいいが
0744デフォルトの名無しさん
2008/07/26(土) 16:45:01ブロックとかに凝らなければ簡単だな
ブロックとかprocとか動的にmethod作ったりruby的な技を
駆使したコードを読むときは、かなり困るというか
いまだによく判らなくて泣きが入るときがある
0745デフォルトの名無しさん
2008/07/26(土) 16:47:20いまどきありえない。なに考えてんだ東大。
0746デフォルトの名無しさん
2008/07/26(土) 16:49:160747デフォルトの名無しさん
2008/07/26(土) 16:50:33困ると思うんだが。
どうやってるんだろうね
0748デフォルトの名無しさん
2008/07/26(土) 16:53:490749デフォルトの名無しさん
2008/07/26(土) 16:56:37お前それしか言わないな
0750デフォルトの名無しさん
2008/07/26(土) 17:06:58本家MRIが仕様らしい
例えばJRuby1.0.3は、MRI1.8.5を基準にしている
テストは「Railsが動くかどうか」が一つの目安だそうなw
Rubyの幅広い機能を使ってるんで、動作確認にはちょうどいいんだとか
ただ今後実装が増えてくる事を考えるとさすがに不味いってことで、今はテスト策定中
0751デフォルトの名無しさん
2008/07/26(土) 17:09:040752デフォルトの名無しさん
2008/07/26(土) 17:09:510753デフォルトの名無しさん
2008/07/26(土) 17:19:380754デフォルトの名無しさん
2008/07/26(土) 17:23:21「簡素に記述できる」ってことはそれだけに含まれている意味が多いってことだもんで。
0755デフォルトの名無しさん
2008/07/26(土) 18:44:430756デフォルトの名無しさん
2008/07/26(土) 18:45:470757デフォルトの名無しさん
2008/07/26(土) 18:48:30他の言語はRubyが使えない初心者用に設計されてるし。
0758デフォルトの名無しさん
2008/07/26(土) 18:50:48prologもやってみたいな
0759デフォルトの名無しさん
2008/07/26(土) 18:52:200760デフォルトの名無しさん
2008/07/26(土) 19:00:47だから適材適所だと・・・
初心者スレで釣り針投げるなよ・・・w
0761デフォルトの名無しさん
2008/07/26(土) 19:14:18だから適材適所って話。
初心者は、C/C++。
中級者は、Java。
上級者は、Ruby。
0762デフォルトの名無しさん
2008/07/26(土) 19:33:430763デフォルトの名無しさん
2008/07/26(土) 19:35:45このスレに来たRuby初心者の皆さんは、いろんな言語を触ってみましょう。
0764デフォルトの名無しさん
2008/07/26(土) 19:51:140765デフォルトの名無しさん
2008/07/26(土) 20:05:190766デフォルトの名無しさん
2008/07/26(土) 20:29:250767デフォルトの名無しさん
2008/07/26(土) 20:34:260768デフォルトの名無しさん
2008/07/26(土) 20:46:53関数型の欠点ってなに?
0769デフォルトの名無しさん
2008/07/26(土) 21:05:07lispは皆好き勝手やってて
車輪の再発明しまくりって聞いたことあるな
0770デフォルトの名無しさん
2008/07/26(土) 21:30:30あいつら馬鹿だよ
0771デフォルトの名無しさん
2008/07/26(土) 22:01:55Rubyじゃないこと。
0772デフォルトの名無しさん
2008/07/26(土) 22:09:12さすが夏だな
0773デフォルトの名無しさん
2008/07/26(土) 22:30:33○糸
0774デフォルトの名無しさん
2008/07/26(土) 22:32:210775デフォルトの名無しさん
2008/07/27(日) 01:20:44今のRubyも処理系を再発明しまくりだから
Rubyも馬鹿ばっかりだな
処理系すら作れないやつは黙っとけよ
0776デフォルトの名無しさん
2008/07/27(日) 01:24:56それは作るのが簡単だからでしょ。
ホントに本格的なものを作るとなったら商用のCommon Lisp処理系使うよ。
ていうか、そんな「本格的な」状況になったら、今度はRubyの出番が激減する。
0777デフォルトの名無しさん
2008/07/27(日) 02:13:28Lispってあの難しい奴?
こういう記憶ならある
学校の先生「EmacsはELispというものを書いて使ってくださいねー」
生徒「はーい」
俺:geditでプログラミング
0778デフォルトの名無しさん
2008/07/27(日) 06:43:35こういうのをコミュニケーション能力が低いって言うんだよ。
0779デフォルトの名無しさん
2008/07/27(日) 06:58:42使いたいなら使えって言われても・・・
ぼっちなのが悪いんですね、わかります
RubyTkのマニュアルないかな
英語でもいいんだが、さっき見つけたと思ったら
日本語版探してる内に英語版の場所が・・・
0780デフォルトの名無しさん
2008/07/27(日) 07:38:30ごめんマニュアルあるけどわけわからん
ftextはtextウィジェットなんだけど、
これっておかしい? 何でか動かない
0781デフォルトの名無しさん
2008/07/27(日) 07:51:16別にエディタがそれしか入ってないからじゃない(それもあるが…)
0782デフォルトの名無しさん
2008/07/27(日) 08:12:08>>781
補完機能使いたいけど操作が難しくて諦めてる俺
練習すればいいのかな
0783デフォルトの名無しさん
2008/07/27(日) 08:38:19体鍛えるのは一緒だからって体育の時間ずっとサッカーやってた奴がいたなあ
私立だったので停学食らったけど
0784デフォルトの名無しさん
2008/07/27(日) 08:50:13お前はまずコミュニケーション能力以前に、日本語の能力が欠けている
0785デフォルトの名無しさん
2008/07/27(日) 09:51:29仕様書で正しいのかな
リファレンスか
0786デフォルトの名無しさん
2008/07/27(日) 09:53:00日本語の能力?
日本語を喋る言語能力の事か
日本語を喋る技能が不足してると
日本語の能力とはねw
0787デフォルトの名無しさん
2008/07/27(日) 09:56:11日本語でおk
0788デフォルトの名無しさん
2008/07/27(日) 10:06:43my %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
0789デフォルトの名無しさん
2008/07/27(日) 10:25:24特には無いです
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}
0790デフォルトの名無しさん
2008/07/27(日) 10:27:21a.inject(Hash.new){|h,e| h.store(e,f(e)); h}
こうかな
0791デフォルトの名無しさん
2008/07/27(日) 10:31:12まあいいや、好きなように書いてくれ
このタイプの inject は読みにくい部類に入るから多用は勧めないよ
0792デフォルトの名無しさん
2008/07/27(日) 10:32:18とか
0793デフォルトの名無しさん
2008/07/27(日) 10:56:16from (irb):2:in `+'
from (irb):2:in `f'
from (irb):8
from (irb):8:in `map'
0794デフォルトの名無しさん
2008/07/27(日) 11:00:28irb> ary=[1,2,3]; def f(x); x*2; end; Hash[*ary.map {|x| [x, f(x)] }.flatten]
{1=>2, 2=>4, 3=>6}
0795デフォルトの名無しさん
2008/07/27(日) 11:52:49def 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!とか(難読化に)便利だと思うんですか、無いんですよね
必要なら簡単に書けるからなのかな?
0796デフォルトの名無しさん
2008/07/27(日) 11:57:22(1..3).tap!{|ary|Hash[*ary.map{|x|[x,proc{|x|x*2}.call(x)]}.flatten]}
0797デフォルトの名無しさん
2008/07/27(日) 12:15:37あと、オブジェクトAをオブジェクトBに変換する処理をオブジェクトAのメソッドに負わせるのは必ずしも正当ではない
Hash[*(1..3).map{|e| [e, e*2]}.flatten]
0798デフォルトの名無しさん
2008/07/27(日) 12:26:33字面は便利だけどなんとなく使ったら負けな感じがしててアレだ
0799デフォルトの名無しさん
2008/07/27(日) 12:30:440800デフォルトの名無しさん
2008/07/27(日) 12:31:13えー
to_aとかあるじゃないっすか
>>798
古くはシェルでcat xxx|awk ...とやるように
今ではC#の拡張メソッドをtemplateと演算子オーバーロード、型推論を使ってC++で使うように
別に邪道でもなんでもないと思うけど
0801デフォルトの名無しさん
2008/07/27(日) 12:37:02まー>>795の論拠になるものではないな
使用して3〜4ヶ月目くらいに嬉々として定義して
自分のスクリプト全部で使いそうなメソッドではあるが
0802デフォルトの名無しさん
2008/07/27(日) 12:38:23そうなってないという事はじゃんじゃん使ってもおkという事なんだよ!!
0803デフォルトの名無しさん
2008/07/27(日) 12:38:58るびまとかでアンケート取ると面白いと思う
0804デフォルトの名無しさん
2008/07/27(日) 12:40:070805デフォルトの名無しさん
2008/07/27(日) 12:41:27最優秀賞はRailsに贈られます
審査員特別賞にcgi.rbが選ばれました
受賞者は式典辞退した模様
0806デフォルトの名無しさん
2008/07/27(日) 12:44:10N88basicのような本物のスパゲティーを味わってから言ってください
0807デフォルトの名無しさん
2008/07/27(日) 12:46:44CGI本体は別にいいんだが、TagMakerのあたりがけっこうモヤモヤする
あれをそもそもHTMLジェネレータとして分けようと思わなかったのは何故なんだろうね
>>806
スパゲッティを名乗るならGOSUBくらい存在して欲しいよな
0808デフォルトの名無しさん
2008/07/27(日) 13:47:420809788
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
0810デフォルトの名無しさん
2008/07/27(日) 17:54:300811デフォルトの名無しさん
2008/07/27(日) 17:58:59dict((k, f(k)) for k in ary)
0812デフォルトの名無しさん
2008/07/27(日) 18:01:51どっちかってえと、
「配列のペアをハッシュに一発で変換」
というメソッドの提供を頑なに拒んでるRuby側の問題のようにも思える
0813デフォルトの名無しさん
2008/07/27(日) 18:18:57拒んでるんだ
自分でそれ用のmodule作ってincludeでもextendでも
すればいいんでは
0814デフォルトの名無しさん
2008/07/27(日) 18:25:45ネストしてたりするのを arr.to_h とかでハッシュにできたりすると逆に複雑じゃん?
0815デフォルトの名無しさん
2008/07/27(日) 20:42:30irb(main):011:0> Hash[*arr.flatten]
=> {5=>6, 1=>2, 3=>4}
ホントだ。これで十分だな。
といっても*arrしてる意味を理解できてないんだがw
0816デフォルトの名無しさん
2008/07/27(日) 20:46:040817デフォルトの名無しさん
2008/07/27(日) 21:01:55arr を flatten したのを * つき引数で Hash[] に渡してるんだ
Hash[] は引数を キー1, 値1, キー2, 値2, キー3, 値3, ... というハッシュ候補の連なりとみなす
0818デフォルトの名無しさん
2008/07/27(日) 21:55:23def foo(a,b)
a+b
end
foo(*[1,2]) # => 3
すごい、けど今回の以外には使いどころが思いつきません
他にどういう使い方があるんでしょうあk?
0819デフォルトの名無しさん
2008/07/27(日) 21:58:48=> [1, 2, 3]
irb(main):030:0> a
=> 1
irb(main):031:0> b
=> [2, 3]
0820デフォルトの名無しさん
2008/07/28(月) 00:18:51records = ARGF.readlines.map{|line|
Record.new *line.split(/\s+/, Record.members.size)
}
0821デフォルトの名無しさん
2008/07/29(火) 20:13:59例えば
3列目 + 5列目
みたいな計算がしたいのですが
0822デフォルトの名無しさん
2008/07/29(火) 20:29:200823デフォルトの名無しさん
2008/07/29(火) 21:03:06あ、それRubyではできないんでawk使ってくれ
Rubyでは全部読み込んでから配列へ分割することしかできない
0824デフォルトの名無しさん
2008/07/29(火) 21:06:20一応、Perlを踏襲して -a オプションはある。
ruby -ane 'puts $F[2].to_i + $F[4].to_i'
0825デフォルトの名無しさん
2008/07/29(火) 21:23:33> Rubyでは全部読み込んでから配列へ分割することしかできない
メモリに全部読み込んでからさらに分割するもんだから、超巨大ファイルの場合は大変なことに…
0826デフォルトの名無しさん
2008/07/29(火) 21:24:311行単位の話だろJK
0827デフォルトの名無しさん
2008/07/29(火) 21:57:40#!ruby -n
BEGIN { $count = 0 }
$count += $_.to_i if [3,5].include?($.)
END { puts $count }
0828デフォルトの名無しさん
2008/07/29(火) 22:14:240830デフォルトの名無しさん
2008/07/29(火) 23:12:39俺は Ruby は Thomas+Hunt の Pragmatic Programmer's Guide から入った。
これは波長があったんですんなり使い始められた。
日本語訳「達人プログラマーガイド」もあるけど訳の質は知らん。
題は誤訳に近いと思うから不安を感じるが。
「たのしい Ruby」なんかも良さそうだけど。
OOP って何を勉強したいの?OOP と言っても上段に構えるものじゃなくて
プログラミングをしていて、そのうちなるほどってわかるものだと思うけど。
逆に手動かさなきゃわからない。あまり概念にとらわれず coding した方が良いと思う。
0831デフォルトの名無しさん
2008/07/29(火) 23:51:50>>822
Rubyはオブジェクト指向の学習には向かない(そう、Javaのように)
0832デフォルトの名無しさん
2008/07/29(火) 23:54:290833デフォルトの名無しさん
2008/07/29(火) 23:56:56Rubyで身につくのはRubyプログラミングで有効なテクニックだけだよね
0834デフォルトの名無しさん
2008/07/30(水) 00:21:46rubyだとダッグタイピング指向を推奨する人が多いので、
OOP自体の勉強するには向かないかな。
C++か、Javaのほうが、
OOP指向の本が沢山あるはずだから
有り難みを感じられると思う。
0835821
2008/07/30(水) 03:55:52ありがとうございました。なんとかできそうです
0836デフォルトの名無しさん
2008/07/30(水) 07:35:53>rubyだとダッグタイピング指向を推奨する人が多いので、
>OOP自体の勉強するには向かないかな。
なんでや? ダックタイピングこそオブジェクト指向的ではないか。
型にとらわれず、メッセージを送るのが本来のオブジェクト指向的だと思うけど。
0837デフォルトの名無しさん
2008/07/30(水) 07:42:49書籍見るよりも、自分でプログラム書いたり
人の書いたソースコードを読んだ方が早いと思う
書籍の中で良さそうなのは、>>830で挙げられてるものに加えて
「オブジェクト指向スクリプト言語Ruby」もお勧め。ただし値段が高い&内容が古い
>>832
んなこたねーよ
小規模なプログラムだって、オブジェクト指向使うだけでだいぶすっきりすることが多い
少なくとも「実際のプログラムの対極」なんてことはありえない
「自分の環境ではオブジェクト指向なんて使えない」というのであれば、その辺もっと詳しく
0838デフォルトの名無しさん
2008/07/30(水) 07:42:550839デフォルトの名無しさん
2008/07/30(水) 08:05:22自分がオブジェクト指向プログラミングを「させられている」事に
気が付かないんだろうね
フレームワークの自動生成したクラスにメソッド記述するだけだから
0840デフォルトの名無しさん
2008/07/30(水) 10:27:050841デフォルトの名無しさん
2008/07/30(水) 10:45:19Webサイトにログインしてクッキーを返す、みたいなメソッドを作ります
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, ユーザー名, パスワード)
みたいなよくある形式にも対応してみたいです
0842デフォルトの名無しさん
2008/07/30(水) 11:05:05そこであまりテクニカルにしても却って読みづらい
多少冗長でもそれくらいにしておいてくれると助かる
しかしキーワード引数風のハッシュって流行ってるなあ
0843デフォルトの名無しさん
2008/07/30(水) 12:26:20そんな内部で頻繁に使用されるメソッドにハッシュ引数なんていらねーだろというのはまあその通りだが(w
0844デフォルトの名無しさん
2008/07/30(水) 19:26:01いやマジで
0845デフォルトの名無しさん
2008/07/30(水) 19:28:020846デフォルトの名無しさん
2008/07/30(水) 19:52:57引数の解説したマニュアルも平均してわかりにくいしな
0847デフォルトの名無しさん
2008/07/30(水) 20:27:28rubyのこういう例でも同じようにinithialized?とか用意したら
何とかできるんじゃないかな?とか素人の意見ですがどうでしょう?
0848デフォルトの名無しさん
2008/07/30(水) 20:38:530849デフォルトの名無しさん
2008/07/30(水) 21:03:37いや、俺のような老人だと、Fortran=>C=>C++
ときたんだけど、大規模C++でメモリリークとったりするのにかなり苦労した。
いまみたいにリーク検出してくれるアプリなかったしな。sed, awkでDelete漏れないか
しらべまくるくらいだったわ。
0850デフォルトの名無しさん
2008/07/30(水) 21:05:180851デフォルトの名無しさん
2008/07/30(水) 21:44:54っていう地獄。
C++の暗黒にはもうもどりたくないぜ。。。
0852デフォルトの名無しさん
2008/07/31(木) 00:02:06アナキン君
0853デフォルトの名無しさん
2008/07/31(木) 00:52:40>良い子のみんなはキーワード引数をできるだけ使わないようにしようね!
>いやマジで
なんで?
0854デフォルトの名無しさん
2008/07/31(木) 01:02:19そういうのって設計がおかしいのがほとんど
他にDSLを作るのに役に立つけど、そんなの玄人でも自分で作る人は少ない
0855デフォルトの名無しさん
2008/07/31(木) 01:23:04たくさんメソッドを提供しても仕方あんめー、みたいな感じ
0856デフォルトの名無しさん
2008/07/31(木) 01:51:05変な意味でユーザーフレンドリーな関数作ろうと思うと名前付き引数使おうとする
使いたてのうちは覚えやすくていいけど、だんだんその冗長さにイライラしてくる
最近名前付き引数がデフォの言語作って、保守する度にその時の自分の設計を呪っている
0857デフォルトの名無しさん
2008/07/31(木) 02:13:05しかも URI オブジェクト使ってるもんだからうっかり {:uri => login_uri } とか書いて動かない
0858デフォルトの名無しさん
2008/07/31(木) 02:26:39メソッド増え過ぎで破綻しない?
ああいう時は、こういう手があるのかと感心したんだが
それも設計がおかしいんだろうか
0859デフォルトの名無しさん
2008/07/31(木) 02:26:430860デフォルトの名無しさん
2008/07/31(木) 07:33:39そういうときはハッシュで正解だと思う
htmlの属性は、多くの種類の名前(ほぼ無限)をとりうるわけだから
引数の数が限られている通常のキーワード引数とは質が違うし
ハッシュを使わないとどうにもならない
というか、たぶんそれは「キーワード引数」とは呼ばない
0861デフォルトの名無しさん
2008/08/01(金) 10:30:41ああいうのって毎回数えてる?
内部的に
def size
c = 0
self.each{ c +=1 }
return c
end
とかいうような処理だったりする?
0862デフォルトの名無しさん
2008/08/01(金) 10:52:500863デフォルトの名無しさん
2008/08/01(金) 11:04:500864デフォルトの名無しさん
2008/08/01(金) 11:09:28lengthは内部に保持されてる長さの値を返すだけだった
キャストとかビットシフトぐらいはしてたけど
関数呼び出しはrb_int2inumぐらいかな
まぁ毎回数えるってことはない
0865デフォルトの名無しさん
2008/08/01(金) 11:19:17変数を含まない固定の正規表現は変数に代入するよりそのまま書いてたほうが効率はいいんだっけ?
0866864
2008/08/01(金) 11:20:26ary<<objの度に+1されて
ary_a+ary_bだとary_bの長さだけ<<が呼ばれるような感じ
で長さが変わる処理の前後で正しい長さを保持するのは保障されてるから
size(length)で参照するときはその保持している値を返すだけでおkと
CAPAとかあったからC++で言ったらvectorみたいなものかな?
0867デフォルトの名無しさん
2008/08/01(金) 11:21:58arr.each do |line|
data << line if /hogehogehoge/ =~ line
end
にするか
re = /hogehogehoge/
arr.each do |line|
data << line if re =~ line
end
にするかって話?
0868デフォルトの名無しさん
2008/08/01(金) 11:25:28> ary<<objの度に+1
うん、そんな賢い感じのイメージでいいと思う
Cレベルではあまり潔癖なことはしてない印象
>>867
前者のほうがわずかに速いとか聞いた
0869デフォルトの名無しさん
2008/08/01(金) 11:29:16アカデミックな興味はあるかも知れんが、そういうレベルの効率を
気にする状況ではあまり Ruby なんて使わないんじゃない?
自分で coding しやすい方を選ぶだけでは。少なくとも俺はそうする。
0870デフォルトの名無しさん
2008/08/01(金) 11:37:31ハッシュのキーはシンボルにすると速いんだぜ〜というレベルの話なら興味ない
0871デフォルトの名無しさん
2008/08/01(金) 11:42:48ブロック内の埋め込みの値ってそのブロック内だけの木辿れば参照できるし
ループ回数が多くなってくるとその差*ループ回数分の差がでてくるのは予想できる
でも大した差はでないでしょう
0872デフォルトの名無しさん
2008/08/01(金) 11:48:34・ 存在しないキーを参照したら nil
・ 存在しないファイルを指定しても nil
という変な仕様に文句を言うやつはおらんかったんか?
0873デフォルトの名無しさん
2008/08/01(金) 11:52:160874デフォルトの名無しさん
2008/08/01(金) 12:08:480875デフォルトの名無しさん
2008/08/01(金) 12:21:4321世紀にもなってユーザーレベルで goto 文の変種使って喜んでる奴は臭いから寄るな
0876デフォルトの名無しさん
2008/08/01(金) 14:52:09ちなみに>>872の前者はPStore#fetchを使えばいい。
PStoreはHashに合わせているから連想しやすいと思う。
0877デフォルトの名無しさん
2008/08/01(金) 15:16:49MatzはCとelispが大好きなオールドハッカーだから、そういう仕様なんだろう。
仕様が文書化されてない永続化形式は使っちゃダメ。
YamlとかXMLとか使っときなさい。それが嫌ならplain textのほうがまだマシ
0878デフォルトの名無しさん
2008/08/01(金) 15:59:240879デフォルトの名無しさん
2008/08/01(金) 16:18:17話題がズレてるぞ
>>873の言ってるのはあくまで「PStoreの」仕様であって、Marshalの仕様ではない
0880デフォルトの名無しさん
2008/08/01(金) 16:38:30Marshalのフォーマットは文書化されていると思うけど。
ttp://www.ruby-lang.org/ja/man/html/Marshal_A5D5A5A9A1BCA5DEA5C3A5C8.html
…という話ではない?
0881デフォルトの名無しさん
2008/08/01(金) 17:30:36if !hoge.data.hage.pick.result.empty? then ...
みたいに長いとの先頭の ! が微妙に読み下しにくい
if hoge.data.hage.pick.result.empty? == false then ...
と
if !hoge.data.hage.pick.result != [] then ...
はどっちがいいかな
0882デフォルトの名無しさん
2008/08/01(金) 17:36:240883デフォルトの名無しさん
2008/08/01(金) 17:37:110884デフォルトの名無しさん
2008/08/01(金) 17:39:40前者と後者で処理が微妙に違うのが気になる。
また、素直に日本語的な語順で「emptyではない」と書きたいなら
if hoge.data.hage.pick.result.empty? != true then ...
じゃない?どうやればあなたが読みやすいのかは知らないけど
0885デフォルトの名無しさん
2008/08/01(金) 17:50:28if not hoge.data.hage.pick.result.empty? then ...
0886デフォルトの名無しさん
2008/08/01(金) 17:52:05elsif のとこに入れられないのが難点か
0887デフォルトの名無しさん
2008/08/01(金) 18:22:27俺もthenは書きたい派
英語みたいに読み下せるからね
0888デフォルトの名無しさん
2008/08/02(土) 00:34:34最近は blank? の逆の present? というメソッドも出来たらしい。
0889デフォルトの名無しさん
2008/08/02(土) 01:08:25=> require 'fileutils'
p "hoge"
なんてソースでnextで
p "hoge"に進みたいのですが、
fileutilsのソースに入ってしまいます。
これって仕方ないのでしょうか?
0890デフォルトの名無しさん
2008/08/02(土) 01:20:30fileutilsの中身が表示されるけど、次のnではfileutilsを1行ずつ追わずに
p "hoge"の行に来るんじゃない?
0891デフォルトの名無しさん
2008/08/02(土) 03:00:58次にsession['hoge']を呼び出したり
session['hoge'] = "xxx"とするとエラーになってしまいます。
内容はメソッド[]がない、メソッド[]=がない、というNoMethodErrorです。
環境が少し古く1.8.1なので、書き方が違うのかと思ったんですが
それらしき情報が見あたりません(1.8.7環境では動作しています)
理由のわかる方いますか?
0892891
2008/08/02(土) 03:02:12session.session_idのようなクラスメソッドは大丈夫です。
0893デフォルトの名無しさん
2008/08/02(土) 03:33:55パッチあててなくて、セキュリティホール空きまくりとかだったら、答えるに答えられん
0894デフォルトの名無しさん
2008/08/02(土) 04:33:040895デフォルトの名無しさん
2008/08/02(土) 04:51:21まー確かに若干面倒ではあるんだが
0896デフォルトの名無しさん
2008/08/02(土) 05:42:52例外頼りのプログラミングってなんか格好悪いよな
1990年代って感じだ
0897デフォルトの名無しさん
2008/08/02(土) 07:16:41書き方が違うはずはない(実際、俺は1.8.1でCGI::Sessionを使ったことがある)
おそらく他の箇所に、何かバージョン非互換の書き方があるのだと思われる
これ以上はソースコード見ないと分からん
>>893
レンタルサーバーなら1.8.1が入ってるとかよくある話だよ
0898デフォルトの名無しさん
2008/08/02(土) 10:52:15>キーワード引数が役に立つのって引数が大量にあるようなメソッドでしょ?
>そういうのって設計がおかしいのがほとんど
そうなの?
たとえば Rails では ActiveRecord#find とか、あとは render とかもキーワード引数を使いまくっているけど
これって設計がおかしいのかな。
>>854だったらどう設計しなおすの?
0899デフォルトの名無しさん
2008/08/02(土) 10:57:180900デフォルトの名無しさん
2008/08/02(土) 11:13:12Net::HTTPの返り値がNet::HTTPResponseであるように
あれが {:header=> {...}, :body=>"....", :code=>xxx, ...} というハッシュで返ってきてたらうざい
0901デフォルトの名無しさん
2008/08/02(土) 11:58:03っていう問題があるからなあ。
なるべくならちゃんとRuby世界で意味のあるメソッドとかにしようぜ
0902デフォルトの名無しさん
2008/08/02(土) 12:02:370903デフォルトの名無しさん
2008/08/02(土) 12:11:06というか、Rubyの世界にやってきたJava概念でーすみたいな雰囲気が気に食わない
0904デフォルトの名無しさん
2008/08/02(土) 12:47:24あえて「手を出さない」というのもひとつの正解。
0905デフォルトの名無しさん
2008/08/02(土) 13:39:47> Railsのそういうとこは参考にしたらいかんぞ
だから、find や render はどういう設計にすべきだったわけ?
それを示してもらわないと、キーワード引数を使わないようにしたくても
どう設計したらいいかわからない。
>>900
>Net::HTTPの返り値がNet::HTTPResponseであるように
今は引数の話をしているんであって、返り値の話をしているんじゃない。
0906デフォルトの名無しさん
2008/08/02(土) 14:30:22何が引っ掛かってるのか分からんが、引数も返り値も同じ話だ
データ用のクラス作ればいいのは変わらない
0907デフォルトの名無しさん
2008/08/02(土) 14:35:360908デフォルトの名無しさん
2008/08/02(土) 17:14:40obj = 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
とかすれば一発なんですが、できればこれはやりたくありません。
0909891
2008/08/02(土) 17:15:44ありがとうございます。参考に調べていったところ、解決できました。
まずかった箇所は、CGI::Sessionとは直接関係ない部分のミスから
結果的にCGI::Sessionのエラーのように見えていた、といった感じでした(言葉足らずですが・・)
セキュリティホールの情報についてもたいへん参考になりました。
いくつかチェックしたところ、パッチは当たってないようなんですが、
商用や個人情報を扱うようなプログラム(セッション)ではないこともあり
スクリプト側で解決できる部分をできるだけカスタマイズして対応してみようと思います。
ありがとうございました。
0910デフォルトの名無しさん
2008/08/02(土) 19:36:33class 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が書き換えられてたら動作しないだろうし
そのライブラリを良く読めば、別の場所で何とかできる方法が見付かるかも
0911デフォルトの名無しさん
2008/08/02(土) 21:33:36>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
0912デフォルトの名無しさん
2008/08/02(土) 23:54:59>何が引っ掛かってるのか分からんが、引数も返り値も同じ話だ
なんで引数と返り値が一緒なのかわからんから、教えてくれ。
ぐぐってもそんな話はでてこなかった。
返り値にキーワードつけるというのからしてわからん。
あと、いいかげん具体例を示してくれよ。データ用のクラスを作ればいいってだけじゃわかるかよ。
こっちはRailsの設計を参考にすることが多いから、find や render がどうよくなるのかを知りたいんだよほんとうに。
0913デフォルトの名無しさん
2008/08/03(日) 00:31:30906じゃないが、Javaやったことないの?
あすこにはデータ用クラスなんて腐る程あると思うぞ
0914デフォルトの名無しさん
2008/08/03(日) 00:42:19・メソッドの引数が、キーワード引数的なHashだと使いづらい
・メソッドの返り値が、キーワード引数的なHashだと使いづらい
という話
「返り値にキーワードをつける」に関しては、>>900にそのものズバリな具体例があるだろ
データ用クラスの作り方に関しては、webrick関連のマニュアルや記事読め
(とくにWEBrick::Request、WEBrick::Responseの周り)
Railsの設計は知らないから他の人に任せる
0915デフォルトの名無しさん
2008/08/03(日) 00:44:08Hash使え
0916デフォルトの名無しさん
2008/08/03(日) 00:49:06Hashでいいと思う
クラス作ったら仕様考えるのが面倒
Hashなら適当でいい。
だが、何かを犠牲にしてるような気も
0917デフォルトの名無しさん
2008/08/03(日) 00:55:41引数に渡すためだけにHashクラスのインスタンスを作ることについて一言
0918916
2008/08/03(日) 00:56:51性能気にするなら別の言語使うし
0919デフォルトの名無しさん
2008/08/03(日) 00:58:13引数に渡すためだけにデータ用のクラスのインスタンスを作ることについて一言
0920デフォルトの名無しさん
2008/08/03(日) 01:02:53そのときの引数はどうするの
0921デフォルトの名無しさん
2008/08/03(日) 01:11:09その設問には意味がない
スクリプト中でHashのインスタンスを数十個作るのも自作データクラスのインスタンス数十個作るのも
実コスト的にはほとんど変わらないだろ
自作データクラスを使わないのなら、ハッシュも使わないというのが一貫した態度だと思わない?
0922デフォルトの名無しさん
2008/08/03(日) 01:14:570923916
2008/08/03(日) 01:19:310924デフォルトの名無しさん
2008/08/03(日) 01:27:53キーワード引数(っぽいハッシュ)の対案としてデータ受け渡し用のクラスを作れって話だが
そもそもそのクラスに変数をどうやってセットするのさ?
という事だと思う
0925デフォルトの名無しさん
2008/08/03(日) 01:34:270926デフォルトの名無しさん
2008/08/03(日) 01:37:33------
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)
------
どれが分かりやすくて憶えることが少ないかという問題でしょう
0927デフォルトの名無しさん
2008/08/03(日) 01:40:31wwwget(: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
}
)
とかしようってことだろ?
ってめんどくさいなオイ
0928デフォルトの名無しさん
2008/08/03(日) 01:45:300929デフォルトの名無しさん
2008/08/03(日) 01:50:191.9ならrb_during_gc()でどうですか。
1.8ならアルゴリズム見直すしか思いつきません悪しからず。
0930デフォルトの名無しさん
2008/08/03(日) 01:52:06まあRubyでスペルミスで例外出すように書いたことないけど
0931デフォルトの名無しさん
2008/08/03(日) 01:58:17ああ、なるほど…。3番目の例は思いつかなかったな。
キーワード引数もどきよりは、使いやすそうですね。
0932デフォルトの名無しさん
2008/08/03(日) 02:10:31下のnewにブロックを渡せるデータクラスはgemで時々見るな
0933デフォルトの名無しさん
2008/08/03(日) 02:25:030934デフォルトの名無しさん
2008/08/03(日) 05:27:12あれはHashがリテラルでかけない言語用の話だからな。
まあ、とはいえ、スペルミスすんのも痛いから、>>927の一番したのもおもしろいね。
>>926の最後の例は、C++とかで見たことがあったような気がする(boostあたり?)、
何か使っているライブラリとかってあったけ?
0935デフォルトの名無しさん
2008/08/03(日) 11:04:28それ、Hoge.new(patA,p2) をしたあとに Hoge.new(patB,p2) がくると
HogeA と HogeB のメソッドがある Hoge クラスになったりしないかね
0936デフォルトの名無しさん
2008/08/03(日) 14:14:51なぜ、自分で試してみないの?
0937デフォルトの名無しさん
2008/08/03(日) 18:51:30begin
#ここでuriを開いてhtml取得
rescue
sleep 10
retry
end
上記のような、あるURLのHTMLを取得するプログラムがあります。
もしデータが取得できなかった場合には例外処理の10秒待ってからretryで再取得しています。
これだと、もし相手のデータが取得できない場合永遠とretryし続けてしまうのですが、こういった場合のループを抜ける方法はあるのでしょうか?
breakは使えないようなので困っています
0938デフォルトの名無しさん
2008/08/03(日) 18:53:55retryって条件式指定できたよね
回数チェックでもさせればいいんじゃね
0939デフォルトの名無しさん
2008/08/03(日) 19:16:27標準のtimeoutライブラリは?
0940デフォルトの名無しさん
2008/08/03(日) 19:20:09初耳ニャ…
>>937
Ruby に retry_once とかあればよかったんだけど
uris.each do |uri|
retried = false
begin
#ここでuriを開いてhtml取得
rescue
sleep 10
(retried = true; retry) if retried
end
end
こんな感じ?
0941デフォルトの名無しさん
2008/08/03(日) 19:48:56ごめん。
逆だね。if文の実行側にretryだ
0942デフォルトの名無しさん
2008/08/03(日) 22:45:06begin〜end以外のブロックまたはメソッドでくるめばいいと思うな。
loop do
begin
# ...
break
rescue
retry
end
end
とか
0943デフォルトの名無しさん
2008/08/03(日) 22:48:29ごめんsage
0944デフォルトの名無しさん
2008/08/04(月) 11:17:07retry ループ用変数作るのが普通だな
あまりきれいに見えるやり方じゃないけど
0945デフォルトの名無しさん
2008/08/04(月) 20:24:04「最大何回までリトライ」とかいう一般化は普通だし、
あんまり美しさという点では気にならんかな。
0946デフォルトの名無しさん
2008/08/04(月) 20:51:37begin
web_access
rescue
sleep 5
retry(:max => 3)
end
こんな感じ
retry_once は retry(:max => 1) のエイリアス
繰り返す回数なんて管理したくないじゃん?
0947デフォルトの名無しさん
2008/08/04(月) 21:06:36>「返り値にキーワードをつける」に関しては、>>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
というクラスを定義しろということ? これを、キーワード引数をつかうメソッドごとに専用のクラスを用意しろと?
0948デフォルトの名無しさん
2008/08/04(月) 21:09:55誰もお前なんか覚えちゃいねーっつーの
0949デフォルトの名無しさん
2008/08/04(月) 21:17:47この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番目のやつがよさそうだなあ。
でもこういうのって初めて見たけど、けっこう知られているの? これ使っているライブラリとかある?
0950デフォルトの名無しさん
2008/08/04(月) 21:20:56うむ
それには大いに全面的賛同はする
>>926のメソッドチェーンのタイプはどっかのgemで見たんだがどこだったかなあ
0951デフォルトの名無しさん
2008/08/04(月) 21:47:59自分に理解できない解説をした人をバカ呼ばわりする初心者に教えることはないので
あとは自分で考えてください
0952デフォルトの名無しさん
2008/08/04(月) 23:24:40例えば、数値の配列に対して平均値を求めるメソッドを定義したいとします。
解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つ目まで良かったんですが、最後の行でエラーが出るのでやっぱり挫折。
0953デフォルトの名無しさん
2008/08/04(月) 23:26:33class 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
インスタンスを作るごとに一手間めんどいのが難点。
皆さんに、俺ならこうするを聞きたいです。
0954デフォルトの名無しさん
2008/08/04(月) 23:33:21Array クラスに「あるべきではない」ので、1が答っすかね
self から平均値を計算して返すというのは気持ち悪い
引数でいいじゃん引数で
0955デフォルトの名無しさん
2008/08/04(月) 23:39:18Array を継承かなにかしたクラスを新設すべきと考える
…が、sum メソッドくらいかなあ
算術平均なら Math クラスにくっつけるかもしれない
あるいは NumericArray クラスの特異メソッドにするかも
0956デフォルトの名無しさん
2008/08/04(月) 23:45:14実際は Hoge#data の返り値が配列で、その平均をメソッドチェーンで取得したいとかそんなとこか?
0957953
2008/08/04(月) 23:52:01わかりやすいため数値にしてますが、
本当は自分で作ったFooオブジェクトの配列なんです。
だからといって
module FooUtil; ... ; end
なんてのもJava臭くて嫌だなあと思うわけです。
0958デフォルトの名無しさん
2008/08/04(月) 23:57:00・Arrayを継承したクラスFooである
・クラスFooの属性(インスタンス変数等)にArrayが入ってる
どっちよ
0959デフォルトの名無しさん
2008/08/05(火) 00:05:36Arrayにメソッド追加するのは気分的にありえないなあ
Arrayを継承したデータクラスを作って
class FooData < Array
def sum; self.inject(0){|r,e| r += e} ;end
def ave; sum.to_f/size; end
end
かな
0960デフォルトの名無しさん
2008/08/05(火) 00:06:53すいません、日頃からよく言われてますorz
「クラスFooのインスタンスの配列」というものについての話です。
Javaが動的言語だったら ArrayList<Foo> にメソッドをひっつけてやるんだが。という。
0961デフォルトの名無しさん
2008/08/05(火) 00:12:41余計わかりにくくなったので寝る
0962デフォルトの名無しさん
2008/08/05(火) 00:15:57foo1 = Foo.new
foo2 = Foo.new
foo3 = Foo.new
foo4 = Foo.new
arr = [foo1, foo2, foo3, foo4]
で、arr に対して平均を取りたいと
Foo は関係ないな
0963デフォルトの名無しさん
2008/08/05(火) 00:33:54Foo の下に Array 継承した Data クラス作るかもしれない
その場合は3だな
俺は1だけど
配列の平均は配列と関係ないと感じる
0964デフォルトの名無しさん
2008/08/05(火) 01:44:53sequel とかそんな感じかも。っていうか limit だの order_by だのはそのものがある。
texts = TextItem.order_by(:ctime.desc).limit(n)
とか書ける。適当に雰囲気は察してくれ。
0965デフォルトの名無しさん
2008/08/05(火) 06:51:50俺なら解2を少しいじってこうするな
class Array
def avr; self.inject{|r,v|r+v} / self.length; end
end
0966デフォルトの名無しさん
2008/08/05(火) 07:13:08File.open("place.csv").each{|line|
place << line.split(",")
}
こうしたeach文で読み込んだfileの行数を数えるのにはどうすばいいですか?
後から
p File.read("place.csv").count("\n")
とやると時間がかかりそうなので配列にいれるときに数えたいのですが
0967デフォルトの名無しさん
2008/08/05(火) 08:21:120968966
2008/08/05(火) 08:57:57できました!sizeって行にも使えるんですね。
知りませんでした。ありがとうございます。
というか普通に下のようにやれば数えられますね。
すみませんでした。
i=0
place = []
File.open("place.csv").each{|line|
place << line.split(",")
i=i+1
}
0969937
2008/08/05(火) 11:50:10以下のようにretry用の変数を使う形で落ち着きました。
皆さんアドバイスありがとうございます!
def get_url
i = 0 #retryループ用の変数
begin
#open_urit処理
i += 1
rescue
sleep 10
retry if i < 4 #3回まではやり直す
end
end
0970デフォルトの名無しさん
2008/08/05(火) 11:55:24例外が起きたときの回数を憶えていてほしいわけだから、 i の加算は rescue の中に書く
あと open_uri のタイムアウトは引数なし rescue では捕捉できないから rescue Timeout::Error とか明示的に書いとけ
0971デフォルトの名無しさん
2008/08/05(火) 11:58:53そんなもんはない
単なる配列
ファイルの中の長い1行がびろーんと配列の要素の中に入ってるイメージをしろ
短冊をずらっと吊るすようなもんだ
まあ本当は配列の中には何もモノは入ってないんだけどな
0972デフォルトの名無しさん
2008/08/05(火) 12:02:15気持ちはよくわかる
0973966
2008/08/05(火) 20:49:57なるほど。
なんとなくfile.sizeだと列数が返ってくるとおもってましたがファイル全体を見るんですもんね。
>まあ本当は配列の中には何もモノは入ってないんだけどな
というのは?ファイルの中身が入っているのでは?
0974デフォルトの名無しさん
2008/08/05(火) 20:55:28あと十回は提示した・されたコードを読んだ方がいいと思った
0975デフォルトの名無しさん
2008/08/05(火) 20:56:150976デフォルトの名無しさん
2008/08/05(火) 21:17:54箱が並んで短冊が入っているというイメージよりは、
箱は並んでいるがそこから短冊がぶら下がっているイメージ。
箱の中には短冊を結んだ糸がくっついてる。
0978952-953
2008/08/05(火) 21:44:16やっぱり無難に解1派が多いんですね。
Rubyだと何か面白い定番な書き方があるんじゃないかと期待してみましたが…。
次点で解3系でしょうか、意味的には自然ですし。
ただ、Enumerableのメソッドを使うにあたっていい書き方がないんですよね。
NumericArray.new(tmp.map{|v|v+1}).avr
みたいに書くしかないんでしょうか?
何かいい案があればお願いします。
0979デフォルトの名無しさん
2008/08/05(火) 22:01:59「平均値を求める」ならふつー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)
0980デフォルトの名無しさん
2008/08/05(火) 23:28:51class 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 と同じだな。
0981デフォルトの名無しさん
2008/08/05(火) 23:32:34ところで、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
0982デフォルトの名無しさん
2008/08/05(火) 23:38:29よければ次スレ立ててくれ
>>2以降のテンプレは義務にしないから
0983デフォルトの名無しさん
2008/08/06(水) 00:37:10おk
>>382 でテンプレのアップデートしようぜって話があるんだが、
>>1 で直すべきとこってある?
1.8.7 に更新しようかと思ったけど、[ruby-dev:35440] でメンテナが
「ぜひ試してみてください」レベルとか行ってて初心者スレで進めていいのか
不安になる。
0984デフォルトの名無しさん
2008/08/06(水) 00:40:170985デフォルトの名無しさん
2008/08/06(水) 00:47:07> これ使っているライブラリとかある?
ActiveRecord 2.1 の named_scope
0986デフォルトの名無しさん
2008/08/06(水) 01:15:29http://pc11.2ch.net/test/read.cgi/tech/1217952441/
とりあえず立てといた。
0987デフォルトの名無しさん
2008/08/06(水) 06:32:43> ところで、yield の引数の括弧をなくすとエラーになるのはなんで?
カッコがない引数は優先順位が低いから、
(sum + yield) e とみなされてしまう。
0988デフォルトの名無しさん
2008/08/06(水) 13:13:19あ、なるほど。サンクス。
レス数が950を超えています。1000を超えると書き込みができなくなります。