2010-07-28 32 views
19

Có thể khai báo các phương thức tĩnh trong một mô-đun bằng ruby ​​không?Phương pháp tĩnh trong mô-đun ruby?

module Software 
    def self.exit 
    puts "exited" 
    end 
end 

class Windows 
    include Software 

    def self.start 
    puts "started" 
    self.exit 
    end 
end 

Windows.start 

Ví dụ trên sẽ không in "thoát".

Chỉ có thể có các phương pháp thể hiện trong mô-đun?

Trả lời

29

Xác định mô-đun của bạn như thế này (tức là làm cho exit một phương pháp dụ trong module):

module Software 
    def exit 
    puts "exited" 
    end 
end 

và sau đó sử dụng extend hơn include

class Windows 
    extend Software 
    # your self.start method as in the question 
end 

Trong sử dụng:

irb(main):016:0> Windows.start 
started 
exited 
=> nil 

Ví dụ planation

obj.extend(module, ...) thêm vào obj các phương pháp dụ từ mỗi mô-đun được coi là một tham số

... do đó, khi được sử dụng trong bối cảnh của một định nghĩa lớp (với lớp chính nó như là người nhận) các phương thức trở thành phương thức lớp.

0

Nó có thể bao gồm các phương pháp tĩnh trong một module:

module Software 

    def self.exit 
    puts "exited" 

    end 
end 

Software.exit 

Chạy in này 'thoát' như mong đợi.

+0

nhưng tôi có phải đưa mô-đun này vào trong lớp để sử dụng phương pháp tĩnh không? nguyên nhân bao gồm không chỉ bao gồm các phương pháp ví dụ từ một mô-đun không tĩnh? –

+0

Ah, không chắc chắn về điều đó. Một sửa chữa dễ dàng sẽ chỉ là gọi 'Software.exit' bên trong lớp Windows và loại bỏ phần 'include Software' (không phải là bản sửa lỗi trang nhã nhất, nhưng nằm ngoài phạm vi của câu hỏi này hiện đang được đặt ra). –

2

Hai điều cần phải thay đổi để có thể gọi Windows.exit:

  1. Software#exit cần phải là một phương pháp dụ
  2. Windows nhu cầu để extendSoftware, không include nó.

Điều này là do extend ing mô-đun khác đặt phương pháp dụ của mô-đun như lớp phương pháp module hiện tại, trong khi include ing một mô-đun đặt các phương pháp như phương pháp thể hiện mới.

module Software 
    def exit 
     puts "exited" 
    end 
end 

class Windows 
    extend Software 

    def self.start 
     puts "started" 
     self.exit 
    end 

end 

Windows.start 

Output là:

 
started 
exited 
12

Đặt phương pháp lớp học của bạn trong một module lồng nhau, và sau đó ghi đè lên "bao gồm" móc. Móc này được gọi là bất cứ lúc nào module của bạn được bao gồm.Bên trong móc, thêm các phương thức lớp để bất cứ ai đã bao gồm:

module Foo 

    def self.included(o) 
    o.extend(ClassMethods) 
    end 

    module ClassMethods 

    def foo 
     'foo' 
    end 

    end 

end 

Bây giờ bất kỳ lớp bao gồm Foo được một phương pháp học mang tên foo:

class MyClass 
    include Foo 
end 

p MyClass.foo # "foo" 

Bất kỳ phương pháp phi lớp có thể được định nghĩa trong Foo như thường lệ.

+0

(bên cạnh: đó là MyClass.foo) Cách tiếp cận này có lợi thế, bạn cũng có thể thêm các hàm không tĩnh. – Baju

+0

@Baju, hoặc '::' hoặc '.' hoạt động ở đó, nhưng tôi cho rằng' .' được ưu tiên. Tôi đã chỉnh sửa ví dụ. Cảm ơn bạn đã chỉ ra điều đó. –

+0

-1. Yuck, điều này là hoàn toàn không cần thiết. Chỉ cần sử dụng 'extend' thay vì' include'. –

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