双重与单引号

imj*_*mjp 160 ruby string syntax

我是Ruby的新手,我试图了解是否应该使用""vs 的特定时间''.

我大部分时间都在使用单引号,因为它更容易打字,但我不确定是否应该.

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

Jit*_*its 195

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

world_type = 'Mars'
"Hello #{world_type}"
Run Code Online (Sandbox Code Playgroud)

  • 没有理由只在需要插值时使用双引号,没有显着的性能影响,它只会让您思考必须使用的内容。只需使用双引号字符串。 (11认同)
  • 否 - 双引号只允许字符串插值.如果您不想要字符串插值,则不应使用双引号. (7认同)
  • 所以基本上,一直使用双引号,对吧? (2认同)

lfx*_*ool 132

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

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 
Run Code Online (Sandbox Code Playgroud)

  • 除了单独转义单引号外,例如"不要". (41认同)
  • 反斜杠也尝试`puts'\\'`它只会打印单斜杠.请参阅http://stackoverflow.com/questions/25499046/is-it-possible-to-escape-character-within-single-quotes-in-ruby/25499079 (5认同)
  • 对于这个问题,这是一个非常有用的答案.我从来没有意识到单引号是用于在单引号之间打印所有内容,除了必须转义的引号之外.谢谢. (2认同)
  • 是的,只有两种情况可以用单引号转义 (2认同)

Amo*_*tir 38

要回答您的问题,您必须""在想要进行字符串插值时使用:

a = 2
puts "#{a}"
Run Code Online (Sandbox Code Playgroud)

否则使用简单的引号.

此外,如果您想知道性能方面是否存在差异,那么StackOverflow上存在一个很好的问题.

如果你是RoR的新手,我恳请你学习一本体面的Ruby书来学习该语言的基础知识.它将帮助您了解您正在做的事情(并且会让您不再认为Rails是神奇的).我个人推荐The Well扎根的Rubyist.


alo*_*cas 31

Ruby中的单''引号和双引号之间的区别在于""要对字符串求值的内容.

最初,我想澄清一下,在字符串的字面形式中,引号或引号之间的任何内容都被评估为字符串对象,这是Ruby String类的一个实例.

因此,'stackoverflow'"stackoverflow"两者都将评估String类的实例都没什么区别.

区别

两个字面形式的字符串(单引号或双引号)之间的本质区别在于双引号允许转义序列,而单引号则不允许!

由单引号创建的字符串文字不支持字符串interpollat​​ion,也不会转义序列.

一个很好的例子是:

"\n" # will be interpreted as a new line
Run Code Online (Sandbox Code Playgroud)

'\n' # will display the actual escape sequence to the user
Run Code Online (Sandbox Code Playgroud)

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

'#{Time.now}'
=> "\#{Time.now}" # which is not what you want..
Run Code Online (Sandbox Code Playgroud)

最佳实践

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

  • 当你指定a ='\n'时,通过将a分隔为b来解释为"\\n",你将不会得到一个新行.b将评估为"\\n"(没有新行获得转义序列).a ='\n'=>"\\n",其中a ="\n"=>"\n" (3认同)

小智 6

与打印中的答案“\n”类似,下面是另一种差异情况

puts "\1"  -> get special character
puts '\1'  -> get \1
Run Code Online (Sandbox Code Playgroud)

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


Imr*_*ran 6

单引号字符串不处理ASCII转义码(\n,\ t等),并且它们不进行字符串插值,而双引号则执行两者.

转义代码示例:

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

2.4.0 :005 > puts "Hello \n World"
Hello
World
Run Code Online (Sandbox Code Playgroud)

插值示例:

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
Run Code Online (Sandbox Code Playgroud)


Yar*_*rin 5

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

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

"123 ABC".match('\d')
=> #<MatchData "1">
Run Code Online (Sandbox Code Playgroud)

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

"123 ABC".match("\d")
=> nil
Run Code Online (Sandbox Code Playgroud)