Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在ruby中单引号不能与字符串插值一起使用_Ruby - Fatal编程技术网

为什么在ruby中单引号不能与字符串插值一起使用

为什么在ruby中单引号不能与字符串插值一起使用,ruby,Ruby,我尝试了使用#{}使用单引号进行字符串插值,但不起作用。当我试着用双引号时,它是有效的。请向我解释为什么会这样,如果可以用单引号进行字符串插值,以及如果可能的话如何在ruby中进行插值。单引号字符串和转义符/表达式 语言就是这样定义的:不能在单个带引号的字符串中使用嵌入式表达式操作符({})进行插值。与双引号字符串不同,单引号字符串不扫描嵌入表达式或大多数转义。当您需要执行诸如打印转义字符或未赋值表达式之类的操作时,这一点很重要,例如: puts 'This is a newline chara

我尝试了使用
#{}
使用单引号进行字符串插值,但不起作用。当我试着用双引号时,它是有效的。请向我解释为什么会这样,如果可以用单引号进行字符串插值,以及如果可能的话如何在ruby中进行插值。

单引号字符串和转义符/表达式 语言就是这样定义的:不能在单个带引号的字符串中使用嵌入式表达式操作符(
{}
)进行插值。与双引号字符串不同,单引号字符串不扫描嵌入表达式或大多数转义。当您需要执行诸如打印转义字符或未赋值表达式之类的操作时,这一点很重要,例如:

puts 'This is a newline character: \n'
puts 'This is how you embed an expression: #{foo}'
这并不意味着不能以其他方式使用单引号字符串近似插值。例如:

'foo: %s' % 'bar'
#=> "foo: bar"

sprintf '%d, %d, %d', 1, 2, 3
#=> "1, 2, 3"

这就是ruby语言的设计方式。
从语言文档:

双引号字符串允许转义字符,例如换行符\n, \t用于选项卡等
双引号字符串允许插入其他 使用#{…}的值:

可以通过转义“#”字符或使用单引号字符串来禁用插值


Ruby不解释单引号字符串

一开始这似乎是一个限制,但实际上这是一个很好的特性。它允许您在不必转义的情况下输入多个字符,从而产生更清晰的代码:

file = 'C:\foo\bar\baz.txt'

# as opposed to:

file = "C:\\foo\\bar\\baz.txt"
或者当有一个关于字符串插值本身的字符串时:(注意堆栈溢出的语法高亮显示是误导性的——没有插值)

除了
“…”
“…”
,Ruby还有
%q(…)
%q(…)
样式的字符串文字(前者没有,后者有插值)。如果字符串同时包含单引号和双引号,这一点尤其有用:

string = %q(A string containing '...' and "...")
您甚至可以选择自己的分隔符:(同样,语法高亮显示无法跟上)

最后,您可以混合和匹配不同的字符串文字样式:

string = %q(foo) 'bar' "baz"
#=> "foobarbaz"

这个问题看起来有点奇怪,它只是一个语法约定。因为这就是单引号和双引号字符串在Ruby中的工作方式。重复的问题:为什么单引号插值不起作用,而双引号插值在c#中起作用)海报使用双引号理解字符串插值。问题是为什么不使用单引号字符串执行字符串插值,这与问为什么Ruby提供了一种定义字符串的方法(使用单引号)而忽略字符串中的字符串插值指令(例如,
{…}
%
)差不多。请澄清您的问题好吗?除了“语言规范这么说”之外,你在寻找什么样的答案?如果你想知道为什么语言规范会这么说,你必须问matz这个问题。非常感谢,这可以更好地解释一切。我只需要澄清一下为什么在ruby中会这样,是否有可能在ruby中使用单引号进行插值,以及如何做到这一点。你以极好的方式回答了这个问题。谢谢@omokehindeigbekoyi它在Ruby 2.7.2中为我工作。您的里程数(以及Ruby版本)可能会有所不同。
sprintf“%d,%d,%d',1,2,3
仅在我使用Ruby解释器时才在命令行上工作。当我将其写入文件并从命令行运行时,它工作正常,但字符串不会在命令行上输出。为什么要从文件中运行它,或者直接在ruby解释器(irb)中键入并运行它?@omokeindeigbekoyi
sprintf
返回一个字符串,它不会打印字符串。如果您想在标准输出上使用它,请改用
printf
。太好了!谢谢
string = 'In Ruby, you can write "1 + 2 = #{ 1 + 2 }" to get "1 + 2 = 3".'

# instead of:

string = "In Ruby, you can write \"1 + 2 = \#{ 1 + 2 }\" to get \"1 + 2 = 3\"."
string = %q(A string containing '...' and "...")
string = %q@A string containing '...', "..." and (...)"@
string = %q(foo) 'bar' "baz"
#=> "foobarbaz"