Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 1.9正则表达式作为哈希键_Ruby_Regex_Hash - Fatal编程技术网

Ruby 1.9正则表达式作为哈希键

Ruby 1.9正则表达式作为哈希键,ruby,regex,hash,Ruby,Regex,Hash,我正在用ruby 1.9.2p136(2010-12-25)[i386-mingw32]尝试这个例子 它没有按预期的那样工作(编辑:事实证明它不应该像我预期的那样工作): 其中包含在ruby1.8.7工程中。 我错过了什么 我从未想过使用正则表达式作为散列键。老实说,我不确定这是否可行,也不确定如果可行的话它将如何发挥作用 无论如何,有两种想法: 在您尝试查找该项时,您使用了hash,但该哈希名为myhash 如果我使用它,我会得到以下结果: hektor ~ ❯❯ irb >> m

我正在用ruby 1.9.2p136(2010-12-25)[i386-mingw32]尝试这个例子 它没有按预期的那样工作(编辑:事实证明它不应该像我预期的那样工作):

其中包含在ruby1.8.7工程中。

我错过了什么

我从未想过使用正则表达式作为散列键。老实说,我不确定这是否可行,也不确定如果可行的话它将如何发挥作用

无论如何,有两种想法:

  • 在您尝试查找该项时,您使用了
    hash
    ,但该哈希名为
    myhash
  • 如果我使用它,我会得到以下结果:

    hektor ~ ❯❯ irb
    >> myhash = {/(\d+)/ => "hello"}
    => {/(\d+)/=>"hello"} 
    >> myhash['2222']
    => nil 
    >> myhash[2222]
    => nil 
    >> myhash[/(\d+)/]
    => "hello" 
    
  • 这是使用Ruby 1.9.2-p180

    好的,检查了,下面是有效的方法:

    myhash = {/foo/ => "hello"}
    myhash[/foo/] # => "hello"
    

    查找是在键上进行的,键是一个正则表达式,而不是该正则表达式的许多潜在匹配项之一。

    如果没有一些额外的代码,它将无法工作,因为您正在将正则表达式对象与整数或字符串对象进行比较。他们的价值不平等,身份也不平等。它们将匹配,但这需要更改哈希类代码

    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
    
    您必须迭代散列并使用=~如下所示:

     hash.each do |k,v|    
       unless (k=~whatever.to_s).nil?
         puts v   
       end
     end
    

    或者将哈希类更改为try=~以及正常的匹配条件。(我认为最后一个选项很难,在mri中,哈希类似乎有很多C代码)

    您是否在寻找这种行为

    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"}
    

    您可以将Jean的答案放入默认程序

    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"
    

    现在有一个名为Hashie的gem提供了此功能(以及更多功能):

    它提供了一个名为Rash(regex hash的缩写)的数据结构,可以这样使用

    myhash = {/(\d+)/ => "hello"}
    rash = Hashie::Rash.new(myhash)
    
    >> rash["2222"]
    => "hello"
    

    它确实试图将键与正则表达式进行匹配,因此除非将数字键转换为字符串,否则数字键将无法工作,这可以通过将Rash继承到自己的类中轻松实现。但不幸的是,这不是问题所在,我认为您必须迭代散列并进行正常匹配。不会很快的。你想解决什么问题?使用regexp作为散列的键值似乎有点奇怪。@Jonas-似乎我把一项简单的任务复杂化了。特别是@Telemachus-yeap myhash&hash是我的打字错误。而且看起来ruby根本没有把/(\d+)/当作正则表达式来对待。@Telemachus-我看到了这篇文章。您链接到的帖子需要一个迭代器和对gsub的调用,gsub将解释regexp。在你的例子中,你试图用一个整数和一个字符串分别比较一个正则表达式对象…@Jean-现在我也能看到它了。@Jonas这就是重点。您无法通过匹配查找它(至少不能直接查找)。密钥不是匹配项,而是正则表达式本身。因此,请尝试
    myhash[/\d+/]
    (例如),它应该返回
    “hello”
    (或者存储在那里的任何内容)。这个答案似乎比公认的答案更通用。
    myhash = {/(\d+)/ => "hello"}
    rash = Hashie::Rash.new(myhash)
    
    >> rash["2222"]
    => "hello"