【问题标题】:Double vs single quotes双引号与单引号
【发布时间】:2011-09-17 17:26:17
【问题描述】:

我真的是 Ruby 新手,我正在尝试了解是否有特定时间应该使用 ""''

我大部分时间都在使用单引号,因为这样更容易输入,但我不确定是否应该这样做。

例如get 'user/new'get "user/new"

【问题讨论】:

  • 你确定这是一个 RoR 问题,而不仅仅是一个 Ruby 问题?
  • 是否有相关的风格指南来选择何时不需要字符串插值?

标签: ruby string syntax


【解决方案1】:

要回答你的问题,当你想做字符串插值时,你必须使用""

a = 2
puts "#{a}"

否则使用简单的引号。

另外,如果你想知道在性能方面是否存在差异,有一个优秀的question about this on StackOverflow.

如果您真的是 RoR 的新手,我建议您选择一本不错的 Ruby 书籍来学习该语言的基础知识。它会帮助你理解你在做什么(并且不会让你认为 Rails 是神奇的)。我个人推荐The Well grounded Rubyist

【讨论】:

    【解决方案2】:

    " " 允许您进行字符串插值,例如:

    world_type = 'Mars'
    "Hello #{world_type}"
    

    【讨论】:

    • 所以基本上,一直使用双引号,对吧?
    • 否 - 双引号只允许字符串插值。如果你不想要字符串插值,那么你不应该使用双引号。
    • 没有理由只在需要插值时才使用双引号,对性能没有显着影响,它只会让您思考必须使用的内容。只需使用双引号字符串。
    【解决方案3】:

    在这种特定情况下,您如何编写它没有区别。它们是等价的。此外,您可能还想阅读更多 Ruby 指南/教程 :)

    【讨论】:

    • 它们不等价,因为双引号允许字符串解释。
    • 在做出极其聪明的观察之前,您是否阅读了“在这种特定情况下”部分?
    • 是的,但他的问题是何时使用单引号和双引号。
    【解决方案4】:

    除了插值,另一个区别是'转义序列'在单引号中不起作用

    puts 'a\nb' # just print a\nb 
    puts "a\nb" # print a, then b at newline 
    

    【讨论】:

    • 除了转义单引号本身,例如'don\'t'
    • 这是对这个问题的一个非常有用的答案。我从来没有意识到单引号是为了打印单引号之间的所有内容,除了必须转义的引号。谢谢。
    • 反斜杠也可以试试puts '\\' 它只会打印单斜杠。看这里stackoverflow.com/questions/25499046/…
    • 是的,只有两种情况可以用单引号转义
    • @Alexis 不确定,可能在性能上有一点差异
    【解决方案5】:

    与打印中的答案“\n”类似,以下是另一种不同的情况

    puts "\1"  -> get special character
    puts '\1'  -> get \1
    

    所以看起来 * 被转换为双引号中的转义字符,但不是单引号。 顺便说一句,在正则表达式中使用时会影响输出 例如。, str.gsub(/正则表达式/, '\1,\2')

    【讨论】:

      【解决方案6】:

      在 Ruby 中单引号 '' 和双引号 "" 之间的区别在于要对字符串进行评估。

      首先,我想澄清一下,在字符串的文字形式中,单引号引号之间的任何内容都会被评估为string 对象,它是 Ruby String 类的一个实例。

      因此,'stackoverflow'"stackoverflow" 都将评估 String 类的实例完全没有区别

      区别

      两种文字形式的字符串(单引号或双引号)之间的本质区别是双引号允许转义序列,而单引号不允许!

      由单引号创建的字符串文字不支持字符串轮询并且不转义序列。

      一个简洁的例子是:

      "\n" # will be interpreted as a new line
      

      '\n' # will display the actual escape sequence to the user
      

      用单引号插值根本不起作用:

      '#{Time.now}'
      => "\#{Time.now}" # which is not what you want..
      

      最佳实践

      正如大多数 Ruby Linters 建议对字符串使用单引号文字在插值/转义序列的情况下使用双引号。

      【讨论】:

      • 所以如果你有 a = '\n' 和 b = "#{a}",b 会被解释为换行符还是转义序列?
      • 当你分配 a = '\n' a 被解释为 "\\n" 通过将 a 插入 b 你不会得到一个新行。 b 将评估为 "\\n" (没有新行你得到转义序列)。 a = '\n' => "\\n" 其中 a = "\n" => "\n"
      【解决方案7】:

      单引号字符串不处理 ASCII 转义码(\n、\t 等),它们 不要在双引号同时进行字符串插值。

      转义码示例:

      2.4.0 :004 >   puts 'Hello \n World'
      Hello \n World
      
      2.4.0 :005 > puts "Hello \n World"
      Hello
      World
      

      插值示例:

      2.4.0 :008 >   age=27
       => 27
      
      2.4.0 :009 > puts 'Age: #{age}'
      Age: #{age}
      
      2.4.0 :009 > puts "Age: #{age}"
      Age: 27
      

      【讨论】:

        【解决方案8】:

        您想要使用单引号的另一个原因是在将正则表达式模式作为字符串传递时:

        此正则表达式模式将起作用,因为在单引号内传递:

        "123 ABC".match('\d')
        => #<MatchData "1">
        

        此正则表达式模式将失败,因为在双引号内传递(您必须对其进行双重转义才能使其工作):

        "123 ABC".match("\d")
        => nil
        

        【讨论】:

          猜你喜欢
          • 2012-12-13
          • 2012-12-30
          • 1970-01-01
          • 1970-01-01
          • 2013-02-07
          • 1970-01-01
          • 2016-03-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多