给定一个数组、单个元素或nil,获取一个数组 - 后两者分别为一个含有单个元素和一个空数组。
我曾错误地认为Ruby会按照这种方式工作:
[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))
问题在于它有些混乱。是否有一种优雅的方法可以解决这个问题?(如果这是解决此问题的Ruby方式,我会感到惊讶)
这有什么应用?为什么要转换为一个数组?
在 Rails 的 ActiveRecord 中,调用例如 user.posts
将返回一个帖子数组、单个帖子或 nil。在编写对其结果进行操作的方法时,最容易假设该方法将使用一个数组,该数组可能有零个、一个或多个元素。示例方法:
current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}
user.posts
永远不应该返回单独的帖子,至少我从未见过这种情况。 - Sergio Tulentsev==
而不是=
,对吧? - Patrick Oscity[1,2,3].to_a
不会 返回[[1,2,3]]
!它返回的是[1,2,3]
。 - Patrick Oscity