2011-11-14 42 views
41

Tôi đang cố gắng tạo một lớp, trong đó có một hàm tạo lấy một đối số duy nhất. Khi tôi tạo một thể hiện mới của đối tượng, nó trả về một con trỏ.Đối tượng Ruby in ra như con trỏ

class Adder 
    def initialize(my_num) 
     @my_num = my_num 
    end 
end 
y = Adder.new(12) 
puts y 

Tôi đang làm gì sai? Cảm ơn

Trả lời

70

Khi bạn sử dụng phương pháp new, bạn nhận được 'tham khảo' trên đối tượng mới được tạo ra. puts phương thức hạt nhân trả về một số thông tin ruby ​​nội bộ về đối tượng này. Nếu bạn muốn nhận được bất kỳ thông tin về tình trạng đối tượng của bạn, bạn có thể sử dụng phương pháp getter:

class Adder 
    def initialize(my_num) 
    @my_num = my_num 
    end 
    def my_num 
    @my_num 
    end 
end 
y = Adder.new(12) 
puts y.my_num # => 12 

Hoặc bạn có thể sử dụng phương pháp 'attr_reader' xác định một vài setter và getter phương pháp đằng sau những cảnh:

class Adder 
    attr_accessor :my_num 

    def initialize(my_num) 
    @my_num = my_num 
    end  
end 
y = Adder.new(12) 
puts y.my_num # => 12 
+6

Sẽ rất có ích khi sử dụng 'attr_reader: my_num' ở đây thay vì định nghĩa phương thức của riêng bạn. – tadman

+1

Tất nhiên, nhưng tôi nghĩ rằng sử dụng một phương pháp getter sẽ rõ ràng hơn cho chủ đề khởi động :) Thật vậy, tôi đã cập nhật tin nhắn của tôi, nhờ – WarHog

+5

Lưu ý rằng attr_reader đã được đề cập và sau đó attr_accessor đã được sử dụng. attr_reader cũng hoạt động. Nó chỉ cho phép bạn có được giá trị, trong khi attr_accessor cho phép bạn gán một giá trị mới cho my_num. –

4

Đó là do đối tượng một con trỏ. Trong Ruby, tất cả các đối tượng được phân bổ trên heap, và các biến chỉ là tham chiếu đến chúng.

Khi bạn làm

puts y 

Đó là thực sự gọi to_s mặc định phương pháp của đối tượng, mà chỉ là để sản xuất các tên lớp, vị trí bộ nhớ, và một số thông tin về các biến thể hiện của đối tượng.

4

Ruby không có con trỏ. Trong ví dụ của bạn, y là một phiên bản của Adder với một biến mẫu được gọi là @my_num với giá trị là 12 (mà chính nó là một đối tượng Fixnum).

Phương thức puts gọi phương thức to_s của bất kỳ đối số nào bạn vượt qua. Đó là những gì bạn thấy đầu ra; có lẽ bạn nghĩ rằng đầu ra đề cập đến một con trỏ, nhưng nó chỉ là một biểu diễn văn bản của đối tượng. Bạn có thể thay đổi nó bằng cách ghi đè phương thức thể hiện to_s cho bất kỳ lớp nào.

15

Bạn không làm gì sai. Giả sử bạn thấy một cái gì đó như #<Adder:0xb7f9f710 @my_num=12> thì trong Ruby đây chỉ là đại diện mặc định của đối tượng mà bạn đã tạo.

Nếu bạn muốn thay đổi hành vi này trở nên thân thiện hơn khi bạn chuyển đối tượng của mình đến puts, bạn có thể ghi đè phương thức to_s (thành chuỗi). ví dụ.

class Adder 
    def initialize(my_num) 
    @my_num = my_num 
    end 

    def to_s 
    "Adder with my_num = #{@my_num}" 
    end 
end 

sau đó khi bạn làm puts y bạn sẽ thấy Adder with my_num = 12

Bạn cũng có thể ghi đè lên các phương pháp inspect đó là những gì được sử dụng, ví dụ, khi Ruby console IRB in các đại diện của đối tượng của bạn ví dụ

class Adder 
    def inspect 
    to_s # return same representation as to_s 
    end 
end 

sau đó trong IRB:

>> y = Adder.new 12 
=> Adder with my_num = 12 
Các vấn đề liên quan