【问题标题】:How can I escape a Ruby symbol with quotes only if needed?如何仅在需要时才使用引号转义 Ruby 符号?
【发布时间】:2012-07-11 16:17:56
【问题描述】:

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

【问题讨论】:

    标签: ruby symbols


    【解决方案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

    因此,即使您不需要其他方法来调用检查,这也是最简单的实现:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多