Ruby 初心者スレッド Part 30
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/08/08(土) 08:21:23★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
(理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。)
なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。
関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0253デフォルトの名無しさん
2009/08/19(水) 01:14:25なんか吹いた
******.new (".\\")
のコード(initialize)を出せって言われとろーがwww
大体その******は、全部同じものか?違うなら、HogeとかPageとか適当に分けやがれw
0254チンパンジー愛ちゃん
2009/08/19(水) 01:15:11何でUbuntu9.04にruby1.84が入っているんだ。
私も9.04使ってるけどruby1.87が入ってたけどな。
それとリンク先はpythonの説明だったぞ。
なぜruby使いにpythonの記事を読ませた!死罪也!
まさかとは思うけど、pythonとrubyの区別がついてなくて
リンク先の記事はrubyの解説だと思っているってことはないよね?
@mecab = MeCab::Tagger.new
って実行してエラーメッセージを貼ってね。
個人的にはmecab用の辞書入れていないことが問題だと思っているけどね。
あと、mecab-ruby, mecab用辞書のバージョンもちゃんと書いてね。
0255231
2009/08/19(水) 01:25:16******は同じ文字列です。。
コードのだしかたが・・。
module ******
def ******.new(*args)
******::Core.new(*args)
end
def ******.init_dictionary(dirname)
dic = Dictionary.new(dirname)
dic.load_text
dic.learn_from_text(true)
dic
end
class Dictionary
TEXT_FILENAME = '******.txt'
DIC_FILENAME = '******.dic'
def Dictionary.load(dirname)
dic = Dictionary.new(dirname)
dic.load_text
dic.load_dictionary
dic
end
こうですか?わかりません><
0256203
2009/08/19(水) 01:25:22>Hash.new(0)
>してあるんだから、
>「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」
>は、h["unknown_value"] += unknown_value_key
>と直接書けばよいでしょ。
すいません。ここが理解できてないです。
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}
pp hin
puts "@@@"
pp hout
puts "@@@"
}
pp hout
-------
hout[ary[i]] += hin.valuesだとhoutは初期値がないから
undefined method `+' for nil:NilClass (NoMethodError) ですもんね・・・・。
0257デフォルトの名無しさん
2009/08/19(水) 01:27:53おk。わかった。
とりあえず、>>231に戻って
******.new (".\\")
を
******.new (".")
にしてみろ。
それでダメなら、ちゃんとソース嫁。
0259デフォルトの名無しさん
2009/08/19(水) 01:34:02怖い、怖いよw
本当にそれでいいか、一度ソースを読むことを激しくお勧めする。
てかRubyほとんど関係ねえ!
0260デフォルトの名無しさん
2009/08/19(水) 01:37:44文字化けしますが、文字コードの謎の不具合のせいなので調整すれば大丈夫そうです。
あとはPerlでの作業なのでなんとかなるでしょう。。
Ruby難しいです・・。ソース読めません・・。
0261デフォルトの名無しさん
2009/08/19(水) 01:42:18>>222だけどあれじゃだめなの?それとも途中経過の出力が必要?
ary.each_with_index do |key,i|
(hout[key] = zero.dup).delete(key) unless hout.key?(key)
ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 }
pp hout[key],'@@@',hout,'@@@',
end
pp hout
0262203
2009/08/19(水) 01:47:10ありがとうございます。出力結果はOKですし、ソースも読解します。
でも、まず、自分が書いた奴がなぜ結果まで持って行けないかわかってないので
チンパンさんに教えてもらっている感じです。
0263チンパンジー愛ちゃん
2009/08/19(水) 01:57:45「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」
以下の時にA.B.と分けて考えよう。
h1 = hash.new(0)
h1 = h1.merge({"a" => 2, "b" => 3})# h1.merge!({"a" => 2, "b" => 3})でも可
h2 = {"a" => 3, "c" => 8}
A.同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算
B.なければmergeする
A.これは、以下のままでよいから特に難しくないね。
h1["a"] += h2["a"]
B.は
h1["c"] += h2["c"]
と等価なんだよね。
p h1["unknown_key"] += 5
を思い出してね。
すると、A.Bの時に場合分けは特に必要なく、
h["unknown_value"] += unknown_value_key
のコードで事足りるよね。
0264203
2009/08/19(水) 02:16:49A,Bの場合分けが入らないのは理解しました。
h["unknown_value"] += unknown_value_key
これは ハッシュhにunknownのvalueをkeyとしたものに unknownのvalueのkeyのvalueを足しているということでいいんですか?
アンダースコアをどのように使っているかわかりません。
hout[ary[i]] とやらないと
w1"=>{"w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2}
のw1=>が得られないと思っているのですが、それもちがいますか?
0265231
2009/08/19(水) 02:19:29chr = /./m.match(str)[0]
result << chr if num
str = Regexp.last_match.post_match
end
この部分で ぬるぽ って言われるんですが。
NilClass (NoMethodError)
単なる文法間違いですか・・?
0266デフォルトの名無しさん
2009/08/19(水) 02:19:39「自分で書いた」ってのは>>209の事かな
あれがうまく行かないのはこの行で前のループのデータを上書きしてる為。
hout[ary[i]] = hin
ここに>>208氏のメソッドを使えば>>220に近い結果が出せた。
add(hout,ary[i],hin)
マージに拘りすぎ、普通に枚挙すれ
0267チンパンジー愛ちゃん
2009/08/19(水) 02:30:13アンダースコアは気にしないで。単語の区切りに使っただけ。
こっちの方が迷わなくていいかな。
×h["unknown_value"] += unknown_value_key
○h["unknownkey"] += unknownvalue
これはhのハッシュに存在していないキーのことをいいたかったんだけど、
愛ちゃんの変数名の付け方がおかしかったね。ごめんね。
> これは ハッシュhにunknownのvalueをkeyとしたものに
> unknownのvalueのkeyのvalueを足しているということでいいんですか?
話がややこしくなってるね。変な変数名でごめんね。
> hout[ary[i]] とやらないと...
これは正しいよ。そうしないと得られないよ。
0268203
2009/08/19(水) 03:10:28ありがとうございます。上書きしていたのは気がついたのですがそのように書くしか思いつかなかったので手がでませんでした。
addでやったところvalueが0の所は出力されていませんが、欲しいモノで出力されました。
>>267
変数名に関して理解しました。
しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と結びつけるかわかりません。
h["unknownkey"] += unknownvalue はhinの方ですよね。
0269チンパンジー愛ちゃん
2009/08/19(水) 03:51:55> 結びつけるかわかりません。h["unknownkey"] += unknownvalue はhinの方ですよね
うんにゃ、違うよ。hinじゃないよ。
h["unknownkey"] += unknownvalue
と結びつけて考えないといけないのは以下の箇所
hout[ary[i]] = hin# ここを以下のように変更すれば期待通りに動くはず
hin.each do |key, value|
hout[ary[i]][key] += value
end
0270デフォルトの名無しさん
2009/08/19(水) 04:43:350271デフォルトの名無しさん
2009/08/19(水) 05:30:04>>265
本当に何も考えていないWindows用スクリプトなのなら日本語はShiftJIS決め打ちだろ
入力する日本語を全部ShiftJISにして$KCODE相当もShiftJISにしてみ
0272デフォルトの名無しさん
2009/08/19(水) 06:01:39arr = 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 で埋まる配列クラスと言うのを自作しても構いませんが、多分動作遅いと思われます
0273デフォルトの名無しさん
2009/08/19(水) 11:00:07Rubyの配列にはそういう機能がないです。残念でした。
代替案としては 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
とか。
0274デフォルトの名無しさん
2009/08/19(水) 11:12:08めんどくせぇソース全文うpってくれ
0275203
2009/08/19(水) 11:43:54遅くなってすいません。こうですか?
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
となってしまいます。
0276デフォルトの名無しさん
2009/08/19(水) 12:01:02自分で考えてほしいからエラーのヒントだけ
>hout=Hash.new
>#hout[ary[i]] = hin
>hout[ary[i]][key] += value
>at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
0277203
2009/08/19(水) 12:32:53hout[ary[i]][key]
Hashが二つ[][]を取っているのが気持ち悪いですし、それがundefined method `[]' for nil:NilClass (NoMethodError)
を起こしているのだと思いますが・・・・。そうだとしても解決がわからないです。
0278デフォルトの名無しさん
2009/08/19(水) 12:44:23>hout[ary[i]][key]
k = ary[i]
x = hout[k]
y = x[key]
と同じ
で、このときのxはなんだとおもう?
0279203
2009/08/19(水) 12:50:17xはhout[ary[i]]ですか?
ということはhout[ary[i]]が一つのハッシュでhout[ary[i]][key]だとそれのキーということですか?
0280デフォルトの名無しさん
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 になる
そんだけ
0281203
2009/08/19(水) 12:58:330282デフォルトの名無しさん
2009/08/19(水) 13:14:39http://www.boostermp3.com/audio/index.php?search=perfume
0283デフォルトの名無しさん
2009/08/19(水) 13:27:56まあ知識がないなら手作業でやりゃいいんじゃねえの
0284デフォルトの名無しさん
2009/08/19(水) 13:34:11JavaScriptのリンクをクリックできるライブラリ使えばできそうな気はする
内容が内容だけにこれ以上は自力でやれとしか
0285203
2009/08/19(水) 14:03:15すいません。ハッシュ機構というものがあるような感じで書いていました。
メソッドチェーンということはと思って
hin.eachの前で
p hout[ary[i]]をしたところ返り値がnilでした.
ということは hout=Hash.newのところが問題になってくるのでしょうか?
0286デフォルトの名無しさん
2009/08/19(水) 14:09:22そりゃ唯一の代入をコメントアウトしちゃったらnilしか返ってこないわな
0287デフォルトの名無しさん
2009/08/19(水) 14:22:23理由は、全く理解していないから
望ましい処理を自力で一度書け
どういう時にどうなっていて欲しいかを if で条件分岐しろ
0288デフォルトの名無しさん
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] がエラー
のどれかが原因。
あとは自分で調べて。
0289231
2009/08/19(水) 14:52:04遅くなりましたが>>231.255.258.259.265のソースの全文です。。
ttp://2sen.dip.jp/cgi-bin/upgun/up1/source/up31158.zip
0290チンパンジー愛ちゃん
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
0291デフォルトの名無しさん
2009/08/19(水) 15:24:450292デフォルトの名無しさん
2009/08/19(水) 15:25:05やっぱsixamoかよ、なんでわざわざ名前伏せるんだw
でもこれ微妙に改変されててバージョン情報に偽りが・・・まあこの際どうでもいいか
とりあえずホンモノ使っときゃいいんじゃね
http://yowaken.dip.jp/sixamo/
0293デフォルトの名無しさん
2009/08/19(水) 15:32:10本物はRubyのバージョン的に動かないって書いてあったので・・。
動かしてみた感じでは本物は受け答えできず。
改変版は数行実行したのちエラー。
ログのTXTファイル空にしたらまた動くので、文字コードとか?文章作成あたりでエラーになってると予測。
本物より動きそうなんですがね。。
0294デフォルトの名無しさん
2009/08/19(水) 15:42:14あなたがただのユーザーなら、Rubyで動作するプログラムは現存しないので諦めれ
あなたがプログラミングを行う者なのなら、あなたが自力で全体修繕して作れ
どっちか
0295203
2009/08/19(水) 15:58:50ご指摘ありがとうございます。
各クラスのメソッドの知識がないみたいなのでそこを勉強して出直してきます。
また、初期値なども勉強してきます。
昨日からいろいろな人に教えていただきましてまことにありがとうございます。
0296チンパンジー愛ちゃん
2009/08/19(水) 16:15:540297デフォルトの名無しさん
2009/08/19(水) 16:28:450298デフォルトの名無しさん
2009/08/19(水) 16:48:22寝る。
0299デフォルトの名無しさん
2009/08/19(水) 17:02:48みんな
おつかれ
0300デフォルトの名無しさん
2009/08/19(水) 18:36:53Ruby1.9なら1.8を
もし引数無しで起動したならリンク先ちゃんと読め
0301デフォルトの名無しさん
2009/08/19(水) 19:09:170302デフォルトの名無しさん
2009/08/19(水) 19:48:41>初心者が混乱しているときは大抵教え方が悪い
名言だな。こんどから>>1に追加してほしいくらいだ。
0303デフォルトの名無しさん
2009/08/19(水) 20:06:36もし質問者側からそんなこと言われたらたまったもんじゃないな
0304チンパンジー愛ちゃん
2009/08/19(水) 21:29:48独りよがりの教えほど迷惑なものはありませんから。
0305191
2009/08/19(水) 22:21:17あとは俺に任せてくれ。
0306デフォルトの名無しさん
2009/08/19(水) 22:30:230307デフォルトの名無しさん
2009/08/20(木) 03:35:310308デフォルトの名無しさん
2009/08/20(木) 07:19:18どっちの逆引き?
0309デフォルトの名無しさん
2009/08/20(木) 08:08:59どちらの逆引きか、逆引きの方か、逆引きの方かはっきり囲うな?
0310デフォルトの名無しさん
2009/08/20(木) 08:12:140311デフォルトの名無しさん
2009/08/20(木) 08:58:41最近いろいろあるから次買うとき迷うな
>>309
書き足すっていうぐらいだからWikiのほうだろう
0312デフォルトの名無しさん
2009/08/20(木) 13:38:05これって困ってる人いないのかな
0313デフォルトの名無しさん
2009/08/20(木) 14:06:37そこまで自覚があるなら、さっさと消えろよ
0314デフォルトの名無しさん
2009/08/20(木) 17:19:03あー,それ確か俺も愕然とした記憶が。
「=begin, =end は使わないことにする」で解決!
0315デフォルトの名無しさん
2009/08/21(金) 10:58:26データは一行ずつ出力されるので問題は生じません。
しかし、特殊な設定情報だけは複数行出力で、行数が不定です。
このような何行か分からない出力を受け取るにはどのような手法が適しているでしょうか?
0316デフォルトの名無しさん
2009/08/21(金) 11:09:32ただの改行文字だろ
0317デフォルトの名無しさん
2009/08/21(金) 11:10:20設定情報1行目だったら通常の処理飛ばしてそこに溜めるようにすれば?
0318315
2009/08/21(金) 11:26:15とりあえず、一行ずつ << 演算子で設定情報用の配列の末尾に追加していくことにしました。
EOFがないので終了条件をどうするか悩んでみます。
0319デフォルトの名無しさん
2009/08/21(金) 11:40:13EOFって全体の?
終了データが流れてこないとかpingみたいな定期送信がないなら
手動停止させるのが普通だと思う
可変長データなのにサイズ情報も終端情報もないのだとしたら
次の通常のデータが送られてきた時にバッファ吐き出して設定処理するとか
0320デフォルトの名無しさん
2009/08/21(金) 11:43:570322デフォルトの名無しさん
2009/08/21(金) 13:43:36libディレクトリを作ってファイル分けしてみたら10ファイルくらいになりました
んで、これを日常で使いたいと思います
「開発ディレクトリ」と「実行ディレクトリ」を分けなければなりません
(動作しない状態であることが多い開発中のスクリプトをcronなどで触らせたくない)
どこか適当なディレクトリに「インストール」してバージョンを維持するのがいいと思ってます
最初は rubygem パッケージにすることを考えましたが、
require 'rubygems' で1秒近くかかる環境なので正直あまりやりたくありません
(たぶん、スクリプト本体の実行時間のほうが短い)
これ以外になにかてきとーな方法はありませんか?
0323デフォルトの名無しさん
2009/08/21(金) 13:52:21subversionあたり使うとか
0324デフォルトの名無しさん
2009/08/21(金) 13:59:42rake install で超適当なディレクトリに超適当に上書きするような rake スクリプトを書く
要は実行可能なときにファイルをコピーしておきたいってことだろ
ファイルをコピーするという行為だけ rake で書け
バージョン戻すという行為が簡単にできないのだけが難点だが、
まあ実行用ディレクトリを適当に圧縮でもしてバックアップしとけ
0325デフォルトの名無しさん
2009/08/21(金) 15:25:22ary = [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]
とするより、良い方法はないものでしょうか?
これに限らず、配列処理で直前(または 直後)の要素を参照しながら
進めていくスマートな方法があれば教えていただきたいのですが・・・。
0326デフォルトの名無しさん
2009/08/21(金) 15:32:32result = ary.select{|v| v == prev ? false : (prev = v) }
0327デフォルトの名無しさん
2009/08/21(金) 15:33:180328デフォルトの名無しさん
2009/08/21(金) 15:33:530329デフォルトの名無しさん
2009/08/21(金) 15:51:43selectをこういうふうに使えるのは知りませんでした。
関数型言語みたいで格好いいなあ。
>>328
こういうのを探していました。ありがとうございます。
0330デフォルトの名無しさん
2009/08/21(金) 20:16:48使いこなせてないからかもしれないけども,まだ自分にはpとかppで十分かな.
どんなレベルからデバッガつかってんの?
0331デフォルトの名無しさん
2009/08/21(金) 21:20:08IDE?エディタ+コンソール?
0332デフォルトの名無しさん
2009/08/21(金) 22:31:20エディタ+コンソール派
軽くて良いIDEがあったら、そっちに乗り換えるつもり
0333デフォルトの名無しさん
2009/08/21(金) 23:22:01謝罪と賠償ニダ。
0334デフォルトの名無しさん
2009/08/21(金) 23:24:210335デフォルトの名無しさん
2009/08/22(土) 00:53:030336デフォルトの名無しさん
2009/08/22(土) 02:00:360337デフォルトの名無しさん
2009/08/22(土) 02:03:57はじめたばっかりですけど
0338デフォルトの名無しさん
2009/08/22(土) 08:22:51NetBeansがいいんかな?
0339デフォルトの名無しさん
2009/08/22(土) 08:29:08言語仕様的問題だとは思うんだが
0340デフォルトの名無しさん
2009/08/22(土) 09:44:00result = ary.zip([nil]+ary).select{|x,y| x!=y}.map(&:first)
0341デフォルトの名無しさん
2009/08/22(土) 09:53:39each_consが提示された時点で問題外
オナニー以下
0342デフォルトの名無しさん
2009/08/22(土) 13:45:35悪例だったらダメだけど,>>340 は「へーこういうのもあるんだ」的な
例にもなってると思うし。
0343デフォルトの名無しさん
2009/08/22(土) 15:15:49Target.new(param).hoge(data)
data #<= Target に関する情報が追加されている
という処理をします
hoge というメソッドにわかりやすい名前を付けたいのですが、なんかいい案ありませんか
凝ってもアレだし update とか register でいいですかね
0344デフォルトの名無しさん
2009/08/22(土) 15:17:19普通に悪例だと思うが
0345デフォルトの名無しさん
2009/08/22(土) 15:23:300346デフォルトの名無しさん
2009/08/22(土) 16:12:11Hoge#dup_to(data) とか
updateならHashにならってHoge#update(Target)にすべき
後は
hoge = Target.new(param).to_hoge
とか
hoge = Hoge.new(Target.new(param))
0347デフォルトの名無しさん
2009/08/22(土) 16:27:30「自分の内容で引数のデータオブジェクト(自分とは別構成)を更新する」というメソッドに
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 => …}, ...} になるって奴
0348346
2009/08/22(土) 17:09:40×Hoge#dup_to(data)
○Target#dup_to_(data)
dup_to(data)じゃなくてdup(type=nil)にして
typeがクラスならデータ格納したインスタンスを生成、
インスタンスならそれに情報をコピー、nilならsuperとかどうだろう
0349デフォルトの名無しさん
2009/08/22(土) 18:04:05ObjectやModuleの基本メソッドは上書きすんな
0350デフォルトの名無しさん
2009/08/22(土) 18:08:08irb> a = []
irb> b = a.dup
irb> a << 1
irb> p b
[]
0351デフォルトの名無しさん
2009/08/22(土) 18:35:05> ObjectやModuleの基本メソッドは上書きすんな
なんで?
inspectとか==とかto_*とか普通上書きするだろ、最たるものはinitialize
それにdupに引数与えなければ以前と同じ動作をするんだから互換性も問題無い
0352デフォルトの名無しさん
2009/08/22(土) 18:51:28自分なら Target.new(param).hoge は Hash あたりを吐き出すようにして
data側が自分で取り込むようにする
たとえばdata = {} なら data.update( Target.new(param).hoge )
だから名前は、ある種のアクセサとして吐き出すデータに見合った名前か
主要なデータをまるっと吐くなら to_h とか
>>351
機能はそのままに、そのオブジェクトに見合うよう上書きするのと
機能自体を拡張するという違いがあるからなぁ
ダメだと思わないけど積極的にやるのも微妙な感じ
■ このスレッドは過去ログ倉庫に格納されています