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)}"
答案 0 :(得分:1)
最简单,最好的方法是通过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) method。
因此,即使您不需要另一种方法来调用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