Cho một mảng, một phần tử đơn hoặc nil, thu được một mảng - hai mảng sau tương ứng là một mảng phần tử đơn và một mảng trống.
Tôi nhầm tưởng rằng Ruby sẽ hoạt động theo cách này:
[1,2,3].to_a #= [1,2,3] # Already an array, so no change
1.to_a #= [1] # Creates an array and adds element
nil.to_a #= [] # Creates empty array
Nhưng những gì bạn thực sự nhận được là:
[1,2,3].to_a #= [1,2,3] # Hooray
1.to_a #= NoMethodError # Do not want
nil.to_a #= [] # Hooray
Vì vậy, để giải quyết vấn đề này, tôi cần phải sử dụng một phương thức khác hoặc tôi có thể lập trình meta bằng cách sửa đổi phương thức to_a của tất cả các lớp tôi định sử dụng - đây không phải là một lựa chọn cho tôi.
Vì vậy, một phương pháp nó là:
result = nums.class == "Array".constantize ? nums : (nums.class == "NilClass".constantize ? [] : ([]<<nums))
Vấn đề là nó hơi lộn xộn. Có một cách thanh lịch để làm điều này? (Tôi sẽ ngạc nhiên nếu đây là cách Ruby-ish để giải quyết vấn đề này)
Ứng dụng này có những gì? Tại sao thậm chí chuyển đổi thành một mảng?
Trong ActiveRecord của Rails, việc gọi say, user.posts
sẽ trả về một mảng các bài đăng, một bài đăng hoặc nil. Khi viết các phương thức hoạt động dựa trên kết quả của điều này, dễ dàng nhất là giả định rằng phương thức sẽ nhận một mảng, mảng có thể có 0, một hoặc nhiều phần tử. Phương pháp ví dụ:
current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}
==
thay vì =
, phải không?
[1,2,3].to_a
không không quay trở lại [[1,2,3]]
! Nó trở lại [1,2,3]
.
user.posts
không bao giờ nên trả lại một bài. Ít nhất, tôi chưa bao giờ nhìn thấy nó.