Почему String # index возвращает ноль здесь? - PullRequest
1 голос
/ 20 июля 2010

В последних двух строках:

$ 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 возвращает ноль?

Ответы [ 3 ]

1 голос
/ 20 июля 2010

"\ x01 \ x11 \ xfe" недопустим в UTF8.

Если вы позвоните t "\x01\x11\xfe".force_encoding(Encoding::BINARY), вы получите ожидаемое 0.

0 голосов
/ 20 июля 2010

Я подозреваю, что это как-то связано с разницей между одинарными и двойными кавычками со строковыми литералами в 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 

Я уверен, что кто-то может лучше объяснить, почему это происходит, это как раз то, чтоЯ испытал на себе рубин.

0 голосов
/ 20 июля 2010

На моем старшем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...