只有在需要时,我才能用引号转义Ruby符号

  • 本文关键字:转义 符号 Ruby ruby symbols
  • 更新时间 :
  • 英文 :


IRB和Rails控制台都有一种很好的输出符号的方法,只有在必要时才用引号转义。一些例子:

1.9.3p194 :001 > "@test".to_sym
 => :@test 
1.9.3p194 :002 > "@Test".to_sym
 => :@Test 
1.9.3p194 :003 > "@123".to_sym
 => :"@123" 
1.9.3p194 :004 > "@@_test".to_sym
 => :@@_test 
1.9.3p194 :005 > "test?".to_sym
 => :test? 
1.9.3p194 :006 > "test!".to_sym
 => :test! 
1.9.3p194 :007 > "_test!".to_sym
 => :_test! 
1.9.3p194 :008 > "_test?".to_sym
 => :_test?
1.9.3p194 :009 > "A!".to_sym
 => :"A!" 
1.9.3p194 :010 > "@a!".to_sym
 => :"@a!"

你自己会怎么做,这样你就可以做到:

puts "This is valid code: #{escape_symbol(some_symbol)}"

最简单、最好的方法是通过Symbol的检查方法:

1.9.3p194 :013 > puts "This is valid code: #{"@a!".to_sym.inspect}"
This is valid code: :"@a!"
 => nil 
1.9.3p194 :014 > puts "This is valid code: #{"a!".to_sym.inspect}"
This is valid code: :a!

如果你好奇的话,你可以看看Ruby 1.9.3中string.c中的sym_inspect(VALUE sym)方法。

因此,即使您不需要另一种方法来调用inspect,这也是最简单的实现:

def escape_symbol(sym)
  sym.inspect
end

以下是我尝试用一些正则表达式来实现的,不过如果可以的话,我建议使用inspect:

def escape_symbol(sym)
  sym =~ /^[@a-zA-Z_]@?[a-zA-Z_0-9]*$/ || sym =~ /^[a-z_][a-zA-Z_0-9]*[?!]?$/ ? ":#{sym}" : ":"#{sym.gsub(/"/, '\"')}""
end

最新更新