这是我的代码:
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]/) }
它不起作用。
任何人都可以向我解释原因吗?
答案 0 :(得分:2)
String#match
将正则表达式对象(或正则表达式模式字符串)作为参数,而String#included?
将字符串作为参数。
您应该使用:
fred.delete_if { |k,v| k.include?('a') }
答案 1 :(得分:1)
.include?
返回布尔值true / false,并期望一个字符串作为输入。
.match
以MatchData
形式返回有关匹配的信息(如果没有匹配则返回nil
),并接受字符串或正则表达式。
答案 2 :(得分:1)
每个人都建议使用include?
进行字面匹配。我更喜欢使用不同的语法来完成同样的事情:
"foo".include?("o") # => true
"foo"["o"] # => "o"
"foo".include?("a") # => false
"foo"["a"] # => nil
在Ruby中,任何非nil
或false
的内容都被视为true
,因此,对于布尔测试,如果获得值或true
,则上述测试是等效的,或者如果你得到false
或nil
。
如果你绝对必须有一个布尔结果,请使用!!
("而不是")技巧,这很好地转换了一个" 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#[]
。