我正在尝试 myhash = {/(\d+)/ => "hello"}使用ruby 1.9.2p136(2010-12-25)[i386-mingw32].
它没有按预期工作(编辑:因为事实证明它不应该像我期望的那样工作):
irb(main):004:0> myhash = {/(\d+)/ => "hello"}
=> {/(\d+)/=>"Hello"}
irb(main):005:0> myhash[2222]
=> nil
irb(main):006:0> myhash["2222"]
=> nil
Run Code Online (Sandbox Code Playgroud)
ste*_*lag 12
你在寻找这种行为吗?
myhash = Hash.new{|h,k| h[k] = 'hello' if k =~ /(\d+)/}
p myhash['aaa'] #=> nil
p myhash #=> {}
p myhash['1234'] #=>" hello"
p myhash #=> {"1234"=>"hello"}
Run Code Online (Sandbox Code Playgroud)
如果没有一些额外的代码,它将无法工作,因为您正在将Regexp对象与Integer或String对象进行比较.它们不是平等的,也不是平等的.它们匹配,但需要更改Hash类代码.
irb(main):001:0> /(\d+)/.class
=> Regexp
irb(main):002:0> 2222.class
=> Fixnum
irb(main):003:0> '2222'.class
=> String
irb(main):004:0> /(\d+)/==2222
=> false
irb(main):007:0> /(\d+)/=='2222'
=> false
irb(main):009:0> /(\d+)/.equal?'2222'
=> false
irb(main):010:0> /(\d+)/.equal?2222
=> false
Run Code Online (Sandbox Code Playgroud)
你必须迭代哈希并使用=〜之类的东西:
hash.each do |k,v|
unless (k=~whatever.to_s).nil?
puts v
end
end
Run Code Online (Sandbox Code Playgroud)
或者将Hash类更改为try =〜以及正常匹配条件.(我认为最后一个选项很难,在mri中,Hash类似乎有很多C代码)
您可以将 Jean 的答案放入 default_proc
MAP = {
/1/ => "one",
/2/ => "two",
/\d/ => "number"
}
MAP.default_proc = lambda do |hash, lookup|
hash.each_pair do |key, value|
return value if key =~ lookup
end
return nil
end
p MAP["2"] #=> "two"
p MAP[44] #=> "number"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7309 次 |
| 最近记录: |