質問
私は自分自身はRubyで多くのことをPHPのようなループを使用して見つけて、言語の残りの部分はとてもきちんとしているとき、それは間違って感じています。私はこのようなコードで羽目になるます:
conditions_string = ''
zips.each_with_index do |zip, i|
conditions_string << ' OR ' if i > 0
conditions_string << "npa = ?"
end
# Now I can do something with conditions string
私はこのような何かを行うことができるはずのように私は感じる。
conditions_string = zips.each_with_index do |zip, i|
<< ' OR ' if i > 0
<< "npa = ?"
end
Rubyでブロックで変数を設定するには、「ニート」方法はありますか?
解決
あなたはあなたのループでzip
にアクセスしていないようですので、次は動作するはずます:
conditions_string = (['npa = ?'] * zips.length).join(' OR ')
あなたはzip
にアクセスする必要がある場合は、あなたが使用することができます:
conditions_string = zips.collect {|zip| 'npa = ?'}.join(' OR ')
他のヒント
あなたが実際に郵便番号の値を使用していないので、私はお勧めしたい。
zips.map {|zip| "npa = ?" }.join(" OR ")
が、一般的に、私はループのこの種のを避けるために列挙#の注入機能を見てお勧めしたい。
私が考える最初の事は、このでした
a = %w{array of strings} => ["array", "of", "strings"]
a.inject { |m,s| m + ' OR ' + s } => "array OR of OR strings"
しかし、それはちょうどで行うことができます。
a.join ' OR '
そして、私はあなたが私はちょうど使用する可能性がありますあなたの正確な例を複製するために、すぐにその構造が必要になると思うしばらくます:
([' npa = ? '] * a.size).join 'OR'
他の人があなたの特定の問題に多くの慣用的な解決策を与えているが、
、多くのRubyのDSLが使用する標準のトリックですクールな方法Object#instance_eval
は、実際にあります。それは、そのブロック内self
の受信機にinstance_eval
を設定します。
ショート例:
x = ''
x.instance_eval do
for word in %w(this is a list of words)
self << word # This means ``x << word''
end
end
p x
# => "thisisalistofwords"
これはpervasively Perlの$_
はない方法ですべてをカバーしていませんが、それはあなたが暗黙的に1つのオブジェクトにメソッドを送信することができます。
は、
each_with_object
を使用することができます1.8.7+で
これはこれでDigitalRossの '噴射' イディオムを置き換えます:
a = %w{hello my friend} => ["hello", "my", "friend"]
a.each_with_object("") { |v, o| o << v << " NOT " } => "hello NOT my NOT friend NOT"
所属していません StackOverflow