为什么String #index在这里返回nil?

时间:2010-07-20 02:35:53

标签: ruby string

在最后两行:

$ ruby -v
ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10]
$ irb
irb(main):001:0> def t(str)
irb(main):002:1>  str.index str
irb(main):003:1> end
=> nil
irb(main):004:0> t 'abc'
=> 0
irb(main):005:0> t "\x01\x11\xfe"
=> nil
irb(main):006:0> t "\x01\x11\xfe".force_encoding(Encoding::UTF_8)
=> nil

str.index str为什么返回nil?

3 个答案:

答案 0 :(得分:1)

“\ x01 \ x11 \ xfe”无效UTF8。

如果您致电t "\x01\x11\xfe".force_encoding(Encoding::BINARY),您将获得预期的0。

答案 1 :(得分:0)

我的旧Ruby上的行为有所不同:

$ ruby -v ; irb
ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux]
irb(main):001:0> def t(str)
irb(main):002:1>  str.index str
irb(main):003:1> end
=> nil
irb(main):004:0> t 'abc'
=> 0
irb(main):005:0> t "\x01\x11\xfe"
=> 0

答案 2 :(得分:0)

我怀疑它与ruby中的单引号和双引号与字符串文字之间的区别有关:

ruby-1.9.1-p378 > def t(str) ; str.index(str) ; end
 => nil 
ruby-1.9.1-p378 > t 'abc'
 => 0 
ruby-1.9.1-p378 > t "\x01\x11\xfe"
 => nil 
ruby-1.9.1-p378 > t '\x01\x11\xfe'
 => 0 

简短的回答是,使用单引号进行最少的文本处理,但双引号允许插值,字符转义和其他一些内容。

一些例子:

#interpolation
ruby-1.9.1-p378 > x = 5 ; 'number: #{x}'
 => "number: \#{x}" 
ruby-1.9.1-p378 > x = 5 ; "number: #{x}"
 => "number: 5" 

#character escaping
ruby-1.9.1-p378 > puts 'tab\tseparated'
tab\tseparated
 => nil 
ruby-1.9.1-p378 > puts "tab\tseparated"
tab     separated
 => nil 

#hex characters
ruby-1.9.1-p378 > puts '\x01\x11\xfe'
\x01\x11\xfe
 => nil 
ruby-1.9.1-p378 > puts "\x01\x11\xfe"
�
 => nil 

我相信有人可以更好地解释为什么会发生这种情况,这正是我在我的rubying中所经历的。