2013-03-20 49 views

Trả lời

28

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 
2

Sắp xếp. Trong Ruby, các biến mẫu được tạo khi chúng được gán lần đầu tiên. Điều này hoàn toàn minh bạch đối với lập trình viên. Họ mặc định là không đến khi được chỉ định.

Ex:

class Foo 
    attr_accessor :bar 
    def baz 
    @nonexistant 
    end 
end 
f.bar #=> nil 
f.baz #=> nil 
f.bar = 4 
f.bar #=> 4 

Cho đến khi bạn gán giá trị cho một biến Ví dụ, nó nổi trong tình trạng con số không xác định.

Các vấn đề liên quan