2011-04-13 35 views
2

我想大写每个单词的第一个字符,并保持其余的完整(所以它不同于Rails的titleize,其中压倒了其余的)。第一行是测试,第三行是可行的,但我想知道为什么第二行不行?在Ruby中,为什么“omega-3(dHA)”.gsub(/ b([a-z])/,' 0'.upcase)不起作用?

ruby-1.9.2-p180 :026 > "omega-3 (dHA)".gsub(/\b([a-z])/, '#\0#') 
=> "#o#mega-3 (#d#HA)" 

ruby-1.9.2-p180 :027 > "omega-3 (dHA)".gsub(/\b([a-z])/, '\0'.upcase) 
=> "omega-3 (dHA)" 

ruby-1.9.2-p180 :028 > "omega-3 (dHA)".gsub(/\b([a-z])/) {|s| s.upcase} 
=> "Omega-3 (DHA)" 

回答

7

'\0'.upcase调用串'\0'upcase方法 - 为invokation括号是在Ruby中可选。这当然什么都不做,所以第二行只是.gsub(/.../, '\0')

+3

要扩大一点,gsub方法的第二个参数是表达式''\ 0'.upcase'。这被评估并且它的* result *被传递给gsub。而在第三种情况下,gsub匹配被传递给块,并且在匹配中调用*然后* .upcase方法。 – 2011-04-13 21:12:45

相关问题