2016-11-28 18 views
5

Giả sử chúng ta có một chuỗi str. Nếu str chỉ chứa một ký tự, ví dụ: str = "1", thì str[-1..1] trả lại 1.
Nhưng nếu size (length) của str dài hơn một, chẳng hạn như str = "anything else", thì str[-1..1] trả về "" (chuỗi trống).Tại sao Ruby trở lại với `str [-1..1]` nó làm gì?

Tại sao Ruby giải thích chuỗi cắt như thế này?

+0

phiên bản ruby ​​của tôi là ruby ​​2.3.0p0 (2015-12-25 bản sửa đổi 53290) [x86_64-darwin15] –

+2

Nếu bạn muốn xây dựng, vui lòng chỉnh sửa câu hỏi thay vì sử dụng nhận xét. "Ruby v2.3" là đủ. –

+0

Như bạn nói, '" a "[- 1..1] # =>" a "' và '" abf "[- 1..1] =>" "', nhưng ngoài ra, '" ab "[ -1..1] => "b" '. –

Trả lời

6

Hành vi này chỉ là phạm vi hoạt động của các ký tự.

Bắt đầu phạm vi là -1, là ký tự cuối cùng trong chuỗi. Phạm vi kết thúc là 1, là vị trí thứ hai từ đầu.

Vì vậy, đối với một chuỗi ký tự, số này tương đương với 0..1, là ký tự đơn.

Đối với chuỗi hai ký tự, đây là 1..1, là ký tự thứ hai.

Đối với chuỗi ba ký tự, đây là 2..1, là một chuỗi rỗng. Và như vậy cho chuỗi dài hơn.

+0

Rất tốt. Nếu bất cứ ai đang tự hỏi về một chuỗi ký tự, '" a "[0..999] # =>" a "'. –

3

Để nhận chuỗi con không tầm thường, vị trí bắt đầu phải thể hiện vị trí sớm hơn vị trí kết thúc.

Đối với chuỗi có độ dài một lần, chỉ mục -1 giống với chỉ mục 0, nhỏ hơn 1. Do đó, [-1..1] cho chuỗi con không tầm thường.

Đối với chuỗi dài hơn một ký tự, chỉ mục -1 lớn hơn chỉ mục 0. Do đó, [-1..1] không thể cung cấp chuỗi con không tầm thường và theo mặc định, chuỗi này trả về một chuỗi trống.

1

Viết xuống các chỉ số thường giúp tôi:

#  0 1 2 3 4 5 6 7 8 9 10 11 12 
str = 'a' 'n' 'y' 't' 'h' 'i' 'n' 'g' ' ' 'e' 'l' 's' 'e' #=> "anything else" 
#  -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 

Bạn có thể tham khảo cho mỗi nhân vật bằng một trong hai chỉ số tích cực hay tiêu cực của nó. Ví dụ, bạn có thể sử dụng một trong hai 3 hoặc -10 để chỉ "t":

str[3] #=> "t" 
str[-10] #=> "t" 

và một trong hai 7 hoặc -6 để chỉ "g":

str[7] #=> "g" 
str[-6] #=> "g" 

Tương tự như vậy, bạn có thể sử dụng mỗi một trong các chỉ số để lấy "thing" qua một dải:

str[3..7] #=> "thing" 
str[3..-6] #=> "thing" 
str[-10..7] #=> "thing" 
str[-10..-6] #=> "thing" 

Tuy nhiên,sẽ trả về một chuỗi rỗng, vì -1 là ký tự cuối cùng và 1 là ký tự thứ hai. Nó sẽ tương đương với str[12..1].

Nhưng nếu chuỗi bao gồm một nhân vật duy nhất, phạm vi đó có hiệu lực:

#  0 
str = '1' 
#  -1 

str[-1..1] #=> "1" 

Trong thực tế, 1 đề cập đến một chỉ số sau ký tự đầu tiên, vì vậy 0 sẽ đủ:

str[-1..0] #=> "1" 
Các vấn đề liên quan