Không. Biến số thể hiện không được xác định cho đến khi bạn gán cho chúng và attr_accessor
không tự động làm như vậy.
Cố gắng truy cập biến số không xác định trả về nil
, nhưng không xác định biến đó. Chúng thực sự không được xác định cho đến khi bạn ghi cho chúng. attr_accessor
dựa trên hành vi này và không làm bất cứ điều gì ngoại trừ xác định một getter/setter.
Bạn có thể xác minh điều này bằng cách xem .instance_variables
:
class Test
attr_accessor :something
end
Một ví dụ mới của x
không có biến Ví dụ:
x = Test.new # => #<Test:0xb775314c>
x.instance_variables # => []
Gọi getter không gây @something
để trở thành định nghĩa:
x.something # => nil
x.instance_variables # => []
Trong voking setter không nguyên nhân @something
để trở thành định nghĩa:
x.something = 3 # => 3
x.instance_variables # => ["@something"]
Thiết something
trở lại nil
không gây instance_variables
để trở lại, vì vậy chúng tôi có thể chắc chắn rằng các mảng trống đầu tiên trở lại không chỉ đơn giản là một trường hợp instance_variables
bỏ nil
giá trị:
x.something = nil # => nil
x.instance_variables # => ["@something"]
Bạn cũng có thể xác minh rằng đây không phải chỉ đơn giản là hành vi cụ thể để attr_accessor
:
class Test
def my_method
@x # nil
instance_variables # []
@x = 3
instance_variables # ["@x"]
end
end
Test.new.my_method