在Ruby中,每个程序都可以写成一行,因为换行符是可选的:换行符可以具有的每个函数(表达式分隔符、引入语法块等)也可以由符号(例如。
;
作为表达式分隔符)或关键字(例如。
then
用于引入条件表达式的结果块,或者
case
表达式或
do
介绍的主体
while
或
for
环路等)
例如,您的代码可以写成一行代码,如下所示:
record = [ "\\", "\t", "\n", "\r", "\"" ]; rules = { "\\" => "\\\\", "\t" => "\\t", "\r" => "\\r", "\n" => "\\n" }; regex = /#{ rules.keys.map{|c| Regexp.escape(c)}.join(?|) }/; puts record.map { |field| field.gsub(regex) {|c| rules[c]} }.join("\t")
但是,我们可以对代码进行一些可能的改进。
使用
Regexp::union
建造
regex
:
regex = Regexp.union(rules.keys)
既然你已经经历了建造替代品的麻烦
Hash
,为什么不使用的形式
String#gsub
那个
takes a replacement
Hash
as an argument
:
puts record.map { |field| field.gsub(regex, rules) }.join("\t")