Làm thế nào để khởi tạo một mảng trong một bước bằng Ruby?


105

Tôi khởi tạo một mảng theo cách này:

array = Array.new
array << '1' << '2' << '3'

Có thể làm điều đó trong một bước không? Nếu vậy, làm thế nào?


20
+1 chỉ cho đẩy lặp lại một dòng mới lạ. :)
Phrogz

1
@Phrogz ngắn hơn một chút:; array = Array.new << 1 << 2 << 3 )
Alexander Suraphel

@AlexanderSuraphel Điều đó tạo ra một mảng Fixnums thay vì một mảng chuỗi.
Phrogz

1
@Phrogz Tôi chỉ muốn đề cập rằng nó thậm chí có thể ngắn hơn. Bạn chỉ cần thay đổi 1thành '1'.
Alexander Suraphel

Câu trả lời:


192

Bạn có thể sử dụng một ký tự mảng:

array = [ '1', '2', '3' ]

Bạn cũng có thể sử dụng một phạm vi:

array = ('1'..'3').to_a  # parentheses are required
# or
array = *('1'..'3')      # parentheses not required, but included for clarity

Đối với mảng các chuỗi được phân tách bằng khoảng trắng, bạn có thể sử dụng cú pháp Chuỗi phần trăm :

array = %w[ 1 2 3 ]

Bạn cũng có thể chuyển một khối Array.newđể xác định giá trị cho mỗi mục nhập sẽ là gì:

array = Array.new(3) { |i| (i+1).to_s }

Cuối cùng, mặc dù nó không tạo ra mảng ba chuỗi giống như các câu trả lời khác ở trên, cũng lưu ý rằng bạn có thể sử dụng kiểu liệt kê trong Ruby 1.8.7+ để tạo mảng; ví dụ:

array = 1.step(17,3).to_a
#=> [1, 4, 7, 10, 13, 16]

4
Thêm một cho câu trả lời chi tiết, mặc dù tôi thích biểu tượng hơn to_a( [*'1'..'3']).
Michael Kohl

@MichaelKohl Tôi đồng ý; Tôi có ấn tượng (nhầm lẫn) rằng bạn không thể phân tích phạm vi trong 1.8.6. Tôi sẽ thêm điều đó, cảm ơn! Lưu ý rằng bạn không cần phải phân tách trong một ký tự mảng (trừ khi bạn đang kết hợp cùng với biểu tượng).
Phrogz

Tôi biết, chỉ là tôi chủ yếu sử dụng biểu tượng cho mục đích đó (đó là kết hợp) và tôi cũng thích nó thể hiện những gì bạn kết thúc với.
Michael Kohl

2
Ngoài ra, phương thức lớp Array :: [] có thể được sử dụng: Array[ "1","2","3"] #=> ["1","2","3"](Tôi không nghĩ phương thức này có liên quan gì đến phương thức khởi tạo của mảng). Bạn cũng có thể sử dụng Kernel # Array cấp cao nhất (tên phương thức trông giống như tên lớp)Array(1..5) #=> [1,2,3,4,5]
b1_

* làm gì? nơi tôi có thể tìm tài liệu cho điều đó?
Arnold Roa

22

Lót:

array = [] << 1 << 2 << 3   #this is for fixnums.

hoặc là

 a = %w| 1 2 3 4 5 |

hoặc là

 a = [*'1'..'3']

hoặc là

 a = Array.new(3, '1')

hoặc là

 a = Array[*'1'..'3']

8
Tôi đã không bỏ phiếu cho nó, nhưng tôi đoán vì điều này gọi ra ba phương thức và tăng dần mảng, trái ngược với [1,2,3]nó thực hiện một lần khởi tạo duy nhất. Ngoài ra, của bạn là nhiều ký tự hơn. Ngoài ra, bạn đã tạo một mảng Fixnums trong khi OP hỏi về một mảng chuỗi.
Phrogz

8

Cùng với các câu trả lời trên, bạn cũng có thể làm được điều này

    =>  [*'1'.."5"]   #remember *
    => ["1", "2", "3", "4", "5"]

1
Trong 1,9 bạn cũng có thể làm theo cách này: >> [*?1..?5] #=> ["1", "2", "3", "4", "5"].
Michael Kohl

7

Để chứng minh Có Hơn Một Sáu Cách Để Làm Điều Đó:

plus_1 = 1.method(:+)
Array.new(3, &plus_1) # => [1, 2, 3]

Nếu 1.method (: +) không thể thực hiện được, bạn cũng có thể làm

plus_1 = Proc.new {|n| n + 1}
Array.new(3, &plus_1) # => [1, 2, 3]

Chắc chắn, nó quá mức cần thiết trong trường hợp này, nhưng nếu plus_1là một biểu thức thực sự dài, bạn có thể muốn đặt nó trên một dòng riêng biệt với việc tạo mảng.


3

Bạn có thể làm

array = ['1', '2', '3']

Như những người khác đã lưu ý, bạn cũng có thể khởi tạo một mảng với ký hiệu% w như sau:

array = %w(1 2 3)

hoặc là

array = %w[1 2 3]

Xin lưu ý rằng trong cả hai trường hợp, mỗi phần tử là một chuỗi, thay vì một số nguyên. Vì vậy, nếu bạn muốn một mảng có các phần tử là số nguyên, bạn không nên bao bọc mỗi phần tử bằng dấu nháy đơn:

array_of_integers = [1, 2, 3]

Ngoài ra, bạn không cần phải đặt dấu phẩy giữa các phần tử (điều này cần thiết khi tạo một mảng không có ký hiệu% w này). Nếu bạn làm điều này (điều mà tôi thường làm do nhầm lẫn), như trong:

wrong_array = %w(1, 2, 3)

các phần tử của nó sẽ là ba chuỗi ---- "1,", "2", "3". Vì vậy, nếu bạn làm:

puts wrong_array

đầu ra sẽ là:

1,
2,
3
=>nil

đó không phải là những gì chúng tôi muốn ở đây.

Hy vọng điều này sẽ giúp làm sáng tỏ quan điểm!


2

Để tạo một mảng như vậy, bạn có thể làm:

array = ['1', '2', '3']

2

Nếu bạn có một Mảng chuỗi, bạn cũng có thể khởi tạo nó như sau:

array = %w{1 2 3}

chỉ cần tách từng phần tử bằng bất kỳ khoảng trắng nào


1

Bạn có thể khởi tạo một mảng trong một bước bằng cách viết các phần tử []như sau:

array = ['1', '2', '3']

0

Bạn có thể đơn giản làm điều này với %wký hiệu trong mảng ruby.

array = %w(1 2 3)

Nó sẽ thêm các giá trị mảng 1,2,3 vào mảng và in ra đầu ra dưới dạng ["1", "2", "3"]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.