2011-06-21 75 views
6

Tôi có thể tạo một khối sẽ trích xuất các phần tử băm và biến chúng thành các biến cục bộ, nhưng tôi tự hỏi nếu một phương thức gốc đã tồn tại chưa. Một cái gì đó như thế này:Có Ruby tương đương với trích xuất của PHP không?

extract({ :foo => 'bar', :foo2 => 'bar2' }) 
puts foo # 'bar' 
puts foo2 # 'bar2' 

Lưu ý rằng các khóa là riêng tư và phạm vi cần phải lưu lại cục bộ.

+0

Có, rồng, đúng. Trong trường hợp này, con rồng ít hơn vì tất cả các cá nhân và địa phương, và đối phó với băm khá đáng ghét var tên + tấn thành viên. giải nén không cần thiết nhưng tốt đẹp. – glortho

Trả lời

7

Bạn có thể nhận được gần:

bar, bar2 = h.values_at :foo, :foo2 

Hoặc Tôi cho rằng chúng ta có thể mở rộng Hash để trích xuất thành các biến mẫu:

class Hash 
    def extract o 
    each { |k, v| o.instance_variable_set '@' + k.to_s, v } 
    end 
end 

h.extract self 

p [@foo, @foo2] 
+0

Tôi đã không biết điều này - tốt để biết, cảm ơn bạn - nhưng với một loạt các phím nó sẽ không đủ tiết kiệm để có giá trị nó, đặc biệt là kể từ khi bạn thay đổi một tên chính, sau đó bạn thay đổi nó hai lần trong nhiệm vụ này và một lần nữa bất cứ nơi nào bạn đã sử dụng nó. Bạn có thể genericize tên biến địa phương nhưng đó không phải là những gì tôi hy vọng. Có thể không thể, trong trường hợp đó ... vậy là được! – glortho

+0

Ok, tôi đã cập nhật nó với một cách tiếp cận hoàn toàn tự động, nhưng nó vi phạm quy tắc phạm vi địa phương của bạn. – DigitalRoss

+0

Tiện dụng! Tôi hy vọng câu hỏi này không bao giờ được trả lời đầy đủ bởi vì tôi đang học tất cả các loại thủ thuật. :-) – glortho

1

Bạn có thể sử dụng phương pháp each để lặp qua từng key=>value cặp:

{ :foo => 'bar', :foo2 => 'bar2' }.each do |key, value| 
    print key,"\t",value,"\n" 
end 

Đầu ra:

foo  bar 
foo2 bar2 
+0

Cảm ơn, Teddy. Tôi biết tôi có thể làm điều đó trong một khối. Chỉ cần tìm kiếm một phương pháp ngắn tay. – glortho

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