2012-07-11 26 views
1

IRB和Rails控制檯都有一個很好的輸出只有引號的符號的方式 - 必要時可以逃脫它們。一些例子:只有在需要的情況下,我如何才能用引號轉義Ruby符號?

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)}" 

回答

1

做的最簡單有效的方法,這是通過符號的檢查方法:

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,如果你感興趣的話。

所以,即使你並不需要另一種方法來調用檢查,這將是最簡單的實現:

def escape_symbol(sym) 
    sym.inspect 
end 

這是我在與幾個regexs實施的嘗試,但我建議使用檢查相反,如果您可以:

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 
相關問題