无法设法检查Ruby Hash是否包含值

时间:2012-04-08 10:05:26

标签: ruby hash

我有一个看起来像

的ruby哈希
{"10.1.1.6"=>"nick", "127.0.0.1"=>"nick1"}

但我无法检查Hash中是否已存在某个字符串。我尝试has_value?,使用values获取值数组,然后使用include?检查它是否包含它,但在我知道它存在时始终返回false。例如,我尝试将"172.16.10.252"=>"nick"添加到哈希中,我这样做:

class SomeClass
  def initialize(*args)
    super(*args)
    @nicks = Hash.new
  end

  def serve(io)
    loop do
      line = io.readline
      ip = io.peeraddr[3]
      begin
        if  /NICK (.*)/ =~ line
          nick = $1
          if @nicks.has_value?(nick) # it fails here
            puts "New nick #{$1}"
            @nicks[ip] = nick.gsub("\r", "")
            io.puts "Your new nick is #{nick}"
          else
            message = {:ERROR => "100", :INFO=>"#{nick}"}.to_json
            io.puts message
          end
        end
      rescue Exception => e
        puts "Exception! #{e}-#{e.backtrace}"
      end
    end
  end
end

irb上它可以正常工作,但在我的脚本上却没有

1.9.3p125 :001 > h = {"10.1.1.6"=>"nick", "127.0.0.1"=>"nick1"}
 => {"10.1.1.6"=>"nick", "127.0.0.1"=>"nick1"} 
1.9.3p125 :002 > h.has_value?('nick')
 => true 
1.9.3p125 :003 > if h.has_value?('nick')
1.9.3p125 :004?>   puts "yes"
1.9.3p125 :005?>   else
1.9.3p125 :006 >     puts "no"
1.9.3p125 :007?>   end
yes
 => nil 
1.9.3p125 :008 > 

我做错了什么?

2 个答案:

答案 0 :(得分:2)

我不确定你是否按照预期的方式使用“$ 1”。

在此行的代码中:

if  /NICK (.*)/ =~ line
  nick = $1
  if @nicks.has_value?(nick) # it fails here
        puts "New nick #{$1}"

如果行是“NICK说了很多东西”,1美元就会“说出一堆东西”。所以你并不是真的在你的哈希中寻找'缺口'的价值,而是为了“说了很多东西”。

答案 1 :(得分:0)

你应该检查你的正则表达式是如何工作的,我不会说散列有什么问题。