Tôi có một vài câu hỏi về phương pháp, thủ tục và khối của Ruby khiến tôi khá kỳ quặc. Chúng không quá nhiều về cú pháp hay hàm như logic đằng sau các quyết định được đưa ra.Phương pháp Ruby, Proc và sự nhầm lẫn khối
Câu hỏi 1:
Tại sao nó rằng khối có thể được truyền cho phương pháp (ví dụ mỗi) nhưng họ không thể được gán cho một biến?
Tôi biết bạn có thể chuyển chúng xung quanh trong các thủ tục, ví dụ: p = Proc.new {...}
(truy cập với &p
), nhưng không có ý nghĩa nhiều khi làm cho lập trình viên trải qua các phương tiện này.
Câu hỏi 2:
Tại sao lại có sự khác biệt giữa các phương pháp và thủ tục?
Ví dụ, tôi có thể hoàn thành nhiệm vụ xác định một hàm và gọi hàm trong hai cách sau:
def square(x)
x**2
end
square(3)
=> 9
hoặc
square = lambda {|x| x**2}
square.call(3)
=> 9
Tại sao sự khác biệt? Trong Python ví dụ, cả hai định nghĩa một hàm theo cách tiêu chuẩn và bởi square = lambda x: x**2
thực hiện cùng một nhiệm vụ tạo hàm và gán nó cho square
.
Ruby tuyên bố mọi thứ đều là một đối tượng. Các khối phải là các đối tượng để phù hợp với điều đó và chúng có thể được chuyển thành các đối số, vì vậy chúng chắc chắn hoạt động giống như các đối tượng theo một số cách. – rpjohnst
Các khối có thể được thực hiện để hoạt động như các đối tượng thông qua việc tạo ra một đối tượng đại diện cho chúng, một proc hoặc một lambda. Không có thiết bị đó, chúng chỉ là cấu trúc cú pháp. – Pinochle
Có các đối tượng khối - đó là mục đích của lambda {bất cứ điều gì}. – Chuck