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在每次执行替换时调用该方法时,我最终会得出“我认为我们应该实施 D 计划而不是 Q 计划”。我有一个偷偷摸摸的怀疑,该gsub方法不是为此而构建的,而且无法完成,所以你能建议最简单的方法来实现这一点吗?

4

2 回答 2

4

Ruby 的一个基本原则是“当有疑问时,尝试一个代码块”。事实上,gsub()它的第二个参数接受一个代码块来代替字符串。

这是一个类似于您正在寻找的示例:

'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 回答
0

gsub接受一个块,如果给定,则在每次匹配时调用它。从中返回您的随机值。

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

def generate_random_plan s
  plans = ('A'..'Z').to_a
  s.gsub('<random_plan>') do
    plans.sample # random plan
  end
end

generate_random_plan my_string # => "I think we should implement A instead of J"
generate_random_plan my_string # => "I think we should implement Q instead of A"
generate_random_plan my_string # => "I think we should implement Z instead of H"
于 2013-04-04T08:35:43.893 回答