【问题标题】:Is there anything in ruby like object.in(array)? [duplicate]ruby 中有什么像 object.in(array) 这样的东西吗? [复制]
【发布时间】:2019-11-16 05:42:27
【问题描述】:

所以写这个的标准方法似乎是array.include?(object)。但是,与 object.in(array) 相比,我发现它更难快速阅读和理解。 ruby 中有这样的东西吗?

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

allowed_user_roles.include?(user_role)

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

user_role.in(allowed_user_roles)

【问题讨论】:

  • 一个集合包含对它持有的对象的引用,反之亦然。一个对象通常不知道它包含在某个地方。因此,您说ary.index(obj),而不是obj.index_within(ary)。或'ruby'.start_with?('ru') 而不是'ru'.prefix_of?('ruby')。在您的示例中,该数组可能包含另一个具有相同字符的字符串,即不同的对象。所以你问的是字符串 "hey string,这个数组中是否还有另一个字符串看起来像你?" 而不是 "hey 数组,你是否包含一个等于这个的字符串?”。对我来说,前者似乎有点奇怪。
  • 有点奇怪,但读起来很棒:if str.in? names then... :)
  • 我发现它像 object.in?(array) 一样更具可读性和英文。尤其是在 if 语句中,我发现 if object.in?(array) 方式比 if array.include?(object) 更容易理解。只是个人喜好,虽然真的。这也可能取决于上下文。
  • @mrzasa, ...或if str.in? name then...
  • @Andrew 它看起来真的很不错。但对我来说,needle.in?(haystack) 之类的东西意味着针知道它是否在大海捞针中。它只需要说 yesno,即我希望得到即时响应。而haystack.include?(needle) 听起来已经是一项乏味的任务。如果没有接收器,那将是一个不同的故事。如果in? 是一个运算符,那么obj in? collection(没有点,不指向obj)将是一个更普遍的问题,并且可能是collection.include?(obj) 的语法糖。正如你所说,这可能是个人喜好。

标签: arrays ruby


【解决方案1】:

它不在核心 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 然后 require active_support/core_ext/object/inclusion

# Gemfile
gem 'active_support'

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

【讨论】:

  • 非常感谢,我正在使用 Rails,所以这正是我想要的。我想我什至可能用过这个?过去几年的方法,但在去年从轨道上休息了一年之后,我忘记了这一点。
  • 如果有帮助,请考虑支持和接受 :)
  • 值得阅读 ActiveSupport 以了解 Rails 正在改进/扩展哪些 Ruby 代码。 Rails 对核心 Ruby 代码进行了如此多的改进,以至于通常很难区分两者。
  • 这是我在 stackoverflow 上的第一个问题。 :)
  • @Matthew 有一个测验显示了区分香草 Ruby 和 Rails 风味 Ruby 的难度:railshurts.com/quiz
【解决方案2】:

作为一种实验,您也可以自己创建它(尽管猴子补丁通常不被接受)

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

【讨论】:

  • “精炼”对象通常更安全且更易于接受(Rails 在 ActiveSupport 中使用精炼)。虽然,这在技术上仍然是猴子补丁。
猜你喜欢
  • 2023-03-06
  • 2013-05-02
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2020-10-24
  • 2011-06-02
  • 1970-01-01
相关资源
最近更新 更多