开发者社区> 问答> 正文

Ruby-将变量优雅地转换为数组(如果还没有数组的话)

给定一个数组,则单个元素或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

展开
收起
保持可爱mmm 2020-02-08 10:16:40 429 0
1 条回答
写回答
取消 提交回答
  • [*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}]

    2020-02-08 10:16:55
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载