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 回答