【问题标题】:Is there an inverse 'member?' method in ruby?有逆“成员”吗?红宝石中的方法?
【发布时间】:2011-12-29 07:45:33
【问题描述】:

我经常发现自己检查某个值是否属于某个集合。据我了解,人们通常为此使用Enumerable#member?

end_index = ['.', ','].member?(word[-1]) ? -3 : -2

但是,这感觉不如 Ruby 中的大多数东西优雅。我宁愿把这段代码写成

end_index = word[-1].is_in?('.', ',') ? -3 : -2

但我找不到这样的方法。它甚至存在吗?如果不是,有什么想法吗?

【问题讨论】:

  • 会员也可以使用别名吗?方法:包括?这在您的上下文中可能看起来更好:['.', ','].include?(word[-1]).
  • @Alex 谢谢,我差点忘了。

标签: ruby enumerable


【解决方案1】:

不是 ruby​​,而是 in ActiveSupport:

characters = ["Konata", "Kagami", "Tsukasa"]
"Konata".in?(characters) # => true

【讨论】:

    【解决方案2】:

    你可以很容易地沿着这条线定义它:

    class Object
      def is_in? set
        set.include? self
      end
    end
    

    然后用作

    8.is_in? [0, 9, 15]   # false
    8.is_in? [0, 8, 15]   # true
    

    或定义

    class Object
      def is_in? *set
        set.include? self
      end
    end
    

    并用作

    8.is_in?(0, 9, 15)   # false
    8.is_in?(0, 8, 15)   # true
    

    【讨论】:

    • 是的,我知道我可以。但我宁愿不要将此代码拖到每个新项目中。 :-)
    • @Sergei Tulentsev:选择权在你。
    • 然后把它放在宝石之类的东西里。
    【解决方案3】:

    不是您问题的答案,但也许是您问题的解决方案。

    word 是一个字符串,不是吗?

    您可以使用正则表达式检查:

    end_index = word =~ /\A[\.,]/  ? -3 : -2
    

    end_index = word.match(/\A[\.,]/)  ? -3 : -2
    

    【讨论】:

    • 是的,这可以解决这个确切的问题,但还有很多其他问题,比如 [:admin, :moderator].include?(current_user.role)
    【解决方案4】:

    在您的具体情况下,有 end_with?,它接受多个参数。

    "Hello.".end_with?(',', '.') #=> true
    

    【讨论】:

    • 问题是关于一般情况的,我只是粘贴了代码中的最新出现。不过谢谢你的提示,我不知道这个方法。
    【解决方案5】:

    除非您正在处理对 === 具有特殊意义的元素,例如模块、正则表达式等,否则您可以使用 case 做得很好。

    end_index = case word[-1]; when '.', ','; -3 else -2 end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 2011-02-28
      • 2013-03-19
      • 2010-09-08
      • 2023-04-07
      • 1970-01-01
      • 2010-11-29
      相关资源
      最近更新 更多