2010-11-11 22 views
31

Không phải là tôi đã thực sự đến gần giới hạn đó, nhưng tôi luôn tự hỏi: Tại sao họ dừng lại ở Function22/Tuple22. Giới hạn JVM? Lựa chọn tùy ý?Tại sao chức năng scala giới hạn ở 22 tham số?

+1

http://scala-programming-language.1934581.n4.nabble.com/Scala-API-why-like-this-td1952388.html – rwong

+0

http://jnordenberg.blogspot.com/2008/09/hlist -in-scala-revisited-or-scala.html – rwong

+0

Các giới hạn đó vẫn còn 6 năm sau đó: http://stackoverflow.com/a/39981285/6309 – VonC

Trả lời

29

Chức năng và các bộ được viết lại như các đối tượng bởi trình biên dịch, và chỉ Function0 qua Function22Tuple0 qua Tuple22 được xác định. Tôi nghĩ giới hạn 22 là hoàn toàn tùy ý, nhưng lý do có giới hạn thì không.

Hãy suy nghĩ theo cách này: để chạy ứng dụng Scala, các lớp cần thiết để chạy nó phải có mặt. Nếu trình biên dịch sẽ tự động tạo các lớp cho các hàm thì các lớp đó sẽ không được bao gồm trong thư viện JAR của thư viện Scala, vì vậy bạn sẽ phải bao gồm chúng trong ứng dụng của bạn. Điều đó có thể làm việc, nhưng sau đó bạn sẽ có vấn đề về tên của các lớp hoàn toàn đủ điều kiện: nếu chúng giống nhau cho tất cả các ứng dụng thì bạn sẽ có các xung đột vì các thư viện sẽ chứa cùng các lớp và nếu tên không phải là cùng bạn sẽ kết thúc với sự không tương thích - các hàm từ thư viện sẽ không giống như các hàm trong ứng dụng của bạn.

+3

Nó thực sự là Tuple1 thông qua Tuple22, nhưng đó chỉ là một chi tiết nhỏ. –

+8

@DarianLewin 'Tuple0' được gọi là 'Đơn vị' – Apocalisp

+0

Vẫn không được thuyết phục là tại sao các lớp này không được tạo động bởi trình biên dịch. Vấn đề đặt tên và đóng gói có thể được giải quyết dễ dàng bằng cách tuân theo quy ước đặt tên. Không chắc chắn nếu tôi thiếu hình ảnh lớn. –

4

Lựa chọn tùy ý. Mặc dù các lớp này được tạo tự động, nhưng phải có giới hạn ở đâu đó.

Lưu ý rằng bạn có thể có một cái gì đó giống như "các bộ kích thước tùy ý" bằng cách sử dụng HLists hoặc cấu trúc tương tự (xem http://jnordenberg.blogspot.com/2008/08/hlist-in-scala.html)

11

Phần lớn là tùy ý, nhưng có một số giới hạn cơ bản trên JVM quyết định mức giới hạn cần thiết.

Vấn đề chính là khớp mẫu trên các lớp chữ thường. Nếu một trường hợp được phép lớn hơn nhiều thì mã mẫu khớp được tạo ra có thể rất dễ dàng vượt quá kích thước phương thức hợp lệ tối đa. Mọi thứ khác (Sản phẩm, Chức năng, Tuple, ...) chỉ tuân theo giới hạn 22 thông số do đó được chọn cho các trường hợp.

Ngoài ra ... Nếu bạn đang viết các chức năng/bộ dữ liệu với> 22 thông số sau đó có lẽ bạn đang quá hạn cho một thiết kế lại :)

+17

Đôi khi nó không phải là thiết kế của bạn. Giả sử bạn đang viết một lớp chữ thường để biểu diễn một thông báo giao thức mạng có hơn 22 tham số. Hoặc phân tích cú pháp phản hồi JSON của máy chủ mà bạn không kiểm soát. – Chad

+0

@Chad: Đồng ý. Đôi khi, không thể thay đổi thiết kế. – tuxdna

22

Không có giới hạn như vậy. Ngay cả khi các thư viện chuẩn chỉ định nghĩa đến Function22, bạn có thể định nghĩa Function23 nếu bạn cần nó, đến giới hạn JVM. Hoặc bạn có thể nhóm các đối số thành các bộ dữ liệu. Hoặc bạn chỉ có thể ngừng giả vờ rằng bất kỳ chức năng nào có nhiều hơn một đối số:

a => b => c => d => e => ... 

Chức năng được thu thập có thể lấy nhiều đối số tùy thích.

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