为什么我的比较运算符返回一个整数,而不是true / false?

时间:2013-10-27 23:09:09

标签: ruby regex hash

我有以下内容:

@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,但它应该是真的。

编辑:我应该提一下,在这个函数中,如果某个输入不存在,它应该返回一个空哈希。

3 个答案:

答案 0 :(得分:1)

根据the String#=~ documentationString#=~会返回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"}