[#45530] [ruby-trunk - Feature #6311][Open] memmem()によるrb_memsearch()の高速化 — "Glass_saga (Masaki Matsushita)" <glass.saga@...>

12 messages 2012/04/17

[#45554] [ruby-trunk - Bug #6344][Open] 1.9.3 p125, p194 ruby causes SEGV with test_massign.rb on ppc/ppc64 — "mtasaka (Mamoru Tasaka)" <mtasaka@...>

14 messages 2012/04/23

[ruby-dev:45531] [ruby-trunk - Bug #6195] String#[] に逆順の Range を渡した場合の挙動

From: "knu (Akinori MUSHA)" <knu@...>
Date: 2012-04-18 07:49:27 UTC
List: ruby-dev #45531
Issue #6195 has been updated by knu (Akinori MUSHA).


文字列のスライスが(Rangeの始点さえ範囲内なら)nilを返さないという現仕様は利便性にフォーカスしていて合理的だと思っています。

たとえば、

    if s.start_with?(prefix)
      logger.info "message body is " + s[prefix.length..-1]
    end

のようなコードは私の手元にもたくさんありますし、Rubyのソースツリーで grep -rF ..-1 lib して眺めただけでもnilを期待していない所はいくつもあるようです。
----------------------------------------
Bug #6195: String#[] に逆順の Range を渡した場合の挙動
https://bugs.ruby-lang.org/issues/6195#change-25981

Author: mrkn (Kenta Murata)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro Matsumoto)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-03-23 trunk 35121) [x86_64-darwin11.3.0]


以下のように String#[] に対して、範囲の開始インデックスが文字列の長さ以下の値である逆順の Range (beg > end) を渡した場合に空文字列が返ります。

  "1"[1..0] #=> ""
  "1"[1..-1] #=> ""
  "123"[2..1] #=> ""
  "123"[2..-2] #=> ""

一方、範囲の開始インデックスが文字列の長さより大きい場合は nil が返ります。

  "1"[2..0] #=> nil
  "1"[2..-1] #=> nil
  "123"[4..1] #=> nil
  "123"[4..-2] #=> nil

この挙動の違いは、rb_range_beg_len の実装に起因しています。
文字列のインデックスが昇順のみである仕様を考慮すると、上記前者の場合も nil が返るべきじゃないかと思います。



-- 
http://bugs.ruby-lang.org/

In This Thread