2012-02-02 22 views
5

Các bạn, tôi đang học ruby ​​và gần đây đã chuyển từ JAVA. Trong JAVA tôi có thể tạo một biến thành viên của một lớp tĩnh và biến thành viên đó sẽ vẫn giữ nguyên trên các cá thể của lớp. Làm thế nào để tôi đạt được điều tương tự trong ruby. Tôi đã làm điều gì đó như thế này trong lớp học ruby ​​của tôi:Phương pháp lớp trong Ruby (tương đương với tĩnh trong JAVA)

class Baseclass 

    @@wordshash 

end 

Điều này dường như nhằm mục đích cho đến nay trong khi tôi đang thử nghiệm điều này, đó là @@ wordhash vẫn giữ nguyên trên các trường hợp của Baseclass. Tôi hiểu thế có đúng không.

Ngoài ra, tôi muốn có một phương thức thành viên trong lớp tương đương với một phương thức tĩnh trong JAVA (tôi không yêu cầu phải có một cá thể của lớp để truy cập vào lớp này). Tôi có thể làm cái này như thế nào? Ví dụ tôi muốn có một phương pháp trong BaseClass như getwordshash() trả về @@ wordshash và người sử dụng của phương pháp mà không cần phải thực hiện một thể hiện của BaseClass() Vì vậy, một cái gì đó như thế này:.

class Baseclass 

    @@wordshash 

    #static or class method 
    def getwordhash() 
    return @@wordshash 
    end 
end 

và sau đó tôi có thể sử dụng nó như

#without making an instance 
@hash = Baseclass.getwordhash() 

Tôi xin lỗi nếu đây là một câu hỏi rất ngây thơ, tôi thực sự mới đến với Ruby nhưng rất vui mừng khi học.

Trả lời

7
def self.getwordhash 
    @@wordshash 
end 

Với Ruby and Rails Naming Conventions:

class Baseclass 

    @@words_hash = Hash.new 

    def self.words_hash 
    @@words_hash 
    end 
end 
+2

Thực ra, quy ước thường không có loại. Nó sẽ là '@@ words' thay vì' @@ words_hash'. –

12

Sử dụng các biến lớp học như cửa hàng tĩnh đã ngoài ý muốn hậu quả trong các lớp tiểu. Bạn có thể dễ dàng thực hiện kho lưu trữ tĩnh bằng cách khai báo một biến cá thể ở cấp lớp.

class Foo 

    # initialize a static variable 
    @names = ['Tom', 'Dick', 'Harry'] 

    # class method (notice the self. prefix 
    def self.names 
    @names 
    end 

    # instance methods 

    def names 
    @names 
    end 

    def names=val 
    @names = val 
    end 

end 

Chúng ta hãy in tên tĩnh

>> Foo.names 
=> ["Tom", "Dick", "Harry"] 

Chúng ta hãy in dụ biến

>> f = Foo.new 
>> f.names 
=> nil 

Chúng ta hãy đặt biến dụ và cố gắng in lại

>> f.names=["Bob", "Danny"] 
=> ["Bob", "Danny"] 

>> f.names 
=> ["Bob", "Danny"] 

Hãy để chúng tôi in biến tĩnh một lần nữa

>> Foo.names 
=> ["Tom", "Dick", "Harry"] 

Tôi sử dụng thuật ngữ static một cách lỏng lẻo. Trong thực tế, cả hai biến là các biến mẫu. Các @names tuyên bố trong bối cảnh lớp là một biến thể hiện cho đối tượng lớp Foo@names bên trong một phương pháp là biến cá thể của một thể hiện của lớp Foo. Vì sẽ có một đối tượng đại diện cho loại Foo, chúng ta có thể xem xét @names được khai báo trong ngữ cảnh lớp là biến tĩnh.

+0

là có thể sử dụng một số biến thể của viết tắt: 'attr_accessor' để truy cập vào các biến cá thể lớp quasi này? –

+1

@DennisHodapp bạn đã thử sử dụng phương pháp 'cattr_accessor' và' mattr_accessor' chưa? –

+0

không có, nhưng có vẻ như những người truy cập là phần mở rộng của đường ray và tôi không muốn phải nhập chúng cho một ứng dụng Ruby. –

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