Cú pháp đoạn này là sao ạ

override def run = {
val baddress = InetAddress.getByName(bindAddress)
ss = Some(new ServerSocket(socksPort, 0, baddress))

while(running){
  try{
    ss.map(_.accept).map{
      socket => ProtocolHandler(socket){ session.forward }
    }
   }
  catch {
   case e if e eq IOHandlerException => println(e)
   case e => println(e)
  }
}
}

em mới học scala lên github tìm mấy cái project nhỏ mà đọc code nó khó hiểu quá , đoạn while đó sao đối tượng socker lại gọi được method map @@ , còn đoạn map sau em đoán là callback

Trong Scala, có kiểu Option[T] có 2 giá trị là Some[T](value)None. Class Optional có method map.

map nhận tham số là 1 function.

Đoạn code đầu là lambda expression, 1 dạng khác của function. Hai cách viết dưới đây đều như nhau. Tuy nhiên viết theo dạng _ ngắn hơn, dễ đọc hơn.

ss.map(_.accept)
ss.map(s => s.accept())

map tiếp theo cũng nhận function, nhưng nhận theo kiểu closure, mà closure này lại nhận parameter theo dạng pattern maching. Vì vậy bạn đọc nó hơi khó hiểu chút.

Hai đoạn code dưới đây tương đương với nhau:

ss.map(_.accept).map(socket => {
  socket match {
    case Some(socket) => ProtocolHandler(...)
  }
})

ss.map(_.accept).map {
  socket => ProtocolHandler(...)
}

Phần này mình trả lời thêm…

Class Option[T] có 2 subclasses là Some[T]None. Some có companion object, object đó có method apply() gọi new Some(...). Vì vậy có thể bỏ bớt từ khoá new khi viết code.

Hai đoạn code sau như nhau:

ss = Some(new ServerSocket(...))

ss = new Some(new ServerSocket(...))

Phần catch cũng có thể sử dụng pattern matching

catch {
  case e if e eq IOHandlerException => println(e)
  case e => println(e)
}

catch {
  if (e eq IOHandleException) {
    println(e)
  else {
    println(e)
  }
}

Tất cả operator trong Scala đều là method, phép + cũng là 1 method

1 + 2
(1).+(2)

2 + 3 * 4
(2).+((3).*(4))

e eq IOException
e.eq(IOException)
6 Likes

hix đúng là cùng sử dụng thư viện java mà thằng scala viết cú pháp khác hẳn java …thanks anh…:smiley:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?