Ruby - Mảng

Mảng Ruby là các tập hợp được lập chỉ mục số nguyên, có thứ tự của bất kỳ đối tượng nào. Mỗi phần tử trong một mảng được liên kết với và được tham chiếu bởi một chỉ mục.

Lập chỉ mục mảng bắt đầu từ 0, như trong C hoặc Java. Chỉ số âm được giả định liên quan đến phần cuối của mảng --- nghĩa là, chỉ số -1 cho biết phần tử cuối cùng của mảng, -2 là phần tử tiếp theo sau phần tử cuối cùng trong mảng, v.v.

Mảng Ruby có thể chứa các đối tượng như String, Integer, Fixnum, Hash, Symbol, thậm chí là các đối tượng Array khác. Mảng Ruby không cứng nhắc như các mảng trong các ngôn ngữ khác. Mảng Ruby tự động phát triển trong khi thêm các phần tử vào chúng.

Tạo Mảng

Có nhiều cách để tạo hoặc khởi tạo một mảng. Một cách là với phương thức lớp mới -

names = Array.new

Bạn có thể đặt kích thước của một mảng tại thời điểm tạo mảng -

names = Array.new(20)

Mảng tên bây giờ có một kích thước hoặc chiều dài của 20 yếu tố. Bạn có thể trả về kích thước của một mảng bằng các phương thức kích thước hoặc chiều dài -

#!/usr/bin/ruby

names = Array.new(20)
puts names.size  # This returns 20
puts names.length # This also returns 20

Điều này sẽ tạo ra kết quả sau:

20
20

Bạn có thể gán giá trị cho từng phần tử trong mảng như sau:

#!/usr/bin/ruby

names = Array.new(4, "mac")
puts "#{names}"

Điều này sẽ tạo ra kết quả sau:

["mac", "mac", "mac", "mac"]

Bạn cũng có thể sử dụng một khối với mới, điền vào mỗi phần tử với những gì khối đó đánh giá -

#!/usr/bin/ruby

nums = Array.new(10) { |e| e = e * 2 }
puts "#{nums}"

Điều này sẽ tạo ra kết quả sau:

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Có một phương thức khác của Array, []. Nó hoạt động như thế này -

nums = Array.[](1, 2, 3, 4,5)

Thêm một hình thức tạo mảng như sau:

nums = Array[1, 2, 3, 4,5]

Các Kernel module có sẵn trong lõi Ruby có một phương pháp Array, mà chỉ chấp nhận một đối số duy nhất. Ở đây, phương thức lấy một phạm vi làm đối số để tạo một mảng các chữ số -

#!/usr/bin/ruby

digits = Array(0..9)
puts "#{digits}"

Điều này sẽ tạo ra kết quả sau:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Các phương thức tích hợp trong mảng

Chúng ta cần có một thể hiện của đối tượng Array để gọi một phương thức Array. Như chúng ta đã thấy, sau đây là cách tạo một thể hiện của đối tượng Array:

Array.[](...) [or] Array[...] [or] [...]

Thao tác này sẽ trả về một mảng mới được điền với các đối tượng đã cho. Bây giờ, bằng cách sử dụng đối tượng đã tạo, chúng ta có thể gọi bất kỳ phương thức cá thể nào có sẵn. Ví dụ -

#!/usr/bin/ruby

digits = Array(0..9)
num = digits.at(6)
puts "#{num}"

Điều này sẽ tạo ra kết quả sau:

6
Sr.No. Phương pháp & Mô tả
1

array & other_array

Trả về một mảng mới chứa các phần tử chung cho hai mảng, không có phần tử trùng lặp.

2

array * int [or] array * str

Trả về một mảng mới được tạo bằng cách nối các bản sao int của chính nó. Với một đối số Chuỗi, tương đương với self.join (str).

3

array + other_array

Trả về một mảng mới được tạo bằng cách nối hai mảng với nhau để tạo ra mảng thứ ba.

4

array - other_array

Trả về một mảng mới là bản sao của mảng ban đầu, xóa bất kỳ mục nào cũng xuất hiện trong other_array.

5

array <=> other_array

So sánh str với other_str, trả về -1 (nhỏ hơn), 0 (bằng) hoặc 1 (lớn hơn). Sự so sánh là không nhạy cảm.

6

array | other_array

Trả về một mảng mới bằng cách nối mảng với other_array, xóa các bản sao.

7

array << obj

Đẩy đối tượng đã cho vào cuối mảng. Biểu thức này trả về chính mảng, vì vậy một số phần nối có thể được xâu chuỗi với nhau.

số 8

array <=> other_array

Trả về một số nguyên (-1, 0 hoặc +1) nếu mảng này nhỏ hơn, bằng hoặc lớn hơn other_array.

9

array == other_array

Hai mảng bằng nhau nếu chúng chứa cùng số phần tử và nếu mỗi phần tử bằng (theo Đối tượng. ==) phần tử tương ứng trong mảng kia.

10

array[index] [or] array[start, length] [or]

array[range] [or] array.slice(index) [or]

array.slice(start, length) [or] array.slice(range)

Trả về phần tử tại chỉ mục hoặc trả về một mảng con bắt đầu từ đầu và tiếp tục cho các phần tử độ dài hoặc trả về một mảng con được chỉ định bởi dải ô . Các chỉ số âm đếm ngược từ cuối mảng (-1 là phần tử cuối cùng). Trả về nil nếu chỉ mục (hoặc chỉ mục bắt đầu) nằm ngoài phạm vi.

11

array[index] = obj [or]

array[start, length] = obj or an_array or nil [or]

array[range] = obj or an_array or nil

Đặt phần tử tại chỉ mục hoặc thay thế một mảng con bắt đầu từ đầu và tiếp tục cho các phần tử độ dài hoặc thay thế một mảng con được chỉ định bởi phạm vi . Nếu các chỉ số lớn hơn dung lượng hiện tại của mảng, mảng sẽ tự động phát triển. Các chỉ số âm sẽ đếm ngược từ cuối mảng. Chèn các phần tử nếu độ dài bằng 0. Nếu nil được sử dụng ở dạng thứ hai và thứ ba, hãy xóa các phần tử khỏi bản thân .

12

array.abbrev(pattern = nil)

Tính tập các chữ viết tắt rõ ràng cho các chuỗi trong tự . Nếu được thông qua một mẫu hoặc một chuỗi, chỉ các chuỗi khớp với mẫu hoặc bắt đầu bằng chuỗi mới được xem xét.

13

array.assoc(obj)

Tìm kiếm thông qua một mảng có các phần tử cũng là mảng so sánh obj với phần tử đầu tiên của mỗi mảng được chứa bằng cách sử dụng obj. ==. Trả về mảng được chứa đầu tiên phù hợp hoặc nil nếu không tìm thấy kết quả nào.

14

array.at(index)

Trả về phần tử tại chỉ mục. Chỉ số âm được tính từ cuối bản thân. Trả về nil nếu chỉ mục nằm ngoài phạm vi.

15

array.clear

Loại bỏ tất cả các phần tử khỏi mảng.

16

array.collect { |item| block } [or]

array.map { |item| block }

Gọi khối một lần cho mỗi phần tử của bản thân . Tạo một mảng mới chứa các giá trị được khối trả về.

17

array.collect! { |item| block } [or]

array.map! { |item| block }

Gọi khối một lần cho mỗi phần tử của bản thân , thay thế phần tử bằng giá trị được trả về bởi khối .

18

array.compact

Trả về bản sao của chính nó với tất cả các phần tử nil đã bị xóa.

19

array.compact!

Loại bỏ các phần tử nil khỏi mảng. Trả về nil nếu không có thay đổi nào được thực hiện.

20

array.concat(other_array)

Nối các phần tử trong other_array vào chính nó .

21

array.delete(obj) [or]

array.delete(obj) { block }

Xóa các mục từ tự bằng với obj . Nếu mục không được tìm thấy, trả về nil . Nếu khối mã tùy chọn được đưa ra, trả về kết quả của khối nếu không tìm thấy mục.

22

array.delete_at(index)

Xóa phần tử tại chỉ mục được chỉ định , trả về phần tử đó hoặc nil nếu chỉ mục nằm ngoài phạm vi.

23

array.delete_if { |item| block }

Xóa mọi phần tử của bản thânkhối đánh giá là true.

24

array.each { |item| block }

Cuộc gọi chặn một lần cho mỗi yếu tố trong tự , đi qua yếu tố đó như một tham số.

25

array.each_index { |index| block }

Tương tự như Mảng # mỗi, nhưng chuyển chỉ mục của phần tử thay vì chính phần tử đó.

26

array.empty?

Trả về true nếu mảng tự không chứa phần tử nào.

27

array.eql?(other)

Trả về true nếu mảngmảng khác là cùng một đối tượng hoặc cả hai mảng có cùng nội dung.

28

array.fetch(index) [or]

array.fetch(index, default) [or]

array.fetch(index) { |index| block }

Cố gắng trả về phần tử ở vị trí chỉ mục . Nếu chỉ mục nằm bên ngoài mảng, biểu mẫu đầu tiên ném một ngoại lệ IndexError , biểu mẫu thứ hai trả về mặc định và biểu mẫu thứ ba trả về giá trị của khối gọi , chuyển vào chỉ mục . Các giá trị âm của số chỉ mục từ cuối mảng.

29

array.fill(obj) [or]

array.fill(obj, start [, length]) [or]

array.fill(obj, range) [or]

array.fill { |index| block } [or]

array.fill(start [, length] ) { |index| block } [or]

array.fill(range) { |index| block }

Ba hình thức đầu tiên thiết lập các yếu tố lựa chọn của bản thân để obj . Bắt đầu bằng nil tương đương với 0. Độ dài nil tương đương với độ dài của bản thân . Ba biểu mẫu cuối cùng điền vào mảng với giá trị của khối. Các khối được thông qua với chỉ số tuyệt đối của từng yếu tố để được lấp đầy.

30

array.first [or]

array.first(n)

Trả về phần tử đầu tiên hoặc n phần tử đầu tiên của mảng. Nếu mảng trống, biểu mẫu đầu tiên trả về nil và biểu mẫu thứ hai trả về một mảng trống.

31

array.flatten

Trả về một mảng mới là mảng phẳng một chiều của mảng này (một cách đệ quy).

32

array.flatten!

Làm phẳng mảng tại chỗ. Trả về số không nếu không có sửa đổi nào được thực hiện. (mảng không chứa mảng con.)

33

array.frozen?

Trả về true nếu mảng bị đóng băng (hoặc tạm thời bị đóng băng trong khi được sắp xếp).

34

array.hash

Tính toán mã băm cho mảng. Hai mảng có cùng nội dung sẽ có cùng mã băm.

35

array.include?(obj)

Trả về true nếu obj có trong bản thân , ngược lại là false.

36

array.index(obj)

Trả về chỉ mục của đối tượng đầu tiên tự là == tới obj. Trả về nil nếu không tìm thấy kết quả phù hợp nào.

37

array.indexes(i1, i2, ... iN) [or]

array.indices(i1, i2, ... iN)

Phương thức này không được dùng trong phiên bản Ruby mới nhất, vì vậy hãy sử dụng Array # giá_trị_at.

38

array.indices(i1, i2, ... iN) [or]

array.indexes(i1, i2, ... iN)

Phương thức này không được dùng trong phiên bản Ruby mới nhất, vì vậy hãy sử dụng Array # giá_trị_at.

39

array.insert(index, obj...)

Chèn các giá trị đã cho trước phần tử có chỉ số đã cho (có thể là số âm).

40

array.inspect

Tạo một phiên bản mảng có thể in được.

41

array.join(sep = $,)

Trả về một chuỗi được tạo bằng cách chuyển đổi từng phần tử của mảng thành một chuỗi, được phân tách bằng sep .

42

array.last [or] array.last(n)

Trả về (các) phần tử cuối cùng của bản thân . Nếu mảng trống , biểu mẫu đầu tiên trả về nil .

43

array.length

Trả về số phần tử trong chính nó . Có thể bằng không.

44

array.map { |item| block } [or]

array.collect { |item| block }

Gọi khối một lần cho mỗi phần tử của bản thân . Tạo một mảng mới chứa các giá trị được khối trả về.

45

array.map! { |item| block } [or]

array.collect! { |item| block }

Gọi khối một lần cho mỗi phần tử của mảng , thay thế phần tử bằng giá trị được trả về bởi khối.

46

array.nitems

Returns số phần tử phi nil trong tự . Có thể bằng không.

47

array.pack(aTemplateString)

Đóng gói nội dung của mảng thành một chuỗi nhị phân theo các chỉ thị trong Chuỗi mẫu. Các chỉ thị A, a và Z có thể được theo sau bởi một số đếm, cho biết độ rộng của trường kết quả. Các chỉ thị còn lại cũng có thể đếm, cho biết số phần tử mảng cần chuyển đổi. Nếu số đếm là dấu hoa thị (*), tất cả các phần tử mảng còn lại sẽ được chuyển đổi. Bất kỳ chỉ thị nào vẫn có thể được theo sau bởi dấu gạch dưới (_) để sử dụng kích thước gốc của nền tảng cơ bản cho loại được chỉ định; nếu không, họ sử dụng kích thước độc lập nền tảng. Khoảng trắng bị bỏ qua trong chuỗi mẫu.

48

array.pop

Xóa phần tử cuối cùng khỏi mảng và trả về nó, hoặc nil nếu mảng trống.

49

array.push(obj, ...)

Đẩy (nối) đối tượng đã cho vào cuối mảng này. Biểu thức này trả về chính mảng, vì vậy một số phần nối có thể được xâu chuỗi với nhau.

50

array.rassoc(key)

Tìm kiếm thông qua mảng có các phần tử cũng là mảng. So sánh khóa với phần tử thứ hai của mỗi mảng được chứa bằng cách sử dụng dấu ==. Trả về mảng chứa đầu tiên phù hợp.

51

array.reject { |item| block }

Trả về một mảng mới có chứa các mục mảng mà khối này là không đúng .

52

array.reject! { |item| block }

Xóa các phần tử khỏi mảng mà khối đó đánh giá là true , nhưng trả về nil nếu không có thay đổi nào được thực hiện. Tương đương với Mảng # xóa_nếu.

53

array.replace(other_array)

Thay thế nội dung của mảng bằng nội dung của other_array , cắt bớt hoặc mở rộng nếu cần.

54

array.reverse

Trả về một mảng mới chứa các phần tử của mảng theo thứ tự ngược lại.

55

array.reverse!

Đảo ngược mảng tại chỗ.

56

array.reverse_each {|item| block }

Tương tự như Mảng # mỗi, nhưng duyệt mảng theo thứ tự ngược lại.

57

array.rindex(obj)

Trả về chỉ mục của đối tượng cuối cùng trong mảng == tới obj. Trả về nil nếu không tìm thấy kết quả phù hợp nào.

58

array.select {|item| block }

Gọi khối chuyển các phần tử liên tiếp từ mảng, trả về một mảng có chứa các phần tử mà khối trả về giá trị đúng .

59

array.shift

Trả về phần tử đầu tiên của bản thân và xóa nó (chuyển tất cả các phần tử khác xuống từng phần tử). Trả về nil nếu mảng trống.

60

array.size

Trả về độ dài của mảng (số phần tử). Bí danh cho độ dài.

61

array.slice(index) [or] array.slice(start, length) [or]

array.slice(range) [or] array[index] [or]

array[start, length] [or] array[range]

Trả về phần tử tại chỉ mục hoặc trả về một mảng con bắt đầu từ đầu và tiếp tục cho các phần tử độ dài hoặc trả về một mảng con được chỉ định bởi dải ô . Các chỉ số âm đếm ngược từ cuối mảng (-1 là phần tử cuối cùng). Trả về nil nếu chỉ mục (hoặc chỉ mục bắt đầu) nằm ngoài phạm vi.

62

array.slice!(index) [or] array.slice!(start, length) [or]

array.slice!(range)

Xóa (các) phần tử được cung cấp bởi một chỉ mục (tùy chọn với độ dài) hoặc theo một phạm vi . Trả về đối tượng, mảng con hoặc nil đã xóa nếu chỉ mục nằm ngoài phạm vi.

63

array.sort [or] array.sort { | a,b | block }

Trả về một mảng mới được tạo bằng cách tự sắp xếp.

64

array.sort! [or] array.sort! { | a,b | block }

Tự phân loại.

65

array.to_a

Tự trả lại . Nếu được gọi trên một lớp con của Mảng , chuyển đổi bộ nhận thành một đối tượng Mảng.

66

array.to_ary

Tự trả lại.

67

array.to_s

Tự trả về. Tham gia.

68

array.transpose

Giả sử rằng bản thân là một mảng của mảng và hoán vị các hàng và cột.

69

array.uniq

Trả về một mảng mới bằng cách xóa các giá trị trùng lặp trong mảng .

70

array.uniq!

Loại bỏ các phần tử trùng lặp khỏi bản thân . Trả về nil nếu không có thay đổi nào được thực hiện (nghĩa là không tìm thấy bản sao).

71

array.unshift(obj, ...)

Thêm các đối tượng vào phía trước của mảng, các phần tử khác lên một.

72

array.values_at(selector,...)

Trả về một mảng chứa các phần tử tương ứng với bộ chọn đã cho (một hoặc nhiều). Các bộ chọn có thể là chỉ số hoặc phạm vi số nguyên.

73

array.zip(arg, ...) [or]

array.zip(arg, ...){ | arr | block }

Chuyển đổi bất kỳ đối số nào thành mảng, sau đó hợp nhất các phần tử của mảng với các phần tử tương ứng từ mỗi đối số.

Chỉ thị gói mảng

Sr.No. Chỉ thị & Mô tả
1

@

Di chuyển đến vị trí tuyệt đối.

2

A

Chuỗi ASCII (đệm khoảng trắng, số lượng là chiều rộng).

3

a

Chuỗi ASCII (đệm rỗng, số lượng là chiều rộng).

4

B

chuỗi (thứ tự bit giảm dần).

5

b

Chuỗi bit (thứ tự bit tăng dần).

6

C

Char không dấu.

7

c

Char.

số 8

D, d

Độ chính xác kép float, định dạng gốc.

9

E

Phao chính xác kép, thứ tự byte cuối nhỏ.

10

e

Float chính xác đơn, thứ tự byte cuối nhỏ.

11

F, f

Float chính xác đơn, định dạng gốc.

12

G

Thứ tự byte float, mạng (big-endian) chính xác kép.

13

g

Thứ tự byte float, mạng (big-endian) chính xác đơn.

14

H

Chuỗi hex (nibble cao trước).

15

h

Chuỗi hex (nibble thấp đầu tiên).

16

I

Số nguyên không dấu.

17

i

Số nguyên.

18

L

Dài không dấu.

19

l

Dài.

20

M

Có thể in được trích dẫn, mã hóa MIME (xem RFC 2045).

21

m

Chuỗi được mã hóa Base64.

22

N

Thứ tự byte dài, mạng (big-endian).

23

n

Thứ tự byte mạng (big-endian) ngắn.

24

P

Con trỏ đến một cấu trúc (chuỗi có độ dài cố định).

25

p

Con trỏ đến một chuỗi được kết thúc bằng null.

26

Q, q

Số 64-bit.

27

S

Ngắn không dấu.

28

s

Ngắn.

29

U

UTF-8.

30

u

Chuỗi được mã hóa UU.

31

V

Thứ tự byte dài, ít cuối.

32

v

Thứ tự byte ngắn, ít endian.

33

w

Số nguyên được nén BER \ fnm.

34

X

Sao lưu một byte.

35

x

Byte rỗng.

36

Z

Tương tự như a, ngoại trừ giá trị null được thêm vào với *.

Thí dụ

Hãy thử ví dụ sau để đóng gói nhiều dữ liệu khác nhau.

a = [ "a", "b", "c" ]
n = [ 65, 66, 67 ]
puts a.pack("A3A3A3")   #=> "a  b  c  "
puts a.pack("a3a3a3")   #=> "a\000\000b\000\000c\000\000"
puts n.pack("ccc")      #=> "ABC"

Điều này sẽ tạo ra kết quả sau:

a  b  c
abc
ABC