2012-02-02 36 views
29

Bất cứ ai có thể chỉ cho tôi cách kiểm tra xem một khóa có tồn tại trong băm hay không và nếu không thì khóa đó sẽ là giá trị mặc định. Tôi giả sử có một lớp lót bằng cách sử dụng trừ khi làm điều này nhưng tôi không chắc chắn nên sử dụng cái gì.Nếu khóa không tồn tại, hãy tạo giá trị mặc định

Trả lời

11

Nếu bạn không cần phải lưu trữ giá trị mặc định vào băm bạn có thể sử dụng phương pháp Hash#fetch:

hash = {} 
hash.fetch(:some_key, 'default-value') # => 'default-value' 
p hash 
# => {} 

Nếu bạn cần thêm vào lưu trữ giá trị mặc định của bạn mỗi khi bạn truy cập không tồn tại quan trọng và bạn đang là người khởi tạo hash bạn có thể làm điều đó bằng Hash#new với một khối:

hash = Hash.new { |hash, key| hash[key] = 'default-value' } 
hash[:a] = 'foo' 
p hash[:b] 
# => 'default-value' 
p hash 
# => { :a => 'foo', :b => 'default-value' } 
15

Constructor của lớp hash chấp nhận giá trị mặc định, tương tự sẽ được trả lại nếu khóa khớp không được tìm thấy.

h = Hash.new("default") 

h.has_key?("jake") 
=> false 

h["jake"] 
=> "default" 

h["jake"] = "26" 
h.has_key?("jake") 
=> true 
43

Nếu bạn đã có một hash, bạn có thể làm điều này:

h.fetch(key, "default value") 

Hoặc bạn khai thác thực tế là một tổ chức phi hiện chìa khóa sẽ trở lại nil:

h[key] || "default value" 

Để tạo băm với giá trị mặc định nó phụ thuộc vào những gì bạn muốn làm chính xác.

  • độc lập quan trọng và sẽ không được lưu trữ:

    h = Hash.new("foo") 
    h[1] #=> "foo" 
    h #=> {} 
    
  • Phụ thuộc vào chìa khóa và sẽ được lưu trữ:

    h = Hash.new { |h, k| h[k] = k * k } 
    h[2] #=> 4 
    h #=> {2=>4} 
    
+2

Sử dụng h [key] || "giá trị mặc định" không được lưu, nếu đã có sai trong đó nó sẽ bị ghi đè – Sebastian

+0

Đó là lý do tại sao tôi liệt kê nó là một trong nhiều khả năng. Nói chung mọi người có ý tưởng về giá trị của băm của họ sẽ như thế nào, nếu bạn biết bạn sẽ không lưu các giá trị boolean, đó là một cách tiếp cận hoàn toàn tốt đẹp. –

3

Nếu bạn đang lưu trữ một giá trị mặc định có thể là 0 và bạn cần tính toán tại thời gian lưu trữ:

hash = {} 
... 
hash.fetch(key) {|k| hash[k] = calc_default()} 
1

Nếu bạn muốn gán giá trị mặc định để băm nếu chìa khóa không tồn tại (chưa), bạn có thể sử dụng ||= điều hành, ví dụ:

h = {some_key: 'non_default_value'} 
value = h[:some_key] ||= 'default_value' 
value2 = h[:non_existing_key] ||= 'default_value' 

value sẽ được chỉ định 'non_default_value'value2 sẽ được gán 'default_value'

Sau những bài tập h sẽ có non_existing_key thiết lập để 'default_value':

{:some_key=>"non_default_value", :non_existing_key=>"default_value"}

Các vấn đề liên quan