こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ruby 毎回同じ様なreplace文を書くのイヤ

db = SQLite3::Database.new('hoge.db')
で、

db.execute('replace into table01 (a, b, c, d, e, f, g) values(?, ?, ?, ?, ?, ?, ?)',va, vb, vc, vd, ve, vf, vg);

とかって書いてるのですが、
これを、

def replace(table,k,v)
db.execute('replace into ' + table + '(' + k.join(',') + ') values('+ k.collect {'?'}'.join(’,’) +')' , ここどうかいたら??)
end

みたいな事を考えたのですが、vって配列でもらった値をばらばらにdb.executeのパラメータに渡したいのですが、
できませんでして、

replace('table',%w(a, b, c, d, e, f, g),[va, vb, vc, vd, ve, vf, vg])

みたいに使いたいです。

引数が可変のパラメータをそのまま、つぎの関数に渡すみたいな。

なんか、ラクする方法ないですか?

ご教授の程、宜しくお願いいたします。

投稿日時 - 2011-12-26 23:30:32

QNo.7210891

困ってます

質問者が選んだベストアンサー

そのまま、可変長引数として取り扱えますよ。
http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fdef.html#method

受ける側のメソッド内で*を外すと、Array扱いになります。
また、Arrayやらといったオブジェクトに*を付けてやると、他のメソッドへバラけたパラメータとして渡すことができます。
http://ideone.com/jbWZX

記載された例で行くと、
(動作チェックはしていません。「v」の扱い方についてだけです)

# このように使いたいなら
replace('table',%w(a, b, c, d, e, f, g),[va, vb, vc, vd, ve, vf, vg])

# こうします。
def replace(table, k, v)
db.execute('replace into ' + table + '(' + k.join(',') + ') values('+ k.collect {'?'}'.join(’,’) +')' , *v)
end

# このように使いたいなら
replace('table',%w(a, b, c, d, e, f, g), va, vb, vc, vd, ve, vf, vg)

# こうします。
def replace(table, k, *v)
db.execute('replace into ' + table + '(' + k.join(',') + ') values('+ k.collect {'?'}'.join(’,’) +')' , *v)
end

投稿日時 - 2011-12-27 03:00:35

お礼

sholmesさん

ご回答ありがとう御座いました。

おかげさまで、上手く出来ました。

投稿日時 - 2011-12-27 14:23:03

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問