Gần đây tôi đã phát hiện ra các khối và tính năng năng suất của Ruby, và tôi tự hỏi: điều này phù hợp với lý thuyết khoa học máy tính ở đâu? Nó là một kỹ thuật lập trình chức năng, hay một cái gì đó cụ thể hơn?Tính năng năng suất của Ruby liên quan đến khoa học máy tính
Trả lời
Ruby's yield
không phải là một trình lặp như trong C# và Python. yield
chính nó thực sự là một khái niệm thực sự đơn giản khi bạn hiểu cách khối hoạt động trong Ruby.
Có, các khối là một tính năng lập trình chức năng, mặc dù Ruby không đúng ngôn ngữ chức năng. Trong thực tế, Ruby sử dụng phương thức lambda
để tạo các đối tượng khối, được vay mượn từ cú pháp của Lisp để tạo các hàm ẩn danh - đó là những khối là gì. Từ quan điểm khoa học máy tính, các khối của Ruby (và các hàm lambda của Lisp) là closures.Trong Ruby, các phương thức thường chỉ mất một khối. (Bạn có thể vượt qua nhiều hơn, nhưng nó vụng về.)
Từ khóa yield
trong Ruby chỉ là cách gọi một khối được gán cho phương thức. Hai ví dụ này tương đương:
def with_log
output = yield # We're calling our block here with yield
puts "Returned value is #{output}"
end
def with_log(&stuff_to_do) # the & tells Ruby to convert into
# an object without calling lambda
output = stuff_to_do.call # We're explicitly calling the block here
puts "Returned value is #{output}"
end
Trong trường hợp đầu tiên, chúng tôi giả định có một khối và gọi để gọi. Mặt khác, Ruby kết thúc khối trong một đối tượng và chuyển nó thành một đối số. Việc đầu tiên là hiệu quả hơn và dễ đọc, nhưng chúng có hiệu quả giống nhau. Bạn muốn gọi một trong hai như thế này:
with_log do
a = 5
other_num = gets.to_i
@my_var = a + other_num
end
Và nó sẽ in ra giá trị mà vết thương lên bị gán cho @my_var
. (OK, do đó, đó là một chức năng hoàn toàn ngu ngốc, nhưng tôi nghĩ bạn có ý tưởng.)
Các khối được sử dụng cho rất nhiều thứ trong Ruby. Hầu hết mọi nơi bạn sử dụng một vòng lặp trong một ngôn ngữ như Java, nó được thay thế bằng Ruby bằng các phương thức có khối. Ví dụ:
[1,2,3].each {|value| print value} # prints "123"
[1,2,3].map {|value| 2**value} # returns [2, 4, 8]
[1,2,3].reject {|value| value % 2 == 0} # returns [1, 3]
Như Andrew lưu ý, nó cũng thường được sử dụng để mở tệp và nhiều địa điểm khác. Về cơ bản bất cứ lúc nào bạn có một chức năng tiêu chuẩn có thể sử dụng một số logic tùy chỉnh (như sắp xếp một mảng hoặc xử lý một tệp), bạn sẽ sử dụng một khối. Có những cách sử dụng khác nữa, nhưng câu trả lời này đã quá lâu rồi tôi sợ nó sẽ gây ra cơn đau tim cho độc giả với những hiến pháp yếu hơn. Hy vọng rằng điều này sẽ làm sáng tỏ sự nhầm lẫn về chủ đề này.
Tôi nghĩ câu lệnh yield
bắt nguồn từ ngôn ngữ CLU. Tôi luôn tự hỏi liệu nhân vật từ Tron có được đặt tên sau CLU không ....
Để áp phích gốc: apropros của câu trả lời của Daniel, bạn có thể muốn google cho "coroutine" - đây là khái niệm "khoa học máy tính" cơ sở mà CLU đã triển khai sử dụng lợi nhuận. – itowlson
Tôi nghĩ 'coroutine' là từ khóa bạn đang tìm kiếm.
Ví dụ: http://en.wikipedia.org/wiki/Yield
Năng suất trong máy tính và thông tin khoa học:
- trong khoa học máy tính, một điểm lợi nhuận (và tái nhập cảnh) của một coroutine
Tín dụng cũng để @ itowlson, người đồng thời đề cập đến 'coroutine' trong một bình luận về câu trả lời khác. – Brian
Việc sử dụng từ khóa lợi nhuận trong Ruby không liên quan gì đến định nghĩa CS thông thường về lợi nhuận. Nó chỉ là một cuộc gọi chương trình con. Thật vậy, bạn chỉ có thể sử dụng cuộc gọi thay vì lợi nhuận, nếu bạn gán khối ẩn danh cho một biến. –
Đây không phải là cách sử dụng trong Ruby. – Chuck
Có nhiều đến năng suất và khối so với chỉ looping .
Loạt Enumerating enumerable có một loạt những điều bạn có thể làm với liệt kê, chẳng hạn như hỏi xem câu lệnh có đúng với bất kỳ thành viên nào của nhóm hay không. một điều kiện nhất định.
Các khối cũng hữu ích cho phạm vi biến. Thay vì chỉ đơn giản là thuận tiện, nó có thể giúp với thiết kế tốt. Ví dụ: mã
File.open("filename", "w") do |f|
f.puts "text"
end
đảm bảo rằng luồng tệp được đóng khi bạn kết thúc, ngay cả khi ngoại lệ xảy ra và biến nằm ngoài phạm vi khi bạn đã hoàn thành.
Một google bình thường không đưa ra một bài đăng trên blog tốt về các khối và sản lượng bằng ruby. Tôi không biết tại sao.
Response to comment:
tôi nghi ngờ nó được đóng cửa vì kết thúc khối, không phải vì biến đi ra khỏi phạm vi.
Sự hiểu biết của tôi là không có gì đặc biệt xảy ra khi biến cuối cùng trỏ đến một đối tượng nằm ngoài phạm vi, ngoài đối tượng đó đủ điều kiện để thu thập rác. Tôi không biết làm thế nào để xác nhận điều này, mặc dù.
Tôi có thể cho thấy rằng đối tượng tệp bị đóng trước khi bị thu thập rác, thường không xảy ra ngay lập tức. Trong ví dụ sau, bạn có thể thấy rằng một đối tượng tệp được đóng trong câu lệnh puts
thứ hai, nhưng nó chưa được thu thập rác.
g = nil
File.open("/dev/null") do |f|
puts f.inspect # #<File:/dev/null>
puts f.object_id # Some number like 70233884832420
g = f
end
puts g.inspect # #<File:/dev/null (closed)>
puts g.object_id # The exact same number as the one printed out above,
# indicating that g points to the exact same object that f pointed to
- 1. Vật lý trong Khoa học máy tính
- 2. Độ chính xác của GPU cho máy tính khoa học
- 3. Lưu trữ web Python: Numpy, Matplotlib, Máy tính khoa học
- 4. Bài phát biểu khoa học máy tính tuyệt vời
- 5. Cách thiết kế các tính năng cho máy học
- 6. Qt và Visual Studio dành cho máy tính khoa học
- 7. Tại sao số Fibonacci có ý nghĩa quan trọng trong khoa học máy tính?
- 8. Từ nhà khoa học máy tính đến kỹ sư phần mềm
- 9. Cuốn sách tin sinh học tốt nhất cho một nhà khoa học máy tính là gì?
- 10. Sự khác biệt giữa lựa chọn tính năng, trích xuất tính năng, trọng số tính năng
- 11. Tính năng hiểu lambda/năng suất/máy phát điện này hoạt động như thế nào?
- 12. Tìm tính năng của tính năng trong lisp phổ biến
- 13. thu hoạch sức mạnh của máy tính cao song song với trăn đang khoa học
- 14. Tính toán các tính năng của HOG
- 15. Điều này được gọi là gì trong khoa học máy tính?
- 16. Tính năng nào của Lisp có trong Ruby?
- 17. Thứ tự các tính năng trong các vectơ tính năng LibSVM có quan trọng không?
- 18. Kho lưu trữ bài viết Khoa học Máy tính Trực tuyến?
- 19. android ndk vs sdk - nếu các tính năng có liên quan
- 20. Tạo lưới cho khoa học tính toán bằng Python
- 21. Máy tính Eulers Chức năng hoàn hảo
- 22. Tính năng gốc của Square?
- 23. Các tính năng ẩn của Clojure
- 24. Tính năng Luôn bật trên Máy ứng dụng của Google
- 25. Máy tính hiệu suất cao Python
- 26. Cách bật tính năng nén GZip trong máy chủ XAMPP
- 27. Tại sao tính năng Stopwatch.Frequency của tôi quá thấp?
- 28. Các tính năng ẩn của Vim
- 29. Máy tính khoa học bằng Python cho các lập trình viên MATLAB
- 30. javascript Math.cos hiển thị câu trả lời khác so với máy tính khoa học
Giải thích hay. –
Cảm ơn, điều đó có ý nghĩa hơn rất nhiều, và nó gắn kết nhiều hơn với những gì tôi đã học được cho đến nay về các khối. – hbw
Cảm ơn. Điều đó đã giúp. – jjohn