“include?”有什么区别?和“匹配”?

时间:2014-03-12 15:58:54

标签: ruby

这是我的代码:

fred = {
    'age' => 63,
    'gender' => 'male',
    'favorite painters' => ['Monet', 'Constable', 'Da Vinci']
}



fred.delete_if { |k,v| k.match(/[a]/) }
puts fred

结果显示{"gender"=>"male"}

如果我将代码更改为

fred.delete_if { |k,v| k.include?(/[a]/) }

它不起作用。

任何人都可以向我解释原因吗?

3 个答案:

答案 0 :(得分:2)

String#match将正则表达式对象(或正则表达式模式字符串)作为参数,而String#included?将字符串作为参数。

您应该使用:

fred.delete_if { |k,v| k.include?('a') }

For more info, see the document.

答案 1 :(得分:1)

.include?返回布尔值true / false,并期望一个字符串作为输入。

.matchMatchData形式返回有关匹配的信息(如果没有匹配则返回nil),并接受字符串或正则表达式。

答案 2 :(得分:1)

每个人都建议使用include?进行字面匹配。我更喜欢使用不同的语法来完成同样的事情:

"foo".include?("o") # => true
"foo"["o"] # => "o"

"foo".include?("a") # => false
"foo"["a"] # => nil

在Ruby中,任何非nilfalse的内容都被视为true,因此,对于布尔测试,如果获得值或true,则上述测试是等效的,或者如果你得到falsenil

如果你绝对必须有一个布尔结果,请使用!!("而不是")技巧,这很好地转换了一个" truthy"值为布尔补码,然后返回到该值的布尔补码。

true # => true
false # => false
'a' # => "a"
nil # => nil

!true # => false
!false # => true
!'a' # => false
!nil # => true

!!true # => true
!!false # => false
!!'a' # => true
!!nil # => false

让我们这样做:

!!"foo"["o"] # => true
!!"foo"["a"] # => false

这会产生更紧凑的代码,这可能不是您特定的编码风格所需要的。它将Ruby代码推向Perl或C代码,因此在可读性方面权衡紧凑性并选择您想要的样式。

有关详细信息,请参阅String#[]