2010-10-27 11 views
6

Hôm nay tôi đi qua các cú pháp ruby ​​lạ trong lớp Rational:của Ruby câu hỏi cú pháp: Rational (a, b) và Rational.new (a, b)

Rational(a,b) 

(Chú ý sự vắng mặt của .new() so với cú pháp Ruby bình thường). Điều này có nghĩa là gì, chính xác, so với cú pháp bình thường new? Quan trọng hơn, làm thế nào để tôi thực hiện một cái gì đó như thế này trong mã của riêng tôi, và tại sao tôi sẽ thực hiện một cái gì đó như thế này? Cụ thể đối với lớp Rational, tại sao cú pháp này được sử dụng thay vì việc khởi tạo bình thường? Và tại sao phương pháp new là riêng tư trong lớp hợp lý? (Và làm thế nào/tại sao tôi sẽ làm điều này trong mã ruby ​​của riêng tôi?) Cảm ơn trước cho câu trả lời của bạn, đặc biệt là kể từ khi tôi đã hỏi rất nhiều câu hỏi.

Trả lời

6

Tất cả những gì bạn phải làm là khai báo hàm toàn cục có cùng tên với lớp của bạn. Và đó là những gì rational.rb làm:

def Rational(a, b = 1) 
    if a.kind_of?(Rational) && b == 1 
    a 
    else 
    Rational.reduce(a, b) 
    end 
end 

để làm cho tin constructor:

private :initialize 

và tương tự đối với phương pháp new:

private_class_method :new 

Tôi cho rằng Rational.new có thể được giữ công cộng và được thực hiện để làm những gì Rational() thực hiện, nhưng có phương pháp chuyển đối số của nó thành các phiên bản phù hợp với Array(), String(), vv Đó là một mô hình quen thuộc dễ thực hiện và dễ hiểu.

3

Phương thức Rational() thực sự là một phương pháp thể hiện được xác định bên ngoài của lớp Rational. Do đó, nó trở thành một phương thức thể hiện của bất kỳ đối tượng nào tải thư viện 'hợp lý' (thường là chính: Object) theo cùng cách mà 'đặt' làm, ví dụ.

Theo quy ước, phương pháp này thường là một hàm tạo cho lớp có cùng tên.

+0

đây là một bổ sung rất quan trọng đối với câu trả lời của @Wayne Conrad. Cảm ơn các đầu vào. –

+0

Thật vậy. Tôi đã thay đổi "chức năng" thành "chức năng toàn cầu", hy vọng điều đó làm cho câu trả lời của tôi rõ ràng hơn. –