Tôi mới sử dụng Ruby, có cách nào để các giá trị yield
từ các chức năng của Ruby không? Nếu có, làm thế nào? Nếu không, lựa chọn của tôi để viết mã lười là gì?Có cái gì đó giống như máy phát điện Python trong Ruby?
Trả lời
Từ khóa yield
của Ruby là một thứ rất khác với từ khóa Python có cùng tên, do đó đừng nhầm lẫn với từ khóa đó. Từ khóa yield
của Ruby là cú pháp đường để gọi một khối liên kết với một phương thức.
Điểm tương đương gần nhất là lớp Enumerator của Ruby. Ví dụ, tương đương với Python:
def eternal_sequence():
i = 0
while True:
yield i
i += 1
là thế này:
def eternal_sequence
Enumerator.new do |enum|
i = 0
while true
enum.yield i # <- Notice that this is the yield method of the enumerator, not the yield keyword
i +=1
end
end
end
Bạn cũng có thể tạo điều tra viên cho các phương pháp liệt kê hiện có với enum_for
. Ví dụ: ('a'..'z').enum_for(:each_with_index)
cung cấp cho bạn một điều tra các chữ thường cùng với vị trí của chúng trong bảng chữ cái. Bạn nhận được điều này miễn phí với các phương pháp Enumerable tiêu chuẩn như each_with_index
trong 1.9, vì vậy bạn chỉ có thể viết ('a'..'z').each_with_index
để có được điều tra viên.
Tôi đã nhìn thấy Fibers sử dụng theo cách đó, hãy xem xét một ví dụ từ this article:
fib = Fiber.new do
x, y = 0, 1
loop do
Fiber.yield y
x,y = y,x+y
end
end
20.times { puts fib.resume }
Thực tế, trong phần tử' Enumerator' được thực hiện bằng cách sử dụng 'Fiber'. Đó là một trong những lý do chính để thêm chúng vào thực tế, bởi vì trong Ruby 1.8 'Enumerator' s sử dụng sự tiếp tục, nhưng đó là a) khá khó sử dụng và b) tại thời điểm đó, các phần tiếp theo sẽ bị loại bỏ khỏi ngôn ngữ Ruby. –
Nếu bạn đang tìm kiếm để lười biếng tạo ra giá trị, @ câu trả lời của Chuck là điều đúng.
Nếu bạn đang tìm cách lười biếng lặp lại trên một bộ sưu tập, Ruby 2.0 đã giới thiệu bộ đếm số .lazy
mới.
range = 1..Float::INFINITY
puts range.map { |x| x+1 }.first(10) # infinite loop
puts range.lazy.map { |x| x+1 }.first(10) # [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
- 1. Có cái gì đó giống như Python 'với' trong C#?
- 2. Ruby có một cái gì đó giống như sự hiểu biết danh sách của Python?
- 3. MATLAB Có một cái gì đó giống như danh sách hiểu như nó là trong python?
- 4. Máy phát điện Ruby và máy phát Python
- 5. Có cái gì đó giống như `last` cho` map`?
- 6. Có cái gì đó giống như WMI cho Linux?
- 7. Có cái gì đó giống như Incanter cho Haskell?
- 8. Có điều gì đó giống như bpython cho Ruby không?
- 9. Scala/java có một cái gì đó giống như StringIO từ python?
- 10. Có một cái gì đó giống như Sprocket tồn tại cho Java
- 11. Python: Một cái gì đó giống như `bản đồ` hoạt động trên các chủ đề
- 12. Do regexes Python hỗ trợ một cái gì đó giống như của Perl \ G?
- 13. Bất cứ ai cũng biết một cái gì đó giống như RSPec cho PHP?
- 14. là có cái gì đó giống như isset của php trong javascript/jQuery?
- 15. Có cái gì đó giống như strall Linux ptrace trong Windows?
- 16. Gson có một cái gì đó giống như @JsonProperty cho phương pháp?
- 17. Có điều gì đó giống như find_if trong Java không?
- 18. Một cái gì đó như tăng :: multi_index cho Python
- 19. Có điều gì đó giống như TimeSpan trong phát triển Android không?
- 20. Điều gì ngăn cản một ngôn ngữ được đánh máy tĩnh có một cái gì đó giống như method_missing của Ruby?
- 21. Máy phát điện đảo ngược Python
- 22. Có điều gì đó giống như Codecademy cho Java
- 23. Tìm kiếm một cái gì đó giống như của JUnit @Before/@After trong MUnit
- 24. Có cái gì đó giống như IIS 6.0 Resource Kit Tools cho IIS 7?
- 25. Liệu Perl có một cái gì đó giống như Java/PHP Docs?
- 26. Có điều gì đó giống như __LINE__ trong Verilog không?
- 27. Liệu python có một cái gì đó giống như C++ 's bằng cách sử dụng từ khóa?
- 28. Có gì giống như Java Quartz trong ruby không?
- 29. là gì lệnh p4 tương đương với một cái gì đó giống như tình trạng svn
- 30. Một cái gì đó giống như một chức năng/phương pháp trong các tập tin batch?
'0.step' là một liệt kê vĩnh cửu kể từ 1.9 – steenslag