Есть ли в ruby ​​что-нибудь вроде object.in (array)? - PullRequest
4 голосов
/ 05 июля 2019

Таким образом, стандартный способ написать это, похоже, array.include?(object).Однако я считаю, что намного труднее читать и понимать по сравнению с object.in (массивом).Есть ли что-то подобное в ruby?

Пример, который я только что повторил, был (user_role - строка, а allow_user_roles - массив строк):

allowed_user_roles.include?(user_role)

Я знаю, что это, вероятно,личные предпочтения, но я нахожу это намного легче читать и понимать.

user_role.in(allowed_user_roles)

Ответы [ 2 ]

6 голосов
/ 05 июля 2019

Его нет в ядре Ruby, но он добавлен в Расширения ядра ActiveSupport . Если вы используете 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'
2 голосов
/ 05 июля 2019

В качестве эксперимента вы также можете создать это самостоятельно (хотя обычно не одобряется использование обезьян)

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...