给定一个数组,则单个元素或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中,调用say user.posts会返回一组帖子,单个帖子或nil。当编写根据此结果工作的方法时,最容易假设该方法将采用一个数组,该数组可能具有零个,一个或多个元素。示例方法:
current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}
问题来源于stack overflow
[*foo]或Array(foo)在大多数情况下都可以使用,但是对于某些情况(例如哈希),它会搞砸了。
Array([1, 2, 3]) # => [1, 2, 3] Array(1) # => [1] Array(nil) # => [] Array({a: 1, b: 2}) # => [[:a, 1], [:b, 2]]
[*[1, 2, 3]] # => [1, 2, 3] [*1] # => [1] [*nil] # => [] [*{a: 1, b: 2}] # => [[:a, 1], [:b, 2]] 我认为即使是哈希也可以使用的唯一方法是定义一个方法。
class Object; def ensure_array; [self] end end class Array; def ensure_array; to_a end end class NilClass; def ensure_array; to_a end end
[1, 2, 3].ensure_array # => [1, 2, 3] 1.ensure_array # => [1] nil.ensure_array # => [] {a: 1, b: 2}.ensure_array # => [{a: 1, b: 2}]
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。