红宝石中有没有像object.in(array)这样的东西?

时间:2019-07-05 15:10:41

标签: ruby

因此,编写此代码的标准方法似乎是array.include?(object)。但是,与object.in(array)相比,我发现很难快速阅读和理解。红宝石里有这样的东西吗?

我再次碰到的示例是(user_role是一个字符串,allowed_user_roles是一个字符串数组):

allowed_user_roles.include?(user_role)

我知道它可能是个人喜好,但是我发现这很容易阅读和理解。

user_role.in(allowed_user_roles)

2 个答案:

答案 0 :(得分:6)

它不是在核心Ruby中,而是在ActiveSupport core extensions中添加。如果您使用Rails,则可以使用它:

1.in?([1,2])        # => true
"lo".in?("hello")   # => true
25.in?(30..50)      # => false
1.in?(1)            # => ArgumentError

要在Rails之外使用它,您需要安装active_support gem,然后要求active_support/core_ext/object/inclusion

# Gemfile
gem 'active_support'

# code
require 'active_support/core_ext/object/inclusion'

答案 1 :(得分:2)

作为一个实验,您也可以自己创建它(尽管通常不支持monkeypatching)

class Object
  def in?(collection)
    raise ArgumentError unless collection.respond_to?(:include?)
    collection.include?(self)
  end
end

然后,从Object继承的任何东西(几乎所有东西)都将具有#in?方法。

5.in?(0..10)
=> true

'carrot'.in?(['potato', 'carrot', 'lettuce'])
=> true