Nói về ruby 2.2.x đúng là bạn không thể tạo biến cục bộ theo ngữ cảnh trong ngữ cảnh/ràng buộc hiện tại .. nhưng bạn có thể đặt biến trong một số ràng buộc cụ thể mà bạn có tay cầm.
b = binding
b.local_variable_set :gaga, 5
b.eval "gaga"
=> 5
Thú vị ở đây là gọi cho mỗi lần ràng buộc mới binding
. Vì vậy, bạn cần phải có được một xử lý của các ràng buộc bạn quan tâm và sau đó eval trong bối cảnh của nó một khi các biến mong muốn được thiết lập.
Điều này hữu ích như thế nào? Ví dụ tôi muốn đánh giá ERB và viết ERB là đẹp hơn nhiều nếu bạn có thể sử dụng <%= myvar %>
thay vì <%= opts[:myvar] %>
hoặc một cái gì đó tương tự.
Để tạo liên kết mới, tôi đang sử dụng mô-đun phương thức (Tôi chắc chắn ai đó sẽ sửa tôi cách gọi đúng cách này, trong java tôi gọi đó là phương pháp tĩnh) với các biến đặc biệt thiết lập:
module M
def self.clean_binding
binding
end
def self.binding_from_hash(**vars)
b = self.clean_binding
vars.each do |k, v|
b.local_variable_set k.to_sym, v
end
return b
end
end
my_nice_binding = M.binding_from_hash(a: 5, **other_opts)
Bây giờ bạn có một ràng buộc với chỉ các biến mong muốn. Bạn có thể sử dụng nó để đánh giá kiểm soát tốt hơn của ERB hoặc khác (có thể là bên thứ ba) được tin cậy mã (đây là không phải bất kỳ loại sandbox nào). Nó giống như việc định nghĩa một giao diện.
cập nhật: Một vài lưu ý bổ sung về liên kết. Nơi bạn tạo chúng cũng ảnh hưởng đến tính khả dụng của các phương thức và độ phân giải hằng số. Trong ví dụ trên, tôi tạo ra một ràng buộc sạch sẽ hợp lý. Nhưng nếu tôi muốn cung cấp các phương thức thể hiện của một số đối tượng, tôi có thể tạo một ràng buộc bằng một phương thức tương tự nhưng trong lớp của đối tượng đó. ví dụ.
module MyRooTModule
class Work
def my_instance_method
...
end
def not_so_clean_binding
binding
end
end
class SomeOtherClass
end
end
Bây giờ tôi my_object.not_so_clean_binding
sẽ cho phép mã để gọi #my_instance_method
trên my_object
đối tượng. Trong cùng một cách, bạn có thể gọi ví dụ SomeOtherClass.new
bằng mã bằng cách sử dụng liên kết này thay vì MyRootModule::SomeOtherClass.new
. Vì vậy, đôi khi cần cân nhắc nhiều hơn khi tạo một ràng buộc hơn là chỉ các biến cục bộ. HTH
'" some_name "' và 'some_name' khác nhau, một đối tượng và một biến cục bộ khác là –
đúng. Tôi muốn sử dụng giá trị của 'var' như là toán hạng bên trái trong Struct.new – Bala
Có thể bạn đang nghĩ về những thứ như Perl hoặc PHP, trong đó' $ x = 'y'' và '$$ x =' z'' có nghĩa là cũng giống như '$ y = 'z''. Không có sự tương đương cụ thể nào trong Ruby, vì các tham chiếu biến không tồn tại trên mỗi se. – tadman