Làm cách nào để xác định một phương thức trên một dòng trong Ruby?


92

Có phải def greet; puts "hello"; endcách duy nhất để định nghĩa một phương thức trên một dòng trong Ruby không?


11
Như bạn có thể thấy từ các câu trả lời, có thể xác định một phương pháp theo nhiều cách khác nhau trên một dòng, nhưng câu hỏi đặt ra là bạn có nên không? Bất kỳ định nghĩa nào cũng nên được viết theo cách rõ ràng và sạch sẽ vì lý do bảo trì và dễ đọc, vì vậy nếu một dòng đơn trở nên khó sử dụng hoặc khó hiểu thì hãy tản ra. Một số ngôn ngữ dường như khuyến khích viết mã ngắn gọn như một cách để trở nên chăm chỉ về mã, nhưng phong cách mã hóa Ruby khuyến khích sự sang trọng, dễ đọc và khả năng bảo trì hơn tính hiếu học. Hoàn thành ba đầu tiên và chúng tôi sẽ cúi đầu trước bạn.
the Tin Man,

Câu trả lời:



73

Chỉ cần đưa ra câu trả lời mới đầy đủ:

Nói chung tránh các phương pháp dòng đơn. Mặc dù chúng hơi phổ biến trong tự nhiên, nhưng có một vài điểm đặc biệt về cú pháp định nghĩa của chúng khiến việc sử dụng chúng không được mong muốn. Ở bất kỳ tỷ lệ nào - không được có nhiều hơn một biểu thức trong một phương thức một dòng .

# bad
def too_much; something; something_else; end

# okish - notice that the first ; is required
def no_braces_method; body end

# okish - notice that the second ; is optional
def no_braces_method; body; end

# okish - valid syntax, but no ; make it kind of hard to read
def some_method() body end

# good
def some_method
  body
end

Một ngoại lệ đối với quy tắc là các phương thức rỗng.

# good
def no_op; end

Từ bbatsov / ruby-style-guide .


39
def add a,b; a+b end

Dấu chấm phẩy là dấu chấm dứt câu lệnh nội tuyến cho Ruby

Hoặc bạn có thể sử dụng define_methodphương pháp. (Chỉnh sửa: Cái này không được dùng nữa trong ruby ​​1.9)

define_method(:add) {|a,b| a+b }

4
Dường như không còn được chấp nhận trong Ruby 2+
michau,

9

Cách khác:

define_method(:greet) { puts 'hello' }

Có thể được sử dụng nếu bạn không muốn nhập phạm vi mới cho phương thức trong khi xác định nó.


NoMethodError: phương pháp tư nhân 'define_method' kêu gọi đối tượng: Lớp trong Ruby 1.9.3
Jared

3
define_methodđã được "tư nhân hóa" trong Ruby 1.9
edgerunner

8

Tuy nhiên, một cách khác:

def greet() return 'Hello' end

12
Trong Ruby, giá trị trả về của một phương thức là giá trị được trả về bởi câu lệnh cuối cùng. Bạn không cần returnở đây vì nó không phải là điều khoản bảo vệ.
Damien

1
Được ủng hộ bởi vì, mặc dù nó không cần thiết , nó returncó thể thêm khả năng đọc cho những người ít thông thạo (hoặc quen thuộc với) Ruby. Đó là một trong những thứ YMMV ...
Potherca
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.