質問

私は自分自身は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"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top