0

次のようなルビーハッシュがあります

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

しかし、特定の文字列が既にハッシュに含まれているかどうかを確認することはできません。を使用してhas_value?値の配列を取得し、それが含まれているかどうかを確認しようとしましたが、存在することがわかっている場合は常に を返します。たとえば、ハッシュに追加しようとすると、次のようになります。valuesinclude?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 > 

私が間違っていることは何ですか?

4

2 に答える 2

2

「$1」を意図したとおりに使用しているかどうかはわかりません。

この行のコードで:

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

line が「NICK はたくさんのことを言っています」の場合、$1 は「たくさんのことを言っています」になります。したがって、ハッシュで値「ニック」を実際に探しているのではなく、「たくさんのことを言っている」を探しています。

于 2012-04-08T14:55:44.710 に答える
0

正規表現がどのように機能しているかを確認する必要があります。ハッシュに問題があるとは言いません。

于 2012-04-08T10:50:30.087 に答える