2012-02-23 17 views
9

Tôi muốn biết các biến mẫu của một mô-đun Ruby hoạt động như thế nào trên nhiều lớp mà 'trộn' nó 'trong'. Tôi đã viết mã mẫu để kiểm tra:Biến thể của một mô-đun được chia sẻ giữa lớp với mixin?

# Here is a module I created with one instance variable and two instance methods. 
module SharedVar 
    @color = 'red' 
    def change_color(new_color) 
    @color = new_color 
    end 
    def show_color 
    puts @color 
    end 
end 

class Example1 
    include SharedVar 
    def initialize(name) 
    @name  = name 
    end 
end 

class Example2 
    include SharedVar 
    def initialize(name) 
    @name  = name 
    end 
end 

ex1 = Example1.new("Bicylops") 
ex2 = Example2.new("Cool") 

# There is neither output or complains about the following method call. 
ex1.show_color 
ex1.change_color('black') 
ex2.show_color 

Tại sao nó không hoạt động? Và ai đó có thể giải thích hành vi thực tế của @color trên nhiều trường hợp Example$ là gì?

Trả lời

11

Trong module Ruby và các lớp đối tượng, do đó, nó có thể thiết lập các biến dụ cho họ.

module Test 
    @test = 'red' 
    def self.print_test 
    puts @test 
    end 
end 

Test.print_test #=> red 

sai lầm của bạn đang nghĩ rằng @color biến là như nhau cho:

module SharedVar 
    @color 
end 

module SharedVar 
    def show_color 
    @color 
    end 
end 

mà không phải là.

Trong ví dụ đầu tiên, biến dụ thuộc về đối tượng SharedVar và trong ví dụ thứ hai biến cá thể thuộc về các đối tượng bạn bao gồm các module trong.

Một lời giải thích bởi tự con trỏ. Trong ví dụ đầu tiên, con trỏ tự được đặt thành đối tượng mô-đun SharedVar, do đó, nhập @color sẽ tham chiếu đến đối tượng SharedVar và không có kết nối với đối tượng khác. Trong ví dụ thứ hai, phương pháp show_color chỉ có thể được gọi trên một số đối tượng, ví dụ: ex1.show_color, do đó, con trỏ tự sẽ trỏ đến đối tượng ex1. Vì vậy, trong trường hợp này, biến cá thể sẽ tham chiếu đến đối tượng ex1.

+0

Giải thích khá rõ ràng! Vì vậy, nếu mô-đun tôi thiết kế là để trộn với các lớp khác. Tôi nên xác định 'instance variable' bên trong' instance method', là sự hiểu biết của tôi đúng chưa? – steveyang

+1

Có, chỉ cần tính toán bản thân hiện tại là gì và sau đó bạn có thể hiểu vị trí của biến thể hiện. – megas

+1

Cảm ơn. Tôi chỉ đang học Ruby hiện tại, không phải là phần tự hiện tại. Có vẻ ngôn ngữ thanh lịch hơn 'javaScript'. – steveyang

0

Bạn đã bao gồm một mô-đun vào một lớp .. vì vậy các instance variable @color phải là một biến thể hiện của cả hai lớp example1 và Ví dụ 2

Vì vậy, nếu bạn muốn truy cập các biến @color có nghĩa là bạn giả để tạo ra một đối tượng lớp và sau đó bạn có thể truy cập cho nó

đối với Ex

irb(main):028:0> ex1.change_color('black') 
=> "black" 
irb(main):029:0> ex1.show_color 
black 
irb(main):031:0> ex2.change_color('red') 
=> "red" 
irb(main):032:0> ex2.show_color 
red 
+0

Đây chính xác là những gì tôi đang làm. Nhưng cả hai 'ex1' và' ex2' không có 'color' được định nghĩa. – steveyang

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