代码之家  ›  专栏  ›  技术社区  ›  Adrian

为什么字符串索引在这里返回nil?

  •  1
  • Adrian  · 技术社区  · 14 年前

    最后两行:

    $ 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 回复  |  直到 14 年前
        1
  •  1
  •   sepp2k    14 年前

    “\x01\x11\xfe”不是有效的UTF8。

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

        2
  •  0
  •   sarnold    14 年前

    $ 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
    
        3
  •  0
  •   phiggy    14 年前

    我怀疑这与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 
    

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