2015-05-04 12 views
6

Tôi đã thử nghiệm với Nim trong khoảng một ngày và tôi đã tự hỏi làm thế nào bạn có thể tạo ra một kiểu kế thừa từ nội trang (seq) để các thủ tục hoạt động trên seq cũng có thể xử lý tùy chỉnh kiểu.Kế thừa các chuỗi trong Nim

tôi đã bao gồm một ví dụ nhỏ dưới đây, trong đó một kết thúc tốt đẹp TestCol/proxy một chuỗi - sẽ có thể là một cách để có TestCol hỗ trợ map, filter, vv mà không cần xác định lại các thủ tục?

type 
    TestCol*[T] = object 
    data*: seq[T] 

proc len*(b: TestCol): int = b.data.len 

proc `[]`*[T](b: TestCol[T], idx: int): T = 
    b.data[idx] 

proc `[]=`*[T](b: var TestCol[T], idx: int, item: T) = 
    b.data[idx] = item 

var x = newSeq[int](3) 
var y = TestCol[int](data: x) 

y[0] = 1 
y[1] = 2 
y[2] = 3 

for n in map(y, proc (x: int): int = x + 1): 
    echo($n) 

Được ưu tiên là giải pháp sẽ không yêu cầu chuyển chuỗi tùy chỉnh cho một chuỗi bình thường vì lý do hiệu suất với biến đổi ít tầm thường hơn ở trên (mặc dù đó là những gì tôi sẽ làm cho bây giờ như def- gợi ý)

trường hợp sử dụng thế giới thực sự là để thực hiện những người giúp đỡ mảng trên RingBuffer.nim

Trả lời

4

chuyển đổi ngầm sẽ là một cách để giải quyết này:

converter toSeq*[T](x: TestCol[T]): seq[T] = 
    x.data 

Thật không may họ không nhận được viện dẫn khi gọi một proc hy vọng một openarray. Tôi đã báo cáo lỗi về vấn đề này, nhưng tôi không chắc liệu có thể thay đổi/sửa lỗi hay không: https://github.com/nim-lang/Nim/issues/2652

+0

Có cách nào để trình biến đổi trở thành trình lặp/máy phát - ví dụ: nếu bạn muốn triển khai tìm kiếm nhị phân 'và trình tự là một proxy đơn giản hơn (bộ đệm tròn trong trường hợp của tôi) – megawac

Các vấn đề liên quan