我有以下内容:
@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
,但它应该是真的。
编辑:我应该提一下,在这个函数中,如果某个输入不存在,它应该返回一个空哈希。
答案 0 :(得分:1)
根据the String#=~
documentation,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"}
答案 1 :(得分:0)
我不知道您使用的是哪个版本的Ruby,但使用我的Ruby 2.0.0.p247,您的find( 'fi' )
会返回空哈希({}
)。否则,在顶层使用实例变量(@d
)是不常见的。你想要的是select
方法:
@d.select { |k, v| k =~ /fi/ }
答案 2 :(得分:-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"}