2011-09-27 20 views
6

Vì vậy, giả sử tôi có điều này (không hoạt động):Trong ruby ​​cách sử dụng biến cục bộ cấp lớp? (Câu hỏi một ruby ​​người mới của)

class User 
    description = "I am User class variable" 
    def print 
     puts description 
    end 
end 

Vì vậy, làm thế nào tôi nên sử dụng các mô tả var, làm thế nào để chuyển thông tin này vào một phương pháp như một tham số mặc định, hoặc được sử dụng trong phương pháp trực tiếp? Cảm ơn ..

Trả lời

1

Để xác định một biến lớp, sử dụng một @@:

class User 
    @@description = "I am a User class variable" 

    def print 
     puts @@description 
    end 
end 
0

biến Instance phải được bắt đầu bằng một @ và không thể truy cập từ bên ngoài. Biến lớp phải có tiền tố là @@.

Lần đầu tiên bạn sử dụng biến này ở bất kỳ đâu trong mã, biến này sẽ được khởi tạo. Nếu bạn muốn truy cập các giá trị từ bên ngoài:

attr_reader :description 

http://rubylearning.com/satishtalim/tutorial.html

+1

'attr_reader 'chỉ hoạt động cho các biến mẫu, không phải biến lớp. Nếu bạn đang sử dụng Rails, bạn có thể sử dụng 'cattr_reader' để làm điều này. – zetetic

+0

nhưng tôi thấy một ví dụ mã sử dụng một biến như tôi đã làm, vì vậy nó là hợp pháp? – user875883

+1

@ user875883 Đó sẽ là một ví dụ mã lạ. Có lẽ nó đã được về cách hiển thị như thế nào một biến địa phương được xác định trên cấp lớp là không trong phạm vi bên trong các phương pháp. –

4

Trong trường hợp của bạn, description chỉ biến cục bộ. Bạn có thể thay đổi phạm vi này sử dụng ký tự đặc biệt @, @@, $:

a = 5 
defined? a 
=> "local-variable" 

@a = 5 
defined? @a 
=> "instance-variable" 

@@a = 5 
defined? @@a 
=> "class variable" 

$a = 5 
defined? $a 
=> "global-variable" 

Đối với mục đích của bạn, tôi nghĩ rằng nó có thể được sử dụng bằng cách này

class User 
    def initialize(description) 
    @description = description 
    end 

    def print 
     puts @description 
    end 
end 

obj = User.new("I am User") 
obj.print 
# => I am User 
2

Bạn có thể truy cập vào đẳng cấp phạm vi sử dụng define_method .

class User 
    description = "I am User class variable" 
    define_method :print do 
     puts description 
    end 
end 

> User.new.print
Tôi class User biến
=> nil

Tôi không nghĩ đó là ý tưởng tốt, mặc dù :)

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