1

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

1 に答える 1

1

これを行う最も簡単で最良の方法は、Symbol の inspect メソッドを使用することです。

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

可能であれば、代わりに検査を使用することをお勧めしますが、いくつかの正規表現を使用して実装する試みを次に示します。

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
于 2012-07-11T16:17:57.147 に答える