字符串[16]在17个字符的字符串上失败?

时间:2013-11-13 02:01:36

标签: ruby

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

puts(specialChars[16])

打印一个空白行。为什么会这样?我是否需要逃避一些角色?

3 个答案:

答案 0 :(得分:6)

#是用“>

分隔时用于字符串插值的保留字符
# Example
puts "My name is #{my_name}!"

如果使用''而不是“”,则禁用字符串插值,您可以正常使用它:

# The "" has been replaced with ''
specialChars = ']%#$!_.+?~&[*/^;@'
puts specialChars[16]
# => '@'

答案 1 :(得分:0)

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

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

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

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

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

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

"Hello, #{name}!"   # method or local variable
"Hello, #@name!"    # instance variable
"Hello, #$name!"    # global variable

答案 2 :(得分:0)

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

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