-1

我有以下块,它允许我添加带有关键字和定义的整个条目:

class Dictionary

  def initialize
    @d = {}
  end

  def entries
    @d
  end

  def add(entry)
    (entry).each {|k,v=nil| 
      @d[k] = v
    }
  end

  def keywords
    @d.keys
  end

end

我希望能够添加没有定义的关键字(添加键,但没有值)。我尝试在上面的块中设置 v=nil ,但它仍然失败。这是我在针对 Rspec 运行时遇到的错误:

Dictionary
  is empty when created
  can add whole entries with keyword and definition
  add keywords (without definition) (FAILED - 1)

Failures:

  1) Dictionary add keywords (without definition)
     Failure/Error: @d.add('fish')     
     NoMethodError:
      undefined method `each' for "fish":String
   # ./11_dictionary/dictionary.rb:13:in `add'
   # ./11_dictionary/dictionary_spec.rb:27:in `block (2 levels) in <top (required)>' 

最后,这是它需要通过的 rspec 测试:

it 'add keywords (without definition)' do
  @d.add('fish')
  @d.entries.should == {'fish' => nil}
  @d.keywords.should == ['fish']
end
4

3 回答 3

1

假设entry可以是类似哈希'fish' => 1或类似字符串 'fish'

def add(entry)
  if entry.is_a? Hash
     (entry).each {|k,v=nil| 
        @d[k] = v
     }
  elsif entry.is_a? String
    @d[entry] = nil
  else 
    raise "wrong input type in add entry"
  end
end

您可以类似地处理不同形式的输入。例如,要处理一组条目,请检查是否entry.is_a? Array,然后进行相应的处理。

也就是说,编码此方法的一种更简洁的方法可能是将键和值作为@steenslag 建议的显式输入。

def add_key(k,v=nil)
   @d[k] = v
end

然后您可以调用方法,例如add("fish", 1)添加值或add('fish')添加值而不添加值。

要添加多个键,请定义另一种方法,例如:

def add_keys(opts={})
  opts.map{|k,v| @d[k] = v}
end

这可以称为add_keys("fish" => 1, "dog" => 2, "mouse" => nil)。这种表示法与 RoR的路线update_attribute和方法相同。update_attributes

于 2013-10-05T21:20:26.293 回答
0

你那是什么意思?

def add(entry)
  (entry).each {|k,v=nil|
    @d[k] = v
  }
end

由于您传递单个元素,因此主体可以简单地是这样的:

def add(entry)
  @d[entry] = nil
end
于 2013-10-05T19:28:59.977 回答
0
def add(key, value=nil)
  @d[key] = value
end

应该做的伎俩。

于 2013-10-05T20:37:11.973 回答