Thời gian duy nhất vấn đề trật tự phương pháp là trong mã hoàn toàn thủ tục, và đó thường là thiển cận, đưa hai phương pháp:
def greet
puts "%s, Dave" % random_greeting
end
# If I try to use `greet` here, it'll raise a NoMethodError
def random_greeting
["Hello", "Bonjour", "Hallo"].sample
end
# I can use `greet` here, because `random_greeting` is now defiend
này sẽ làm việc ok, trừ khi bạn muốn sử dụng greet
trước random_greeting
được định nghĩa, cách mà tất cả các mã không tầm thường giải quyết này là để bọc hành vi trong một lớp học:
class Doorman
def greet
puts "%s, Dave" % random_greeting
end
def random_greeting
["Hello", "Bonjour", "Hallo"].sample
end
end
Doorman.new.greet
một sau đó có thể chào đón khách của một người với Doorman.new.greet
, bằng cách gói hành vi trong một lớp học người ta có thể mô hình ứng dụng Bett er (có thể là các đối tượng khác nhau trong mã số Hotel của bạn cung cấp các lời chào khác nhau, ví dụ) và nó cũng giữ cho không gian tên main
sạch sẽ.
Đối tượng main
trong Ruby đã có 114 phương thức được xác định trên nó, vì vậy tốt hơn nên đặt các phương thức của riêng bạn vào các lớp đại diện cho các tác nhân hoặc đối tượng trong mô hình dự án của bạn.
Tiếp tục với những gì bạn nói trong câu hỏi về trong khởi tạo của một lớp, điều này là hoàn toàn có thể:
class Doorman
def initialize
puts "%s, I'm a new Doorman instance" & random_greeting
end
def greet
"%s, Dave" % random_greeting
end
def random_greeting
["Hello", "Bonjour", "Hallo"].sample
end
end
Mặc dù phương pháp random_greeting
không được định nghĩa khi chúng ta viết initailize
, cả lớp được xác định trước khi initialize
được gọi. Một lần nữa, bằng cách gói các lớp học, điều này làm cho cuộc sống dễ dàng hơn, sạch hơn và có nghĩa là mọi thứ ở lại encapsulated.
Lưu ý không làm việc ví dụ có thể được rèn vào mã làm việc bằng cách thêm một 'BEGIN' tuyên bố: 'BEGIN {def myfunction2; đặt "trong 2"; kết thúc} '. – steenslag
@steenslag Một cách tiếp cận tốt hơn nữa là thêm câu lệnh 'END':' END {myfunction} '. –