Trong mã này, tôi tạo ra một mảng của chuỗi "1" đến "10000":Tương đương với Ruby Enumerable.collect trả về một Enumerable?
array_of_strings = (1..10000).collect {|i| String(i)}
Liệu API của Ruby cốt lõi cung cấp một cách để có được một đối tượng đếm được cho phép tôi liệt kê trong danh sách tương tự, tạo ra giá trị chuỗi theo yêu cầu, thay vì tạo ra một mảng các chuỗi?
Dưới đây là một ví dụ nữa mà hy vọng làm rõ những gì tôi đang cố gắng để làm:
def find_me_an_awesome_username
awesome_names = (1..1000000).xform {|i| "hacker_" + String(i) }
awesome_names.find {|n| not stackoverflow.userexists(n) }
end
đâu xform
là phương pháp tôi đang tìm kiếm. awesome_names là một số, do đó, xform
không phải tạo chuỗi chuỗi 1 triệu phần tử, mà chỉ tạo và trả về các chuỗi có dạng "hacker_ [N]" theo yêu cầu.
Bằng cách này, đây là những gì nó có thể trông giống như trong C#:
var awesomeNames = from i in Range(1, 1000000) select "hacker_" + i;
var name = awesomeNames.First((n) => !stackoverflow.UserExists(n));
(Một Solution)
Dưới đây là một phần mở rộng cho Enumerator có thêm một phương pháp xform. Nó trả về một điều tra viên khác lặp lại các giá trị của điều tra ban đầu, với một biến đổi được áp dụng cho nó.
class Enumerator
def xform(&block)
Enumerator.new do |yielder|
self.each do |val|
yielder.yield block.call(val)
end
end
end
end
# this prints out even numbers from 2 to 10:
(1..10).each.xform {|i| i*2}.each {|i| puts i}
... nên đọc '2-20' – mackenir