instance_variable_get và instance_variable_set trong Ruby
Bài đăng này đã không được cập nhật trong 4 năm
Method trong ruby: instance_variable_set & instance_variable_get
Ruby là ngôn ngữ linh hoạt. Nghĩa là chúng ta có thể tạo được class hay method ngay trong lúc thực thi. Hơn nữa trong ruby chúng ta cũng có thể truy cập đến các method private và protected ở mọi nơi mà mình muốn. Tuy nhiên chúng ta vẫn nên cẩn thận khi sử dụng chúng. Đây không phải là tất cả những thứ mà Ruby có thể làm về mặt linh hoạt. Ruby có thể linh hoạt như thế nào sẽ phụ thuộc vào việc bạn sử dụng nó ra sao.
Có câu hỏi đặt ra là, ngoài các phương thức và class được tạo tự động thì Ruby còn có thể làm gì ?
Trong ruby chúng ta có thể truy cập biến instance sử dụng instance từ bất kỳ nơi nào. Bạn có thể nghĩ đến việc tạo accessor để làm việc này . Tuy nhiên, bạn không nhất thiết phải sử dụng accessor để truy cập đến biến instance.
Trong Ruby đã có sẵn method để giúp chúng ta thay thế việc sử dụng accessor: instance_variable_get giúp bạn có thể gọi được biến instance, bên cạnh đó có method instance_variable_set cho phép bạn set biến instance thành bất kỳ một giá trị nào.
Giờ chúng ta đi vào hiểu cài đặt cụ thể của từng method.
instance_variable_set
instance_variable_set(p1, p2)
Tên của biến instance (p1) được đặt bằng symbol, nếu sử dụng string để đặt tên biến string sẽ được chuyển thành symbol.
class Persion
def initialize name
@name = name
end
end
sleepy = Persion.new("SleepyAsh") #=> #<Persion:0x0000563d05c0b3e8 @name="SleepyAsh">
nar = sleepy.instance_variable_set(:@nar, "Naruto") #=> Naruto
sleepy.inspect #=> "#<Persion:0x0000563d05c0b3e8 @name=\"SleepyAsh\", @nar=\"Naruto\">"
sử dụng instance_variable_set chúng ta đã thiết lập thêm được một biến cho sleepy, để gọi được chúng ta sẽ sử dụng đến method instance_variable_get
.
instance_variable_get
instance_variable_get(p1)
Trả ra giá trị của biến thực thể được đưa vào (p1). Phần @ của tên biến nên được bao gồm trong các biến instance thường xuyên. Bắt ngoại lệ với NameError
nếu tên biến không hợp lệ. Nếu đối số truyền vào (p1) là String nó sẽ được convert sang Symbol
class Persion
def initialize name
@name = name
end
end
sleepy = Persion.new("SleepyAsh") #=> #<Persion:0x0000563d05c0b3e8 @name="SleepyAsh">
name = sleepy.instance_variable_get(:@name) #=> SleepyAsh
nar = sleepy.instance_variable_get(:@nar) #=> Naruto
như vậy là sử dụng instance_variable_get chúng ta đã gọi được biến instance @nar được set ngay cả khi nó chưa được khởi tạo trong class .
Example
VD:
class A; end
a = A.new
a.instance_variable_get(:@var) #=> nil
a.instance_variable_set(:@var, 'Hi')
a.instance_variable_get(:@var) #=> Hi
Biến instance @var đã được khởi tạo thông qua method instance_variable_set. Để lấy được giá trị của biến @var ta sử dụng method instance_variable_get.
Bài tìm hiểu của mình còn nhiều sai sót rất mong các bạn sẽ góp ý
Tài liệu tham khảo
https://blog.kiprosh.com/dynamic-ruby/
All rights reserved