【问题标题】:Is there a ruby idiom for returning the first array element, if only one exists?如果只有一个元素存在,是否有返回第一个数组元素的 ruby​​ 习惯用法?
【发布时间】:2013-11-21 00:04:57
【问题描述】:

如果数组只包含一个值,我想返回数组的第一个元素。

目前,我使用:

vals.one? ? vals.first : vals.presence

因此:

vals = []; vals.one? ? vals.first : vals.presence
# => nil

vals = [2]; vals.one? ? vals.first : vals.presence
# => 2

vals = [2, 'Z']; vals.one? ? vals.first : vals.presence
# => [2, "Z"]

有没有内置的东西可以做到这一点,还是有更好的设计考虑?


我的用例是特定的,涉及到知道从方法中期待什么的演示者(这将实现上述代码)。如果这些演示者将所有返回作为数组处理,那么在大多数情况下(~90%)他们将遍历大小为 10 的数组。

【问题讨论】:

  • 我的习语是:不要改变数据形状。这违反了该规则,因为 vals 可以是单个(非集合)值或值序列(集合) - 它们是不同形状的结果。就代码而言,我还没有看到所需任务的“更惯用”。
  • 为什么不只是vals.first unless vals.first.nil?
  • 请注意,[false].one?[nil].one? 都返回 false。
  • 正如其他一些人所暗示的那样,这是一个非常糟糕的主意 - 我是根据经验说话的。如果你实现了这一点,那么 每个 调用站点需要检查返回类型,然后在它接收到一个标量和一个数组时采取不同的行动。只要让方法“自然”返回一个单元素数组(如果需要),并让调用站点知道他们将总是接收一个数组。
  • 是的,这正是他们应该做的,期待一个数组并处理数组中的所有元素。如果只有一个,他们只需要做一次。

标签: ruby-on-rails ruby arrays


【解决方案1】:

您似乎想处理 val 数组未定义的情况,所以...

val.size > 1 ? val : val[0] if defined?(val)

但正如已经指出的那样,最好提供一致的参数(始终为数组),因此以下将提供 val 数组或未定义的空数组

defined?(val) ? val : []

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 2011-01-29
    • 2017-03-13
    • 2016-10-21
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多