此代码产生预期的结果:
def test_sub_is_like_find_and_replace
assert_equal "one t-three", "one two-three".sub(/(t\w*)/) { $1[0, 1] }
end
我知道这$1
是第一个匹配的变量,但我不清楚[0,1]
它是什么,或者为什么它取出最后两个字母"two"
。
此代码产生预期的结果:
def test_sub_is_like_find_and_replace
assert_equal "one t-three", "one two-three".sub(/(t\w*)/) { $1[0, 1] }
end
我知道这$1
是第一个匹配的变量,但我不清楚[0,1]
它是什么,或者为什么它取出最后两个字母"two"
。
这在String.[]
文档中有所介绍,特别是:
str[start, length] → new_str or nil
因此,$1[0, 1]
意味着“将从索引 0 处的字符返回的字符串切片到索引 0 + 1
。”
[0,1]
可以应用于任何字符串以查找从索引位置 0 开始的 1 个字符:
>> "Hello"[0,1]
=> "H"
只是为了好玩,0和1以外的东西:
>> "Hello World"[3,5]
=> "lo Wo"
从索引位置 3 开始,占用 5 个字符。
在你的情况下
"two"[0, 1]
您在索引 0 处取一个字符,即“t”。看起来它删除了最后两个字符;实际上它只生产了第一个。