2

私のプログラムがこうだったとしましょう:

my_string = "I think we should implement <random_plan> instead of <random_plan>"


 def generate_random_plan

   #Some code that returns a string that is not the same every time the method is called, involving randomness.

 end

puts my_string.gsub("<random_plan>", generate_random_plan)

したがって、私が書いたように、「プラン H の代わりにプラン H を実装する必要があると思います」のような内容が出力されます。私が本当に望むのはgsub、メソッドが置換を実行するたびにメソッドを呼び出すことである場合、「プラン Q の代わりにプラン D を実装する必要があると思います」という結果になる可能性があります。gsubメソッドがそのために構築されておらず、実行できないのではないかと疑っています。これを実現する最も簡単な方法を提案してもらえますか?

4

2 に答える 2

4

Ruby の基本原則の 1 つは、「迷ったときはコード ブロックを試してみること」です。実際、gsub()2 番目のパラメーターの文字列の代わりにコード ブロックを受け入れます。

探しているもののような例を次に示します。

'axbxcxdxe'.gsub( 'x' ) { rand(9) }

そのコードを試してみるとirb、x のランダムな数字が得られます。

a0b6c0d3e

置換コード ブロックは、特に元の一致した文字列をパラメーターとして受け取るため、強力な機能です。不自然な例として、文字列の母音のみを大文字に変換したいとします。

def vowelup( s )
    s.gsub( /[aeiouy]/ ) { |c| c.upcase }
end

print vowelup( 'Stack Overflow' )

これは以下を出力します:

StAck OvErflOw

JavaScript にも本質的に同じ機能があります。

function vowelup( s ) {
    return s.replace( /[aeiouy]/g, function( c ) {
        return c.toUpperCase();
    });
}

console.log( vowelup('Stack Overflow') );
于 2013-04-04T08:34:08.760 に答える