Cách thêm vào hàm băm hiện có trong Ruby


102

Liên quan đến việc thêm một key => valuecặp vào mã băm phổ biến hiện có trong Ruby, tôi đang trong quá trình làm việc thông qua Beginning Ruby của Apress và vừa hoàn thành chương băm.

Tôi đang cố gắng tìm cách đơn giản nhất để đạt được kết quả tương tự với hàm băm như cách này với mảng:

x = [1, 2, 3, 4]
x << 5
p x

Câu trả lời:


189

Nếu bạn có một hàm băm, bạn có thể thêm các mục vào nó bằng cách tham chiếu chúng bằng khóa:

hash = { }
hash[:a] = 'a'
hash[:a]
# => 'a'

Ở đây, giống như [ ]tạo một mảng trống, { }sẽ tạo một băm trống.

Mảng có không hoặc nhiều phần tử theo một thứ tự cụ thể, trong đó các phần tử có thể bị trùng lặp. Hàm băm không có hoặc nhiều phần tử được tổ chức theo khóa , trong đó các khóa có thể không bị trùng lặp nhưng các giá trị được lưu trữ ở các vị trí đó có thể được.

Hàm băm trong Ruby rất linh hoạt và có thể có các khóa gần như bất kỳ loại nào mà bạn có thể ném vào nó. Điều này làm cho nó khác với các cấu trúc từ điển bạn tìm thấy trong các ngôn ngữ khác.

Điều quan trọng cần lưu ý là bản chất cụ thể của khóa của hàm băm thường quan trọng:

hash = { :a => 'a' }

# Fetch with Symbol :a finds the right value
hash[:a]
# => 'a'

# Fetch with the String 'a' finds nothing
hash['a']
# => nil

# Assignment with the key :b adds a new entry
hash[:b] = 'Bee'

# This is then available immediately
hash[:b]
# => "Bee"

# The hash now contains both keys
hash
# => { :a => 'a', :b => 'Bee' }

Ruby on Rails hơi nhầm lẫn điều này bằng cách cung cấp HashWithIndierenceAccess nơi nó sẽ chuyển đổi tự do giữa các phương thức định địa chỉ Symbol và String.

Bạn cũng có thể lập chỉ mục trên hầu hết mọi thứ, bao gồm các lớp, số hoặc các hàm băm khác.

hash = { Object => true, Hash => false }

hash[Object]
# => true

hash[Hash]
# => false

hash[Array]
# => nil

Hàm băm có thể được chuyển đổi thành Mảng và ngược lại:

# Like many things, Hash supports .to_a
{ :a => 'a' }.to_a
# => [[:a, "a"]]

# Hash also has a handy Hash[] method to create new hashes from arrays
Hash[[[:a, "a"]]]
# => {:a=>"a"} 

Khi nói đến việc "chèn" mọi thứ vào một Hash, bạn có thể thực hiện từng thứ một hoặc sử dụng mergephương pháp để kết hợp các hàm băm:

{ :a => 'a' }.merge(:b => 'b')
# {:a=>'a',:b=>'b'}

Lưu ý rằng điều này không làm thay đổi hàm băm ban đầu mà thay vào đó trả về một hàm băm mới. Nếu bạn muốn kết hợp một hàm băm này vào một hàm băm khác, bạn có thể sử dụng merge!phương pháp:

hash = { :a => 'a' }

# Returns the result of hash combined with a new hash, but does not alter
# the original hash.
hash.merge(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Nothing has been altered in the original
hash
# => {:a=>'a'}

# Combine the two hashes and store the result in the original
hash.merge!(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Hash has now been altered
hash
# => {:a=>'a',:b=>'b'}

Giống như nhiều phương thức trên Chuỗi và Mảng, hàm !chỉ ra rằng nó là một hoạt động tại chỗ .


12
Rất nhiều thông tin có giá trị, nhưng thiếu công thức cơ bản nhất như được trả lời rất đơn giản bởi @robbrit.
danh sách

1
Vui lòng chỉnh sửa câu trả lời của bạn để thực sự trả lời câu hỏi đã được hỏi, tốt hơn là ở đâu đó gần trên cùng. Tôi sẽ thật thô lỗ nếu làm điều đó cho bạn.
Stephan

@Stephan Đã thêm một ví dụ ngắn gọn hơn ở trên cùng.
tadman


34

Nếu bạn muốn thêm nhiều hơn một:

hash = {:a => 1, :b => 2}
hash.merge! :c => 3, :d => 4
p hash

8
x = {:ca => "Canada", :us => "United States"}
x[:de] = "Germany"
p x

Tôi đã cố gắng triển khai điều này với những điều sau: x['key'] = "value"tuy nhiên, tôi nhận được lỗi. Tôi nên đề cập rằng tôi đang làm việc với chuỗi.
Tom

1
Lỗi gì vậy? Nó có thể là bất cứ điều gì trừ khi bạn nói rõ hơn.
tadman

1
hash = { a: 'a', b: 'b' }
 => {:a=>"a", :b=>"b"}
hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

Trả về giá trị đã hợp nhất.

hash
 => {:a=>"a", :b=>"b"} 

Nhưng không sửa đổi đối tượng người gọi

hash = hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 
hash
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

Việc chỉ định lại thực hiện một mẹo nhỏ.


0
hash {}
hash[:a] = 'a'
hash[:b] = 'b'
hash = {:a => 'a' , :b = > b}

Bạn có thể nhận được khóa và giá trị của mình từ đầu vào của người dùng, vì vậy bạn có thể sử dụng Ruby .to_sym có thể chuyển đổi một chuỗi thành một biểu tượng và .to_i sẽ chuyển đổi một chuỗi thành một số nguyên.
Ví dụ:

movies ={}
movie = gets.chomp
rating = gets.chomp
movies[movie.to_sym] = rating.to_int
# movie will convert to a symbol as a key in our hash, and 
# rating will be an integer as a value.

0

Bạn có thể sử dụng toán tử splat kép có sẵn kể từ Ruby 2.0:

h = { a: 1, b: 2 }
h = { **h, c: 3 }
p h
# => {:a=>1, :b=>2, :c=>3}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.