2010-07-20 46 views
1

在最後兩行:爲什麼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返回零?

+0

我只是使用Ruby的Windows上的相同版本(1.9.1p378)跑了您的例子,它工作得很好。 – Intelekshual 2010-07-20 02:48:47

回答

1

「\ x01 \ x11 \ xfe」無效UTF8。

如果你打電話t "\x01\x11\xfe".force_encoding(Encoding::BINARY),你會得到預期的0.1

0

的行爲對我的大紅寶石不同:

$ 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 
0

我懷疑它是與紅寶石單引號和雙引號與字符串文字的區別:

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所經歷的。

相關問題