2013-02-03 39 views
6

Có vẻ như có một số phép dịch thuật giữa các cấu trúc dữ liệu Java khi truy cập chúng từ JRuby; chúng dường như hoạt động giống như các bản đồ và mảng ruby ​​đơn giản. Tuy nhiên, cấu trúc dữ liệu Scala thì không. Tôi thấy rất ít khi googling xung quanh cho JRuby/Scala interop. Ví dụ, bạn sẽ lặp lại các loại MapList của Scala như thế nào?Truy cập cấu trúc dữ liệu Scala trong JRuby

Trả lời

4

Chắc chắn bạn có thể. Nhưng đó là một chút nhảy. Đối với danh sách:

require "/usr/share/scala/lib/scala-library.jar" # load the scala lib 
Java::scala.collection.immutable::List.empty.send("::", 1) 
    .map(lambda{|e|e+1}, 
     Java::scala.collection.immutable.List.canBuildFrom) # by lopex 

Bây giờ bạn có danh sách scala trong jruby. Bạn có thể viết một số API Ruby điền đầy đủ vào những điều bạn cần.

+0

Cảm ơn bạn đã cập nhật. Đang thử điều này. – devth

3

Nếu bằng cách "lặp lại", bạn có nghĩa là sử dụng HOF (các hàm bậc cao hơn) chẳng hạn như map, reduce, filter, collect và cứ như vậy bạn sẽ gặp sự cố. Nó có thể, nhưng sự sang trọng cú pháp bạn nhận được trong Scala đến bởi vì nó rất dễ dàng để viết literal chức năng. Có gì trình biên dịch được thực hiện cho bạn khi bạn viết một cái gì đó như thế này:

scala> val l1 = List(1, 2, 3) 
l1: List[Int] = List(1, 2, 3) 

scala> l1.map(i => i * i) 
res0: List[Int] = List(1, 4, 9) 

... là tạo và khởi tạo một lớp con của Function1[Int, Int]apply phương pháp lấy đơn Int luận một đánh giá cơ quan chức năng theo nghĩa đen ((i => i * i)).

Để bạn sử dụng bất kỳ phương thức Scala nào chấp nhận một hàm bạn sẽ phải thực hiện tương tự. Một cái gì đó như:

scala> class ISquaredF extends Function1[Int, Int] { def apply(i: Int) = i * i } 
defined class ISquaredF 

scala> (new ISquaredF)(5) 
res1: Int = 25 

scala> val isf1 = new ISquaredF 
isf1: ISquaredF = <function1> 

scala> l1.map(isf1) 
res2: List[Int] = List(1, 4, 9) 

Nhìn chung, việc sử dụng mã Scala từ bất kỳ ngôn ngữ JVM nào cũng dễ dàng hơn rất nhiều. Đó là lý do tại sao các hệ thống như Akka muốn hỗ trợ cả khách hàng Scala và Java đều có các API Java đặc biệt để tránh những phần này của ngôn ngữ Scala.

+0

Cảm ơn lời giải thích tuyệt vời. – devth

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