[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 05/09 23:23 / Filesize : 180 KB / Number-of Response : 646
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 30



1 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 08:21:23 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
   (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。)
 なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

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

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

268 名前:203 mailto:sage [2009/08/19(水) 03:10:28 ]
>>266
ありがとうございます。上書きしていたのは気がついたのですがそのように書くしか思いつかなかったので手がでませんでした。
addでやったところvalueが0の所は出力されていませんが、欲しいモノで出力されました。

>>267
変数名に関して理解しました。
しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と結びつけるかわかりません。
h["unknownkey"] += unknownvalue はhinの方ですよね。

269 名前:チンパンジー愛ちゃん [2009/08/19(水) 03:51:55 ]
> しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と
> 結びつけるかわかりません。h["unknownkey"] += unknownvalue はhinの方ですよね

うんにゃ、違うよ。hinじゃないよ。
h["unknownkey"] += unknownvalue
と結びつけて考えないといけないのは以下の箇所

hout[ary[i]] = hin# ここを以下のように変更すれば期待通りに動くはず

hin.each do |key, value|
hout[ary[i]][key] += value
end

270 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 04:43:35 ]
的確なレスもできないくせにコテうぜえ

271 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 05:30:04 ]
ナツノオモイデ君はどこでも厄介だ

>>265
本当に何も考えていないWindows用スクリプトなのなら日本語はShiftJIS決め打ちだろ
入力する日本語を全部ShiftJISにして$KCODE相当もShiftJISにしてみ

272 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 06:01:39 ]
>>245
arr = Array.new
p arr[3] #=> nil

これを「nil ではなく 0」にしたいのだと推測
できません
「arr[3] が nil なら 0 を代入」という手順を経るのが通例です
この明示的な動作で要素3までの配列が確定され、「空」だった要素にはnilが代入されます
配列の自動初期値設定というのはあったらあったで便利っぽい機能なんですが、おそらくは
「nil以外のオブジェクトが勝手に若い要素全てに代入される」
という動作が Ruby 添付クラス的にキモいということで嫌われたのでしょう

もし必要なサイズがあらかじめわかっているのなら、その大きさの配列を作って Array#fill で埋めるか

arr = Array.new(5)
arr.fill{ 0 }
p arr[3] #=> 0
p arr #=> [0, 0, 0, 0, 0]

あるいは new のときにやっちゃってください

arr = Array.new(5){ 0 }
p arr[3] #=> 0
p arr #=> [0, 0, 0, 0, 0]

[] メソッドで参照しただけで若い要素が 0 で埋まる配列クラスと言うのを自作しても構いませんが、多分動作遅いと思われます

273 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 11:00:07 ]
>>245
Rubyの配列にはそういう機能がないです。残念でした。
代替案としては arr[x] で参照するかわりに (arr[x] ||= 0) とするとか。
たとえば
arr = [1, 2, 3]
puts (arr[5] ||= 0) + 1
みたいな。

あとは Array#[] を上書きすればいいのかなー
class Array
 def [](x)
  val = super(x)
  val = self[x] = 0 if val.nil?
  return val
 end
end
とか。

274 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 11:12:08 ]
>>231
めんどくせぇソース全文うpってくれ

275 名前:203 mailto:sage [2009/08/19(水) 11:43:54 ]
>>263
遅くなってすいません。こうですか?
require 'pp'
ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window =6
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ }
b.each {|count| hin[count] +=1}
#hout[ary[i]] = hin
hin.each do |key, value|
hout[ary[i]][key] += value
end
}
pp hout

実行すると
at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
from mat.rb:11:in `each'
from mat.rb:11
from mat.rb:5:in `times'
from mat.rb:5
となってしまいます。

276 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 12:01:02 ]
>>275
自分で考えてほしいからエラーのヒントだけ
>hout=Hash.new
>#hout[ary[i]] = hin
>hout[ary[i]][key] += value
>at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)



277 名前:203 mailto:sage [2009/08/19(水) 12:32:53 ]
>>276
hout[ary[i]][key]
Hashが二つ[][]を取っているのが気持ち悪いですし、それがundefined method `[]' for nil:NilClass (NoMethodError)
を起こしているのだと思いますが・・・・。そうだとしても解決がわからないです。

278 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 12:44:23 ]
>>277
>hout[ary[i]][key]
k = ary[i]
x = hout[k]
y = x[key]
と同じ

で、このときのxはなんだとおもう?

279 名前:203 mailto:sage [2009/08/19(水) 12:50:17 ]
>>278
xはhout[ary[i]]ですか?
ということはhout[ary[i]]が一つのハッシュでhout[ary[i]][key]だとそれのキーということですか?

280 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 12:58:15 ]
なんどめだナウシカ

ハッシュの h[key] は、「ハッシュ機構」という特殊なものがあるわけじゃなくて
「オブジェクト h の [] メソッドに引数 key を渡している」
という処理を簡単に表記できるように特別扱いされたものに過ぎない

h = {'one' => 1'}
p h['one'] #=> 1
p h.[]('one') #=> 1

つまり、h['one']['two'] という表記があったなら、それは

 h.[]('one').[]('two')

というメソッドチェーンを表しているに過ぎない
メソッドチェーンだから、[]('two') のレシーバ、つまりドットの前の、h.[]('one') の返り値、
が nil だと普通に NoMethodError になる
そんだけ

281 名前:203 mailto:sage [2009/08/19(水) 12:58:33 ]
あぁ、hout[ary[i]][key]はhout[ary[i]]のkeyがkeyの時のvalueですね

282 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 13:14:39 ]
これを一括ダウンロードするのってどうやるの?
www.boostermp3.com/audio/index.php?search=perfume

283 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 13:27:56 ]
うぜえからダウンローダー使うなってページ構造に書いてあるな
まあ知識がないなら手作業でやりゃいいんじゃねえの

284 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 13:34:11 ]
JavaScriptのリンククリックするだけのように見えるから
JavaScriptのリンクをクリックできるライブラリ使えばできそうな気はする
内容が内容だけにこれ以上は自力でやれとしか

285 名前:203 mailto:sage [2009/08/19(水) 14:03:15 ]
>>280
すいません。ハッシュ機構というものがあるような感じで書いていました。
メソッドチェーンということはと思って
hin.eachの前で
p hout[ary[i]]をしたところ返り値がnilでした.
ということは hout=Hash.newのところが問題になってくるのでしょうか?

286 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 14:09:22 ]
>>285
そりゃ唯一の代入をコメントアウトしちゃったらnilしか返ってこないわな




287 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 14:22:23 ]
よし、ではハッシュの初期値を使うのは禁止だ
理由は、全く理解していないから

望ましい処理を自力で一度書け
どういう時にどうなっていて欲しいかを if で条件分岐しろ

288 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 14:25:13 ]
なんかみんなを混乱させているようだね。
>>275
>at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
これを説明すると、まずat.rbの12行目でエラーが起きている。
エラーの内容は、nilに対して '[]' というメソッドを実行しようとしているため。
つまり nil[i] のようなことをしている。
at.rbの12行目がなにかわからないけど、hout[ary[i]][key] だとしたら、
・aryがnilのせいで ary[i] がエラー
・houtがnilのせいで hout[ary[i]] がエラー
・hout[ary[i]]がnilのせいで hout[ary[i][key] がエラー
のどれかが原因。
あとは自分で調べて。

289 名前:231 mailto:sage [2009/08/19(水) 14:52:04 ]
>>274
遅くなりましたが>>231.255.258.259.265のソースの全文です。。

ttp://2sen.dip.jp/cgi-bin/upgun/up1/source/up31158.zip

290 名前:チンパンジー愛ちゃん [2009/08/19(水) 15:17:23 ]
初心者が混乱しているときは大抵教え方が悪いと思っていたけどやっぱりそうだった。
ごめん、答えだけ書くね。大体>>220と同じ出力になるよ。"w5" => {...}だけ違うけど。

require 'pp'
ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window =6
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ }
b.each {|count| hin[count] +=1}
#hout[ary[i]] = hin
if hout[ary[i]].nil?
hout[ary[i]] = hin
else
hin.each do |key, value|
hout[ary[i]][key] += value
end
end
}
pp hout

291 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 15:24:45 ]
的確なレスもできないくせにコテうぜえ


292 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 15:25:05 ]
>>289
やっぱsixamoかよ、なんでわざわざ名前伏せるんだw
でもこれ微妙に改変されててバージョン情報に偽りが・・・まあこの際どうでもいいか

とりあえずホンモノ使っときゃいいんじゃね
yowaken.dip.jp/sixamo/

293 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 15:32:10 ]
>>292
本物はRubyのバージョン的に動かないって書いてあったので・・。
動かしてみた感じでは本物は受け答えできず。
改変版は数行実行したのちエラー。
ログのTXTファイル空にしたらまた動くので、文字コードとか?文章作成あたりでエラーになってると予測。

本物より動きそうなんですがね。。

294 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 15:42:14 ]
厳しい言い方だが、

あなたがただのユーザーなら、Rubyで動作するプログラムは現存しないので諦めれ
あなたがプログラミングを行う者なのなら、あなたが自力で全体修繕して作れ

どっちか

295 名前:203 mailto:sage [2009/08/19(水) 15:58:50 ]
>>286->>288,>>290

ご指摘ありがとうございます。
各クラスのメソッドの知識がないみたいなのでそこを勉強して出直してきます。
また、初期値なども勉強してきます。
昨日からいろいろな人に教えていただきましてまことにありがとうございます。

296 名前:チンパンジー愛ちゃん [2009/08/19(水) 16:15:54 ]
mecab坊やはどうなったの?解決したの?



297 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 16:28:45 ]
的確なレスもできないくせにコテうぜえ

298 名前:デフォルトの名無しさん [2009/08/19(水) 16:48:22 ]
ここまで全部読み飛ばした。
寝る。

299 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 17:02:48 ]
とりあえず
みんな
おつかれ

300 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 18:36:53 ]
>>293
Ruby1.9なら1.8を
もし引数無しで起動したならリンク先ちゃんと読め

301 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 19:09:17 ]
1.8w

302 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 19:48:41 ]
>>290
>初心者が混乱しているときは大抵教え方が悪い
名言だな。こんどから>>1に追加してほしいくらいだ。

303 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 20:06:36 ]
本人が言うから名言なんであって
もし質問者側からそんなこと言われたらたまったもんじゃないな

304 名前:チンパンジー愛ちゃん [2009/08/19(水) 21:29:48 ]
教える側は常に心の奥底で思っていないといけないことですよ。
独りよがりの教えほど迷惑なものはありませんから。

305 名前:191 [2009/08/19(水) 22:21:17 ]
すまん、俺が変な野郎(>>192)を呼び込んでしまったようだ orz...
あとは俺に任せてくれ。

306 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 22:30:23 ]
どっちもサルに見えるのだが



307 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 03:35:31 ]
逆引きRuby誰か書き足してくれ

308 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 07:19:18 ]
>>307
どっちの逆引き?

309 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 08:08:59 ]
とりあえず、逆引きRubyという話題を振る時は、
どちらの逆引きか、逆引きの方か、逆引きの方かはっきり囲うな?

310 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 08:12:14 ]
日本語でおk

311 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 08:58:41 ]
レシピブック初版にはお世話になったけど
最近いろいろあるから次買うとき迷うな

>>309
書き足すっていうぐらいだからWikiのほうだろう

312 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 13:38:05 ]
Emacs の ruby-mode で =begin と =end がインデントされてたいそう困ってるんだけど
これって困ってる人いないのかな

313 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 14:06:37 ]
>>304
そこまで自覚があるなら、さっさと消えろよ

314 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 17:19:03 ]
>>312
あー,それ確か俺も愕然とした記憶が。
「=begin, =end は使わないことにする」で解決!

315 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 10:58:26 ]
シリアルポートからデータをgetsで読んでます。
データは一行ずつ出力されるので問題は生じません。
しかし、特殊な設定情報だけは複数行出力で、行数が不定です。
このような何行か分からない出力を受け取るにはどのような手法が適しているでしょうか?

316 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:09:32 ]
行とい考え方を無くせばいい
ただの改行文字だろ



317 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:10:20 ]
設定情報用の一時変数を確保しておいて、
設定情報1行目だったら通常の処理飛ばしてそこに溜めるようにすれば?

318 名前:315 mailto:sage [2009/08/21(金) 11:26:15 ]
ありがとうございます。
とりあえず、一行ずつ << 演算子で設定情報用の配列の末尾に追加していくことにしました。
EOFがないので終了条件をどうするか悩んでみます。

319 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:40:13 ]
>>318
EOFって全体の?
終了データが流れてこないとかpingみたいな定期送信がないなら
手動停止させるのが普通だと思う

可変長データなのにサイズ情報も終端情報もないのだとしたら
次の通常のデータが送られてきた時にバッファ吐き出して設定処理するとか

320 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:43:57 ]
そりゃデータフォーマットがわからにゃなんとも

321 名前:315 mailto:sage [2009/08/21(金) 11:58:57 ]
>>319
全てのデータを受信できるまで、timeoutモジュールを使って少し待ってからgetsの待ちを解除してみます。

322 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 13:43:36 ]
自作のスクリプトがあります
libディレクトリを作ってファイル分けしてみたら10ファイルくらいになりました

んで、これを日常で使いたいと思います
「開発ディレクトリ」と「実行ディレクトリ」を分けなければなりません
(動作しない状態であることが多い開発中のスクリプトをcronなどで触らせたくない)
どこか適当なディレクトリに「インストール」してバージョンを維持するのがいいと思ってます

最初は rubygem パッケージにすることを考えましたが、
require 'rubygems' で1秒近くかかる環境なので正直あまりやりたくありません
(たぶん、スクリプト本体の実行時間のほうが短い)
これ以外になにかてきとーな方法はありませんか?

323 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 13:52:21 ]
>>322
subversionあたり使うとか

324 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 13:59:42 ]
>>322
rake install で超適当なディレクトリに超適当に上書きするような rake スクリプトを書く
要は実行可能なときにファイルをコピーしておきたいってことだろ
ファイルをコピーするという行為だけ rake で書け

バージョン戻すという行為が簡単にできないのだけが難点だが、
まあ実行用ディレクトリを適当に圧縮でもしてバックアップしとけ

325 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 15:25:22 ]
質問です。

ary = [5, 2, 3, 3, 3, 4, 2, 2]
のような配列を
[5, 2, 3, 4, 2]
のようにする、つまり、「隣り合った」同値の要素を
uniqにまとめた配列を得る方法を求めています。

ary = [5, 2, 3, 3, 3, 4, 2, 2]
prev = nil
result = []
ary.each do |n|
result << n if prev != n
prev = n
end
result #=> [5, 2, 3, 4, 2]

とするより、良い方法はないものでしょうか?

これに限らず、配列処理で直前(または 直後)の要素を参照しながら
進めていくスマートな方法があれば教えていただきたいのですが・・・。

326 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 15:32:32 ]
prev = nil
result = ary.select{|v| v == prev ? false : (prev = v) }



327 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 15:33:18 ]
前後を参照するほうが注目だったか、スマン出直してくる

328 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 15:33:53 ]
Enumerable#each_cons

329 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 15:51:43 ]
>>326
selectをこういうふうに使えるのは知りませんでした。
関数型言語みたいで格好いいなあ。

>>328
こういうのを探していました。ありがとうございます。

330 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 20:16:48 ]
デバッガ使ってる?

使いこなせてないからかもしれないけども,まだ自分にはpとかppで十分かな.
どんなレベルからデバッガつかってんの?

331 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 21:20:08 ]
みんななにで開発してるんだろう?
IDE?エディタ+コンソール?

332 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 22:31:20 ]
>>331
エディタ+コンソール派
軽くて良いIDEがあったら、そっちに乗り換えるつもり

333 名前:デフォルトの名無しさん [2009/08/21(金) 23:22:01 ]
デバッガ使ってもバグ直ってないニダ。
謝罪と賠償ニダ。

334 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 23:24:21 ]
RDEがもっと使いやすかったらいいのにな・・・

335 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 00:53:03 ]
netbeansで書いて、家ではemacs+putty

336 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 02:00:36 ]
EclispeからNetbeansに行ってemacsかな。日曜PGなんで結局自分が良く使うエディタがいいや。



337 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 02:03:57 ]
Aptana+Eclispe
はじめたばっかりですけど

338 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 08:22:51 ]
ソースコード上でデバッグできるのは?
NetBeansがいいんかな?

339 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 08:29:08 ]
正直どれもイマイチ
言語仕様的問題だとは思うんだが

340 名前:デフォルトの名無しさん [2009/08/22(土) 09:44:00 ]
>325

result = ary.zip([nil]+ary).select{|x,y| x!=y}.map(&:first)

341 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 09:53:39 ]
>>340
each_consが提示された時点で問題外
オナニー以下

342 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 13:45:35 ]
色んなやり方が紹介されるのは,初心者スレでは意味があるんじゃないかな。
悪例だったらダメだけど,>>340 は「へーこういうのもあるんだ」的な
例にもなってると思うし。

343 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:15:49 ]
data = ハッシュまたは適当な格納系クラス
Target.new(param).hoge(data)
data #<= Target に関する情報が追加されている

という処理をします
hoge というメソッドにわかりやすい名前を付けたいのですが、なんかいい案ありませんか
凝ってもアレだし update とか register でいいですかね

344 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:17:19 ]
>>342
普通に悪例だと思うが

345 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:23:30 ]
ようそが nil いっこだけのはいれつがかいてあるじてんでかっこわるくてあたまぐるんぐるんぐるんします

346 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 16:12:11 ]
>>343
Hoge#dup_to(data) とか
updateならHashにならってHoge#update(Target)にすべき
後は
hoge = Target.new(param).to_hoge
とか
hoge = Hoge.new(Target.new(param))



347 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 16:27:30 ]
>>343
「自分の内容で引数のデータオブジェクト(自分とは別構成)を更新する」というメソッドに
update は似合わない
Ruby の update は自分と引数が同類であるべき
引数に現在のインスタンス変数の内容を適宜コピー、というメソッドは…なんだろうね

動作としてはこんなんだろ

h = Hash.new
Foo.hoge(h)
Bar.hoge(h)
Baz.hoge(h)
p h

で、h が {'foo' => …, 'bar' => …, 'baz' => …} になったり
{111 => {:foo => …, :bar=> …, :baz => …}, 222 => {:foo => …, :bar=> …, :baz => …}, ...} になるって奴

348 名前:346 mailto:sage [2009/08/22(土) 17:09:40 ]
間違えた
×Hoge#dup_to(data)
○Target#dup_to_(data)

dup_to(data)じゃなくてdup(type=nil)にして
typeがクラスならデータ格納したインスタンスを生成、
インスタンスならそれに情報をコピー、nilならsuperとかどうだろう

349 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 18:04:05 ]
きめえ
ObjectやModuleの基本メソッドは上書きすんな

350 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 18:08:08 ]
dupの存在を知らないだけかもしれないじゃないか
irb> a = []
irb> b = a.dup
irb> a << 1
irb> p b
[]


351 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 18:35:05 ]
>>349
> ObjectやModuleの基本メソッドは上書きすんな
なんで?
inspectとか==とかto_*とか普通上書きするだろ、最たるものはinitialize
それにdupに引数与えなければ以前と同じ動作をするんだから互換性も問題無い

352 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 18:51:28 ]
>>343
自分なら Target.new(param).hoge は Hash あたりを吐き出すようにして
data側が自分で取り込むようにする
たとえばdata = {} なら data.update( Target.new(param).hoge )

だから名前は、ある種のアクセサとして吐き出すデータに見合った名前か
主要なデータをまるっと吐くなら to_h とか

>>351
機能はそのままに、そのオブジェクトに見合うよう上書きするのと
機能自体を拡張するという違いがあるからなぁ
ダメだと思わないけど積極的にやるのも微妙な感じ

353 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 19:14:29 ]
Ruby Best Practicesは良い本ですか?

354 名前:デフォルトの名無しさん [2009/08/22(土) 20:24:17 ]
Ruby Best Practicesは(どうでも)良い本です。

355 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:35:37 ]
初歩的な質問ですいません。
Linuxで、シェル(bash cshなど)よりrubyの方が優れているところは何でしょうか?

356 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:42:46 ]
>>355
シェルスクリプトでめんどくさい処理も簡潔に書ける

めんどくさいと思った経験が無いならシェルスクリプト使っとけ



357 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:48:58 ]
>>356
すいません、シェルは結構使うんですが、Rubyは勉強しだしたばっかりであまりよくわかってないんです。
なので自分で比較ができないんですが、具体的にはどんなところがRuby優位なのでしょうか?

358 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 21:01:29 ]
例えば指定したディレクトリとそのサブディレクトリを巡回して
ファイルのサイズを集計してどのフォルダが何%消費しているかを
大きい順にソートして上位50個表示。
なんてユーティリティを書くと差が出てくるかな。

359 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 21:01:56 ]
>>357
アプリ一つ書いてみればわかるんじゃないだろうか。
WEBアプリなら敷居が低いから、とりあえず掲示板でも。

また例えば、CSVのパースとかしたくなったときに、シェルスクリプトで
どうやったらいいのかちょっとすぐには思いつかない。

360 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 21:06:49 ]
シェルスクリプトってものがどういうものかっていう知識不足

だからどんなレスしても、理解できない

361 名前:355 mailto:sage [2009/08/22(土) 21:14:54 ]
シェルでもcpとかrmしかつかってないんで、
難しいことわかりません。

理解できませんので失礼します。

362 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 21:37:01 ]
>>358
du -h | sort で用が足りそうな気もするな

363 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 22:54:42 ]
CSV処理やらディレクトリ走査はシェルスクリプトの得意分野じゃねえの。
シェルスクリプトを覚える必要がないならrubyで良いと思うけども。

364 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 01:53:06 ]
多次元配列の重複要素削除の仕方がわかりません

Cでいうところの、
a[3][5] = {[1,2,3,4,a], [2,3,4,5,b], [2,3,4,5,a]}

って、あったら、aが重複してるので、
[1,2,3,4,a], [2,3,4,5,b]
だけにしたい

a.uniq{|x| x[4]}

ってのは間違い??




365 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 03:01:15 ]
>>364
Array#uniqはブロックを取らないはず

a[x][4]の値が既出の配列は捨てるってことだよね?
a = [[1,2,3,4,"a"], [2,3,4,5,"b"], [2,3,4,5,"a"]]
tmp = {}
a.select{|v| tmp[v[4]] ? false : (tmp[v[4]] = true) }

どこかで見たと思ったら>>326と似てた

366 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 04:55:14 ]
>>364
多次元配列など存在しません
ネストした配列とお呼び下さい

で、まあ、ネストしただけの配列なので普通にイテレーションして
exists = Array.new
a.delete_if{|arr| if exists.include?(arr[4]) then false else exists << arr[4]; true end}
とかすればいいんじゃね
Rubyでコレクションをぐるぐるすること厭っちゃダメ



367 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 05:22:40 ]
【レス抽出】
対象スレ:Ruby 初心者スレッド Part 30
キーワード:select

抽出レス数:11

これ全部同じ奴なんだろうな、とか思う

368 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 05:47:02 ]
select が条件全体抽出なのは混乱する、という人は少なくなさそうだな

collect
select
reject
detect
inject



map
find_all
reject
find
inject

なら後者のほうがまだマシにも思えるが、あ〜、でもどうだろう
このへんは出身言語にもよるんだろうけどさ
find/map 派と detect/collect 派は結構昔から揉めてる気がする
find と find_all が紛らわしいとか、そんなんセレクトとデテクトのほうが紛らわしいわボケとか

あと、古い ActiveRecord は find_all が上書きされるから新しいの入れて ActiveRecord#all で書け






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<180KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef