【问题标题】:How to simply write multiple comparisons using || with Ruby on Rails如何使用 || 简单地编写多重比较使用 Ruby on Rails
【发布时间】:2020-12-09 13:05:25
【问题描述】:

我想这样写条件,但是太长了。 我怎样才能使它更简单?

if A
  ~~~
elsif B == b || B == c || B == d || B == e   <-- This part is too long.
  ~~~
else
  ~~~
end 

我以为可以写成下面这样,但是当我在rails控制台上尝试时,它给了我一个错误。

elsif B == (b || c || d || e)

【问题讨论】:

  • “可以写成下面这样”是什么意思?当你尝试它时发生了什么?
  • 取决于对象是什么。为什么不做elsif [b, c, d, e].include? B 这也取决于你所说的“让更简单”是什么意思?可能是在编译级别上编写 case 语句更好,等等。
  • 另一种方式:...elsif; case(B); when b,c,d,e; ~~~~~; end; else; ~~~~; end;

标签: ruby-on-rails ruby conditional-statements


【解决方案1】:
if B == b || B == c || B == d || B == e

可以写成

if [b, c, d, e].include?(B)

【讨论】:

  • 这正是我想要的!非常感谢!
【解决方案2】:

[编辑](感谢 Sergio Tulentsev 的评论)这仅与更长的数组有关,超过大约 10 个元素,而不是 OP 描述的确切情况。我为其他可能有更长的数组或比较列表的用户提供了这个答案。 [/编辑]

如果速度也是一个问题:使用Set,与Array相比,include? 更快:

# at the top, load this standard library (comes with Ruby):
require 'set'
# ...
if [b, c, d, e].to_set.include?(B)

另请参阅:

Array.include?比较慢。对于查找,请使用集合而不是哈希:https://stackoverflow.com/a/411164/967621

使用基准比较数组、集合和哈希的速度:Advantages of Set in ruby

【讨论】:

  • "Array.include? 相对较慢" - 不,不是真的。在小型数组(
  • @SergioTulentsev 感谢您的建议,已编辑。
  • 这是我使用的基准,顺便说一句:gist.github.com/stulentsev/bdfb5c22b641b9dac6e30561dc209e51
  • 当然Set#include?Array#include? 快得多——一个集合只需一步就能回答问题,而一个数组需要迭代所有元素。但是to_set 需要对每个元素进行哈希处理,因此也需要迭代所有元素。因此,问题不是数组中有多少元素,而是您需要多久调用一次集合上的includes??对于少量的include? 调用,数组会更快,因为您保存了相当昂贵的to_set 调用。对于更大的数字,一组将获胜。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
相关资源
最近更新 更多