2012-04-08 3 views
0

내가 특정 문자열이 해시 이미 있는지 확인하기 위해 관리 할 수 ​​없습니다 은 루비 해시 값

{"10.1.1.6"=>"nick", "127.0.0.1"=>"nick1"} 

그러나

처럼 보이는 루비 해시가 포함 된 경우 확인 관리 할 수 ​​없습니다. 나는 has_value?을 시도했는데 을 사용하여 값의 배열을 얻었고 include?을 사용하여 그 값이 포함되어 있는지 확인했지만 항상 존재한다고 알 때 항상 false을 반환합니다. 예를 들어, 내가 해시에 "172.16.10.252"=>"nick"를 추가하려고 내가 할 : irb

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 

내가 잘못하지

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 > 

무엇은 잘 작동하지만 내 스크립트에합니까?

+0

많은 것들이 불분명하기 때문에 전체 컨트롤러 코드를 넣으십시오. '@ nicks','nick','ip'가 무엇인지, 어디서 정의 할 수 있는지는 명확하지 않습니다. 덕분에 – shime

+0

이 완료되었으며 관련 코드 – pmerino

+0

이 추가되었으며 여기에 입력 한 내용은 무엇입니까? 정규 표현식이 올바르게 작동합니까? 나는 해시에 문제가 있다고 말하지 않을 것이다. if 앞에있는 'nick'값을 검사하여 어떤 일이 발생하는지 확인하십시오. – shime

답변

0

정규식이 어떻게 작동하는지 확인해야합니다. 해시에 문제가 있다고는 말하지 않습니다.

2

"$ 1"을 (를) 사용하고 계신지 확실하지 않습니다. 이 줄의 코드에서

: 라인 인 경우

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

$ 1이 될 것이다 "는 것의 무리가 말한다" "닉 사물의 무리를 말한다". 따라서 해시에서 값 '닉'을 실제로 찾지는 않지만 '여러 가지를 말합니다'.