Nếu bạn nhận được băm làm đối số duy nhất, tại sao không chỉ giữ nguyên đó làm biến mẫu? Bất cứ khi nào bạn cần một giá trị, hãy gọi nó từ băm. Bạn có thể giữ tên biến mẫu ngắn để nó có thể dễ dàng được gọi.
class Foo
attr_reader :p
def initalize p
@p = p
end
def foo
do_something_with(@p[:name])
...
end
end
Nếu @p[:name]
vẫn còn quá dài cho bạn, sau đó bạn có thể tiết kiệm một proc như là một biến Ví dụ, và gọi các giá trị liên quan như @p.(:name)
.
class Foo
attr_reader :p
def initialize p
@p = ->x{p[x]}
end
def foo
do_something_with(@p.(:name))
...
end
end
Hoặc, cách khác là xác định phương thức gọi hàm băm và áp dụng khóa.
class Foo
def initalize p
@p = p
end
def get key
@p[key]
end
def foo
do_something_with(get(:name))
...
end
end
Nếu muốn đặt giá trị, bạn có thể xác định phương pháp setter và kiểm tra thêm các khóa không hợp lệ nếu muốn.
class Foo
Keys = [:name, :age, :email, :gender, :height]
def initalize p
raise "Invalid key in argument" unless (p.keys - Keys).empty?
@p = p
end
def set key, value
raise "Invalid key" unless Keys.key?(key)
@p[key] = value
end
def get key
@p[key]
end
def foo
do_something_with(get(:name))
...
end
end
Tôi thực sự nghĩ câu trả lời cho câu hỏi này là 'không' - có thể có cách tốt hơn, nhưng nếu có một cách tốt hơn và nhiều hơn nữa idiomatic_ cách sau đó sẽ có một câu trả lời rõ ràng lên bình chọn dưới đây. –