Ruby:使用[] =更改字符串的内容时,超出范围

时间:2011-08-16 08:17:05

标签: ruby

我是Ruby的新手,我正在阅读"Ruby Programming Language",当遇到“3.2.4访问字符和子字符串”部分时,有一个例子说明使用[]=来改变第56页和第57页的字符串内容:

s = 'hello'; # Ruby 1.9
....
....
s[s.length] = ?! # ERROR! Can't assign beyond the end of the string

是的,这是真的,你不能在字符串的末尾分配。
但是,当我在IRB上玩它时,我得到了不同的结果:

irb(main):016:0> s[s.length] = ?!
=> "!"
irb(main):017:0> s
=> "hello!"
  

Ruby OS 1.9.2p180(2011-02-18修订版30909),适用于Mac OS X 10.6.8

2 个答案:

答案 0 :(得分:1)

这本书是从2008年开始的,示例使用的是Ruby 1.8,在1.9.2中它完美运行:

# Ruby 1.8.7-p352
s = 'hello'
s[s.length] = ?!
puts s

# => IndexError: index 5 out of string
#      method []= in ruby.rb at line 3
#      at top level in ruby.rb at line 3

# Ruby 1.9.2-p290
s = 'hello'
s[s.length] = ?!
puts s

# => hello!

答案 1 :(得分:1)

不错的皮卡确实看起来像Ruby 1.8 vs 1.9。看起来在1.9中,字符串[]=的处理方式与字符串insert方法类似。

您可以使用insert方法在另一个字符串中的特定字符之前插入字符串。所以我们以字符串“hello”为例:

ruby-1.9.2-p180 :238 > s = "hello"
 => "hello" 
ruby-1.9.2-p180 :239 > s.length
 => 5 
ruby-1.9.2-p180 :240 > s.insert(s.length, " world")
 => "hello world" 

但现在让我们尝试使用insert插入s.length + 1

ruby-1.9.2-p180 :242 > s = "hello"
 => "hello" 
ruby-1.9.2-p180 :243 > s.insert(s.length + 1, " world")
IndexError: index 6 out of string
    from (irb):243:in `insert'

如果我们使用[]=方法,我们会得到相同的行为:

ruby-1.9.2-p180 :244 > s = "hello"
 => "hello" 
ruby-1.9.2-p180 :245 > s[s.length] = " world"
 => " world" 
ruby-1.9.2-p180 :246 > s
 => "hello world" 
ruby-1.9.2-p180 :247 > s = "hello"
 => "hello" 
ruby-1.9.2-p180 :248 > s[s.length + 1] = " world"
IndexError: index 6 out of string
    from (irb):248:in `[]='

因此,Ruby 1.9非常聪明,可以识别您何时尝试分配到刚刚超过字符串结尾的索引,并自动将其视为插入/连接。无论这种行为是否合适,可能取决于个人偏好,当然要注意这是你可以期待的行为。