Ruby在[1,2,3]中相当于foo?

时间:2010-07-30 07:36:29

标签: ruby

Python具有非常优雅的语法,可以针对多种模式检查值。

2 in [1,2,4] #=> True
6 in [1,2,4] #=> False

Ruby版本的订单感觉不对:

[1,2,4].include?(2)

我知道include?2.included_in?([1,2,4])更有意义,我仍然不喜欢它。 Ruby甚至有in个关键字,但似乎只在构造for i in [1,2,4]中使用,而不是用于成员资格测试。

另一种方式是:

(case 2 when 1,2,4 then true end)

相当详细,但允许模式测试:

(case file_name when "README", /\.txt\z/ then true end)

仍然不太可读。

我偶然错过了一些非常漂亮的方式吗?

3 个答案:

答案 0 :(得分:7)

正如@deceze所说,你可以实现自己的:

class Object
  def in(ar)
    ar.include? self
  end
end

irb(main):013:0> 's'.in ['a', 'b', 'c']
=> false
irb(main):014:0> 's'.in ['a', 'b', 'c', 's']
=> true
irb(main):015:0> 5.0.in [3.2, 5.0, 1.2]
=> true
irb(main):016:0> 4.0.in [3.2, 5.0, 1.2]
=> false

答案 1 :(得分:3)

我认为引入“更常见”模式的好处并不值得使用具有特定用途的新语法结构来加重语言,特别是因为使用.include?既不乏味也不反直觉想一想。

另一方面,是什么阻止您实施和使用Object#included_in?方法?

答案 2 :(得分:2)

$ gem install sane

$ irb

 >> 3.in? [1,2,3]
 >> true