2010-02-19 35 views
5

Ai đó có thể giúp tôi hiểu được những điều sau đây không? Tôi có đoạn code sau trong test.rb:Phương pháp được khai báo bên ngoài lớp được bao gồm tự động?

class Dog 
end 
// bark is declared outside of Dog class 
def bark 
    puts 'Woof!' 
end 

sau đó trong IRB:

>> source 'test.rb' 
>> a = Dog.new 
=> #<Dog:0x117f614> 
>> a.bark 
Woof! 
=> nil 

Tại sao phương pháp bark tồn tại trong Chó dụ mặc dù nó được khai báo bên ngoài của lớp? Bởi vì nó trong cùng một tập tin? Cảm ơn!

Trả lời

3

Khi bạn tạo một phương pháp trong phạm vi "toàn cầu" (bên ngoài của bất kỳ lớp học), phương pháp đó được thực hiện một phương pháp riêng của đối tượng:

#!/usr/bin/ruby1.8 

class Dog 
end 

p Object.respond_to?(:bark, true)  # => false 

def bark 
    puts "Woof!" 
end 

p Object.respond_to?(:bark, true)  # => true 

Object là trong chuỗi tổ tiên của tất cả các đối tượng, bao gồm Chó:

dog = Dog.new 
p dog.class.name    # => "Dog" 
p dog.class.superclass.name # => "Object" 

Vì vậy, chó (và tất cả các đối tượng) bây giờ biết cách sủa. Tuy nhiên, phương pháp là tư nhân, bạn sẽ phải sử dụng instance_eval gọi nó với một máy thu rõ ràng:

dog.instance_eval { bark } # => "Woof!" 

Hoặc bạn có thể gọi nó với một máy thu ngầm không có thể dục dụng cụ cần thiết:

bar # => "Woof!" 
+0

Nó có ý nghĩa, cảm ơn !! – penger

1

Ví dụ chính xác của bạn không hoạt động trong Ruby 1.9. (Ngoài các cú pháp bình luận xấu.)

Tuy nhiên, tuyên bố một phương pháp trong phạm vi cấp cao nhất sẽ làm cho nó một phương pháp riêng trên Object, rõ ràng:

>> Object.private_methods.include? :bark 
=> true 

Có lẽ trong Ruby của bạn, (1,8?) đây là một phương pháp công cộng?

+0

Đó là không công khai trong 1,8 hoặc. Tôi không biết tại sao mã OP không phàn nàn "vỏ phương thức riêng được gọi là ...". Nó có một cái gì đó để làm với dòng "nguồn" irb. Tôi không biết điều đó khác gì so với "yêu cầu". –

+0

(Trong 1.8.7) điều này có vẻ đúng - nếu tôi yêu cầu thay vì nguồn, tôi thực sự nhận được lỗi đó. Nguồn có lẽ giống như nội trang Bash, bao gồm nội dung của tệp như thể nó đã được nhập - do đó một phương thức riêng tư sẽ có thể truy cập được. – Shadowfirebird

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