2010-07-30 53 views
1

Python有着非常优雅的语法来检查针对多个模式的值。红宝石等价于[一,二,三]中的foo?

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

秩序的Ruby版本,只是感觉不对:

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

我明白include?使许多更有意义OO比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

[1,2,4] .INCLUDE(2? )对我来说似乎完全是英语(并且适合我)......但这不是每个人都喜欢英语的问题。你呢? – RubyDubee 2010-07-30 07:42:20

+1

你应该可以很容易地实现你自己的'2.in [1,2,4]'。 :) – deceze 2010-07-30 07:43:54

回答

2

$创业板安装理智

$ IRB

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

我想,引入“更常见”模式的好处并不值得让语言具有非常具体的用法,特别是因为使用.include?既没有乏味也没有反直觉,当你想到它时。

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

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 
+3

只是一个小建议:该方法应该命名为'in?',这是Ruby方法返回布尔值的惯例。 – 2010-07-30 10:57:24