首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含数组的Case语句?

包含数组的Case语句?
EN

Code Review用户
提问于 2017-07-05 06:57:24
回答 2查看 6.6K关注 0票数 0

在Ruby中使用数组实现案例检查的最佳实践是什么?

代码语言:javascript
复制
def partition(a)
  a_values = [1,4,5]
  b_values = [2,3,7]

  a.group_by do |n|
    case n
    when *a_values then :a
    when *b_values then :b
    else :c
    end
  end
end

partition((1..10))
#=> {:a=>[1, 4, 5], :b=>[2, 3, 7], :c=>[6, 8, 9, 10]}

该示例使用splat操作符*来检查给定的数组。我对演出的影响表示怀疑。你有什么建议?

EN

回答 2

Code Review用户

发布于 2017-07-05 15:24:42

我会考虑使用没有变量的case语句。类似于:

代码语言:javascript
复制
case
when a_values.include(n) then :a
when b_values.include(n) then :b
else :c
end

如果只有两个选项,则可以使用if进行同样的操作。

如果有很多数组,我会这样做:

代码语言:javascript
复制
VALUES = {
  a: [1,4,5],
  b: [2,3,7],
  ... 
} 
result,_  = VALUES.find( ->{:c} ){ |key,array| array.include(n) }

或者可能是倒置:

代码语言:javascript
复制
# If the values are contiguous:
VALUES = [nil, :a, :b, :a, :b, ... ]
# If the values are *not* contiguous:
VALUES = { 1 => :a, 2 => :b, 3 => :a, ... }
result = VALUES[n] || :c

如果您关心性能,我建议将性能与使用if的更直接的实现进行比较。与每次调用方法时定义数组相比,常数还可能执行得更好。

票数 2
EN

Code Review用户

发布于 2017-07-07 14:54:00

评论

总的来说,我没有看到任何错误的风格。除非您有非常大的数组,否则我不会太关心性能--您希望值“桶”或输入数组都是巨大的吗?如果是这样的话,你有理由担心,但要小心不要过早地优化。

我建议更改方法的名称。可枚举中已经有一个partition,它的工作方式有点像一个group_by,只不过它将数组划分成两个部分。使用这个方法的名称,它可以做一些不同的事情,这可能有点令人困惑。

替代实现

因此,这使用了的想法,并将其具体化:

代码语言:javascript
复制
def bucketize(arr)
  a = [1,4,5].map{|n| [n,:a]}.to_h
  b = [2,3,7].map{|n| [n,:b]}.to_h
  values = a.merge(b)

  arr.group_by { |n| values[n] || :c }
end

它预先计算基于哈希的查找表。我怀疑对于小型数组来说,这样的速度会更慢,对于大型数组,这样的速度会更快。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/167363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档