Ruby có khối; Python thì không.
Python có chức năng; Ruby thì không. Trong Python, bạn có thể lấy bất kỳ hàm hoặc phương thức nào và chuyển nó sang một hàm khác. Trong Ruby, mọi thứ đều là một phương thức và các phương thức không thể được truyền trực tiếp. Thay vào đó, bạn phải bọc chúng trong Proc để vượt qua chúng.
Cả Ruby và Python đều hỗ trợ các bao đóng, nhưng theo những cách khác nhau. Trong Python, bạn có thể định nghĩa một hàm bên trong một hàm khác. Hàm bên trong có quyền truy cập đọc vào các biến từ hàm ngoài, nhưng không truy cập ghi. Trong Ruby, bạn xác định các bao đóng bằng các khối. Các bao đóng có quyền truy cập đọc và ghi đầy đủ vào các biến từ phạm vi bên ngoài.
Python có danh sách hiểu, đó là biểu cảm khá. Ví dụ: nếu bạn có một danh sách các số, bạn có thể viết
[x*x for x in values if x > 15]
để có danh sách mới về bình phương của tất cả các giá trị lớn hơn 15. Trong Ruby, bạn phải viết như sau:
values.select {|v| v > 15}.map {|v| v * v}
Mã Ruby không cảm thấy nhỏ gọn. Nó cũng không hiệu quả vì lần đầu tiên nó chuyển đổi các mảng giá trị thành một mảng trung gian ngắn hơn chứa các giá trị lớn hơn 15. Sau đó, nó lấy mảng trung gian và tạo ra một mảng cuối cùng chứa các bình phương của các trung gian. Các mảng trung gian sau đó được ném ra. Vì vậy, Ruby kết thúc với 3 mảng trong bộ nhớ trong quá trình tính toán; Python chỉ cần danh sách đầu vào và danh sách kết quả.
Python cũng cung cấp sự hiểu biết bản đồ tương tự.
Python hỗ trợ bộ dữ liệu; Ruby thì không. Trong Ruby, bạn phải sử dụng các mảng để mô phỏng các bộ dữ liệu.
Ruby hỗ trợ báo cáo chuyển đổi / trường hợp; Python thì không.
Ruby hỗ trợ expr ? val1 : val2
toán tử ternary tiêu chuẩn ; Python thì không.
Ruby chỉ hỗ trợ kế thừa duy nhất. Nếu bạn cần bắt chước nhiều kế thừa, bạn có thể định nghĩa các mô-đun và sử dụng các hỗn hợp để kéo các phương thức mô-đun vào các lớp. Python hỗ trợ nhiều kế thừa thay vì trộn lẫn mô-đun.
Python chỉ hỗ trợ các hàm lambda một dòng. Các khối Ruby, là loại / loại hàm lambda, có thể lớn tùy ý. Do đó, mã Ruby thường được viết theo kiểu nhiều chức năng hơn mã Python. Ví dụ: để lặp qua một danh sách trong Ruby, bạn thường làm
collection.each do |value|
...
end
Các khối hoạt động rất giống như một chức năng được truyền đến collection.each
. Nếu bạn đã làm điều tương tự trong Python, bạn phải xác định hàm bên trong có tên và sau đó chuyển nó vào bộ sưu tập mỗi phương thức (nếu danh sách hỗ trợ phương thức này):
def some_operation(value):
...
collection.each(some_operation)
Điều đó không chảy rất độc đáo. Vì vậy, thông thường, cách tiếp cận phi chức năng sau đây sẽ được sử dụng trong Python:
for value in collection:
...
Sử dụng tài nguyên một cách an toàn là khá khác nhau giữa hai ngôn ngữ. Ở đây, vấn đề là bạn muốn phân bổ một số tài nguyên (mở tệp, lấy con trỏ cơ sở dữ liệu, v.v.), thực hiện một số thao tác tùy ý trên nó, sau đó đóng nó một cách an toàn ngay cả khi xảy ra ngoại lệ.
Trong Ruby, vì các khối rất dễ sử dụng (xem # 9), bạn thường mã hóa mẫu này như một phương thức lấy một khối để hoạt động tùy ý thực hiện trên tài nguyên.
Trong Python, truyền vào một hàm cho hành động tùy ý là một chút vụng về vì bạn phải viết một hàm bên trong có tên (xem # 9). Thay vào đó, Python sử dụng một with
câu lệnh để xử lý tài nguyên an toàn. Xem Làm thế nào để tôi dọn sạch chính xác một đối tượng Python? để biết thêm chi tiết.