如何确保方法返回一个数组,即使 Ruby 中只有一个元素

Posted

技术标签:

【中文标题】如何确保方法返回一个数组,即使 Ruby 中只有一个元素【英文标题】:How to make sure a method returns an array, even when there is only one element in Ruby 【发布时间】:2011-01-29 12:33:21 【问题描述】:

我有一个 Ruby 方法,它搜索哈希数组并返回该数组的子集。

  def last_actions(type = 'all')
    actions = @actions

    if type == 'run'
      actions = actions.select |a| a['type'] == "run" 
    end

    return actions

  end

这可行,除非只有一个动作要返回,在这种情况下,我认为它不会返回一个包含一个元素的数组,而只是返回元素本身。 这在以后会成为问题。

在这种情况下,确保它返回一个包含 1 个元素的数组的好方法是什么?

谢谢。

【问题讨论】:

也许你可以举个例子和产生的错误? 【参考方案1】:

select 总是返回一个数组(除非你 break 在块内,但你没有这样做)。所以无论你的代码出了什么问题,这都不是原因。

当然,如果@actions 不包含数组(或其他类型的 Enumerable),则调用 select 将导致异常,并且该方法根本不会返回任何内容。这种情况下的解决方案是确保@actions 始终返回一个数组。如何做到这一点取决于您在哪里/如何设置@actions

【讨论】:

你说的很对。后来我用 .last 处理返回值,这就是罪魁祸首。谢谢。【参考方案2】:

你的观察很奇怪,但是你可以试试这个:

def last_actions(type = 'all')
  actions = @actions.dup || []
  actions.delete_if |a| a['type'] != "run"  if type == 'run'
  actions
end

【讨论】:

【参考方案3】:

请注意,有一个干净的 ruby​​ 习惯用法可以确保将单个对象和数组视为数组:

a = [1,2,3]
b = 4

[*a]
=> [1, 2, 3]

[*b]
=> [4]

【讨论】:

不能与哈希一起正常工作:irb(main):001:0> a = id: 1 => :id=>1 irb(main):002:0> [*a] => [[:id, 1]] irb(main):003:0> [a] => [:id=>1] irb(main):004:0> 将代码发布到 pastebin.com 以提高可读性:pastebin.com/aWNebnGj。所以最好使用普通的旧a.kind_of?(Array) ? a : [a]【参考方案4】:

你也可以这样做:

a = [1,2,3]
b = 4

Array(a)
=> [1, 2, 3]

Array(b)
=> [4]

【讨论】:

[*a] 技巧相同。不适用于哈希:pastebin.com/aWNebnGj。所以最好使用普通的旧a.kind_of?(Array) ? a : [a]

以上是关于如何确保方法返回一个数组,即使 Ruby 中只有一个元素的主要内容,如果未能解决你的问题,请参考以下文章

Ruby - 失败语句/保护条件返回 nil

Ruby - 确保只有一个类对象

为啥在ruby中,[].all?i i==1 的结果为true?

即使数组中只有一个元素,如何强制jettison写入数组?

如何检查一个值是不是存在于Ruby中的数组中

如何从 Ruby 中的数组返回属性值?