Ruby 发现一个 Array 的坑

sevk · 2013年08月14日 · 最后由 reyesyang 回复于 2013年08月15日 · 3480 次阅读

发现一个 Array 的坑:

a=[1,2]
竟然 a[3,1].class != a[2,1].class

a[3..9].class != a[2..9].class


补充:他们应该都是 NilClass 才对。

a[3,1].class = NilClass

这不是坑,是你用错了,a[3,1] 表示获取从第 3 位起的一个下标,a 这个数组只有两个,当然返回 nil

#1 楼 @huacnlee 好像不是这样,a[3,1] 实际取的是 a[3] , a[2,1] 实际取的是 a[2] ,这俩应该都是 nil 按道理。

#1 楼 @huacnlee

a[0,1] 和 a[1,1] 不是 nil .

但是 a[2,1] 也应该是 nil 才对啊。

虽然只是理论上的坑,实际中我没遇到这个坑。怕以后有人会遇到 :)

api 文档里有一句。 Additionally, an empty array is returned when the starting index for an element range is at the end of the array. 所以

a[2, 1] = []

#5 楼 @jjzxcc 这是出于什么考虑呢?是为了保护一些没算准的遍历么...

@blacktulip 难道是挖个坑让 LZ @sevk 这样的跳?哈哈

#3 楼 @sevk 额,位数数错了...

空数组和 nil 能一样吗?这坑不是 Array 的,是楼主自己挖的。 注:数组有一个“尾部标记”,用于判断结尾,开头为 0,结尾=length。

楼主是不是在 IRC #ruby 中也提过?

#3 楼 @sevk 我记得《松本行弘的程序世界》那本书上有说过数组最后一个元素后面会有一个值但不是 nil

#6 楼 @blacktulip 同意 应该算是保护措施...

irb(main):001:0> a = [1,2,3,4]
=> [1, 2, 3, 4]
irb(main):002:0> a[2,2]
=> [3, 4]
irb(main):003:0> a[2,3]
=> [3, 4]
irb(main):004:0> a[2,5]
=> [3, 4]

我觉得比返回[3, 4, nil, nil]要方便得多...

#5 楼 @jjzxcc

哦,这一点违背了 Ruby 的最小惊讶原则,还好,这方面的坑不多,也没啥影响。

#5 楼 @jjzxcc 这句话居然只在 2.0 的文档中有,1.9 的都没。😓

需要 登录 后方可回复, 如果你还没有账号请 注册新账号