배열, 단일 요소 또는 nil이 주어지면 배열을 얻습니다. 마지막 두 개는 각각 단일 요소 배열과 빈 배열입니다.
루비가 이런 식으로 작동 할 것이라고 잘못 생각했습니다.
[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
그러나 실제로 얻는 것은 다음과 같습니다.
[1,2,3].to_a #= [1,2,3] # Hooray
1.to_a #= NoMethodError # Do not want
nil.to_a #= [] # Hooray
따라서이 문제를 해결하려면 다른 방법을 사용하거나 사용하려는 모든 클래스의 to_a 메서드를 수정하여 메타 프로그램을 수행 할 수 있습니다.
그래서 방법은 다음과 같습니다.
result = nums.class == "Array".constantize ? nums : (nums.class == "NilClass".constantize ? [] : ([]<<nums))
문제는 그것이 약간 엉망이라는 것입니다. 이 작업을 수행하는 우아한 방법이 있습니까? (이 문제를 해결하는 루비 같은 방법이라면 놀라 울 것입니다)
어떤 응용 프로그램이 있습니까? 왜 배열로 변환합니까?
Rails의 ActiveRecord에서 say를 호출 user.posts
하면 게시물 배열, 단일 게시물 또는 nil이 반환됩니다. 이 결과에 대해 작동하는 메소드를 작성할 때 메소드가 0, 1 또는 많은 요소를 가질 수있는 배열을 취할 것이라고 가정하는 것이 가장 쉽습니다. 방법 예 :
current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}
==
대신 의미한다고 생각합니다 =
.
[1,2,3].to_a
하지 않습니다[[1,2,3]]
! 반환합니다 [1,2,3]
.
user.posts
단일 게시물을 반환해서는 안됩니다. 적어도 나는 그것을 본 적이 없습니다.