3
specialChars = "]%#$!_.+?~&[*/^;@"

puts(specialChars[16])

打印一个空行。为什么会这样?我需要转义一些角色吗?

4

3 回答 3

6

#是用于字符串插值的保留字符,当用“分隔时:

# Example
puts "My name is #{my_name}!"

如果你使用''而不是"",字符串插值被禁用,你可以正常使用它:

# The "" has been replaced with ''
specialChars = ']%#$!_.+?~&[*/^;@'
puts specialChars[16]
# => '@'
于 2013-11-13T02:05:25.960 回答
0

正如其他答案所说,当一个印记字符 ie or跟随时,该字符#被解释为插值。除了使用单引号来避免这种情况外,另一种方法是重新排列字符,例如:$@

"]%#!_.+?~&[*/^;@$"
于 2013-11-13T03:37:54.003 回答
0

Aaron Cronin 说得对:#$!被解释为字符串插值命令。你真的应该在 IRB 中运行这样的 Ruby 代码,这样你就可以很容易地看到结果:

irb(main):001:0> specialChars = "]%#$!_.+?~&[*/^;@"
=> "]%_.+?~&[*/^;@"

查看结果的另一种方法是运行p specialChars或等效puts specialChars.inspect。使用这些技术检查行为异常的对象是一个好习惯。

井号 (#) 通常允许在字符串中使用,但如果它在双引号字符串中并且后跟 a $,那么它将进行字符串插值。在您的情况下,它正在获取全局变量$!,将其转换为带有 的字符串.to_s,然后将其粘贴在字符串中。您的代码相当于:

specialChars = "]%#{$!}_.+?~&[*/^;@"

以下是字符串插值的更多示例:

"Hello, #{name}!"   # method or local variable
"Hello, #@name!"    # instance variable
"Hello, #$name!"    # global variable
于 2013-11-13T02:14:18.443 回答