Helpex - Trao đổi & giúp đỡ Đăng nhập
5

Tôi đã quá quen với việc làm việc trong PHP với các mảng đa chiều, nơi tôi có thể gán và khởi tạo hàm băm bằng cách

unset($a); // just to show that there is no variable $a
$a['settings']['system']['memory'] = '1 Gb';
$a['settings']['system']['disk space'] = '100 Gb';

Có cách nào để làm điều tương tự trong Ruby không? Hoặc tôi cần khởi tạo tất cả các thứ nguyên trước rồi mới gán giá trị. Có thể xác định một Hash nâng cao sẽ cho phép thực hiện những gì tôi cần không? Bạn làm điều đó như thế nào?


Cập nhật

Ngoài giải pháp do Douglas đề xuất (xem bên dưới), tôi đã tìm thấy một chủ đề về chủ đề này , trong đó Brian Schröäer đã đề xuất một phần mở rộng cho Hashlớp học:

class AutoHash < Hash
  def initialize(*args)
    super()
    @update, @update_index = args[0][:update], args[0][:update_key] unless args.empty?
  end

  def [](k)
    if self.has_key?k
      super(k)
    else
      AutoHash.new(:update => self, :update_key => k)
    end
  end

  def []=(k, v)
    @update[@update_index] = self if @update and @update_index
    super
  end
end

Nó cho phép giải quyết vấn đề khi một mục băm bị thiếu không được tạo ra khi giá trị mục chỉ được yêu cầu, ví dụ a['key'].


Một số tài liệu tham khảo bổ sung

  1. tự động hóa băm ruby ​​(các khía cạnh)
  2. http://trevoke.net/blog/2009/11/06/auto-vivifying-hashes-in-ruby/
  3. http://www.eecs.harvard.edu/~cduan/technical/ruby/ycombinator.shtml
5 hữu ích 1 bình luận 2.3k xem chia sẻ
7

Thử cái này:

def hash_with_default_hash
    Hash.new { |hash, key| hash[key] = hash_with_default_hash }
end

a = hash_with_default_hash

Nếu khóa không tồn tại, thì kết quả của khối sẽ được sử dụng làm giá trị mặc định. Trong trường hợp này, giá trị mặc định cũng là một hàm băm sử dụng các hàm băm làm giá trị mặc định của nó.

7 hữu ích 4 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ php ruby hash initialization multidimensional-array , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading