1

私は次のものを持っています:

@d = {'fish' => 'aquatic animal', 'fiend' => 'wicked person', 'great' => 'remarkable'}

def find(x)
  result={}
  @d.each do |k,v|
    if @d[k] =~ /[#{x}]/
      #has to return in a hash
      result[k]=v
    else
      return {}
    end
  end
return result
end

入力で:

find('fi') 

次のように返されます。

{'fish' => 'aquatic animal', 'fiend' => 'wicked person'}

しかし、私は整数を取得しています。いくつかの IRB テストでは5、 が返されているように見えますが、本当のはずです。

編集:この関数では、存在しないものが入力された場合、空のハッシュを返す必要があることに注意してください。

4

3 に答える 3

1

ドキュメントによるとString#=~String#=~ fixnum または nil を返します。ただし、状態nilのようfalseに動作します。ここでの本当の問題はreturn、ブロック内で実際にメソッド本体から返されることです。

あなたが解決しようとしている問題に関しては、私はただ行きEnumerable#selectます:

 @d = {'fish' => 'aquatic animal', 'fiend' => 'wicked person', 'great' => 'remarkable'}
 @d.select { |k, _| k =~ /fi/ }
 # => {"fish"=>"aquatic animal", "fiend"=>"wicked person"} 
于 2013-10-27T23:33:32.373 に答える
0

使用している Ruby のバージョンはわかりませんが、私の Ruby 2.0.0.p247 を使用すると、find( 'fi' )空のハッシュ ( {}) が返されます。@dそれ以外の場合、最上位でインスタンス変数 ( ) を使用することは異常です。あなたが望むのはselectメソッドです:

@d.select { |k, v| k =~ /fi/ }
于 2013-10-27T23:34:23.377 に答える
-1

これはそれを行う必要があります:

newHash = @d.each_with_object({}) do |k, hash|
  if k[0] =~ /fi/
    hash[k[0]] = k[1]
  end  
end;

# => {"fish"=>"aquatic animal", "fiend"=>"wicked person"}

またはさらに簡単:

@d.keep_if { |k, v| k =~ /fi/}

# => {"fish"=>"aquatic animal", "fiend"=>"wicked person"}
于 2013-10-27T23:31:21.130 に答える