Tôi đến từ Groovy và nó có phương thức .with
trên mọi loại chấp nhận đóng một đối số; đối số là đối tượng mà phương thức .with
đang được gọi. Điều này cho phép một kỹ thuật rất tuyệt vời để mở rộng các chức năng chuỗi chức năng, giúp bạn thoát khỏi nghĩa vụ giới thiệu các biến tạm thời, các yếu tố mã của bạn, giúp dễ đọc và thực hiện các tính năng khác..với thay thế trong scala
Tôi muốn để có thể làm điều gì đó như thế này:
Seq(1, 2, 3, 4, 5)
.filter(_ % 2 == 0)
.with(it => if (!it.isEmpty) println(it))
Thay vì
val yetAnotherMeaninglessNameForTemporaryVariable =
Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
if (!yetAnotherMeaninglessNameForTemporaryVariable.isEmpty)
println(yetAnotherMeaninglessNameForTemporaryVariable)
Nói cách khác trong ví dụ đầu tiên .with
là kinda giống với .foreach
nhưng thay vì lặp qua các mục của đối tượng mà nó đang được gọi một lần trên chính đối tượng đó. Vì vậy, it
bằng Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
.
Kể từ khi tôi đã rất ngạc nhiên không tìm thấy bất cứ điều gì như thế trong Scala, câu hỏi của tôi là:
- tôi thiếu cái gì?
- có bất kỳ kỹ thuật thay thế nào có nguồn gốc từ Scala không?
- nếu không, có lý do chính đáng nào khiến tính năng này không được triển khai trong Scala không?
Cập nhật: Một yêu cầu tính năng thích hợp đã được đăng tải trên theo dõi vấn đề Scala: https://issues.scala-lang.org/browse/SI-5324. Vui lòng bỏ phiếu và quảng cáo
Chỉ cần lưu ý: 'with' là một từ dành riêng trong Scala, vì vậy phương pháp này không thể được đặt tên giống nhau. Nó vẫn còn tồn tại dưới một cái tên khác; đây là _câu hỏi và câu trả lời phổ biến nhất của Scala trên StackOverflow theo như tôi có thể nói ("nó không tồn tại; làm cho riêng bạn như thế này")! –
Tôi nghĩ cái tên 'convert' sẽ phù hợp nhất, do đó gợi ý rằng phương pháp này sẽ không có tác dụng phụ và vì nó lấy người gọi làm tham số và trả về một cái gì đó mới, nó phải là một loại chuyển đổi. Trong ý nghĩa đó chức năng này sẽ không thể thay thế trong thư viện chuẩn. Cũng như được đề xuất trong http://stackoverflow.com/a/8538277/485115 cũng có một biến thể tác dụng phụ có tên là 'tap', trả về đối tượng người gọi. –