2017-08-02 16 views
9

Tôi đang cố gắng để thực hiện tiếp theo trong Scala, Tôi đang sử dụng play2:Json.obj Scala, chuỗi concat: Compilation lỗi

val str = "another" 
val r = Json.obj("error_type" -> "invalid_request_error", 
      "validation_errors" -> (Json.obj(
       "code" -> "this mode " + str + " does not exist", 
       "param" -> "mode" 
      ))) 

nhưng nó mang lại cho tôi những lỗi:

Type mismatch, expected: (String, Json.JsValueWrapper), actual: String 

nhưng nếu tôi làm:

val r = Json.obj("error_type" -> "invalid_request_error", 
      "validation_errors" -> (Json.obj(
       ("this mode ".+(str)).+(" does not exist"), 
       "param" -> "mode" 
      )))) 

Nó biên dịch và hoạt động ...

Làm thế nào tôi có thể viết nó dưới dạng str1 + str2 + str3 dễ đọc hơn? Thứ tự ưu tiên có liên quan ở đây như thế nào? Trong câu trả lời của tôi, tôi không hiểu tại sao() không cần bình luận. Có trường hợp tương tự nào khác khi dấu ngoặc đơn là cần thiết không?

ps: Tôi không chắc chắn nếu trong Java là cùng một vấn đề

Trả lời

6

này có thể dễ dàng giải thích bằng cách nhìn vào ưu tiên điều hành.

Từ tham chiếu ngôn ngữ http://scala-lang.org/files/archive/spec/2.11/06-expressions.html#infix-operations, chúng ta có thể thấy rằng các toán tử +-> có cùng mức độ ưu tiên. Điều này là do, nói chung, nó là ký tự đầu tiên của một toán tử xác định quyền ưu tiên của nó. Trong trường hợp của chúng tôi, các ký tự đầu tiên là +-, cả hai đều có cùng mức ưu tiên.

do đó, viết "code" -> "this mode " + str + " does not exist" cũng giống như viết:

"code" 
    .->("this mode ") 
    .+(str) 
    .+(" does not exist") 

Điều này phù hợp với những gì trình biên dịch cho bạn biết:

  • loại kết quả của các hoạt động đầu tiên ("code" -> "this mode ") được (String, String) mà tương đương với Tuple2[String, String]
  • (String, String) + String kích hoạt một chuyển đổi ẩn dạng trên tuple, do đó, e kết quả là String.

Dường như bạn đã tìm thấy cách tốt hơn để định dạng nó theo cách dễ đọc hơn.

Đối với các trường hợp khác là dấu ngoặc đơn cần thiết, câu trả lời rõ ràng là bạn cần chúng ngay khi bạn không muốn những hành vi mà nhà điều hành ưu tiên sẽ cung cấp cho bạn. Vì vậy tôi khuyên bạn nên đọc chương 6.12 của thông số được liên kết ở trên!

+0

cảm ơn rất nhiều về nó! câu trả lời thực sự tuyệt vời :), chắc chắn tôi sẽ chấp nhận –

-2

Bạn có thể tạo các thông báo lỗi của bạn trong bản đồ về StringSeq[String] và sau đó chuyển đổi chúng thành Json. Tôi nghĩ đó sẽ là cách tốt nhất để làm điều đó.

+0

Đó không phải là những gì tôi đã hỏi: D –

1

Cuối cùng tôi có thể làm điều đó, nhưng tôi không biết lý do, tôi biết một người nào đó, xin vui lòng cho tôi biết:

tôi sorrowed các dây với() và nó được biên dịch và hoạt động giống như một nét duyên dáng:

"code" -> ("payment mode " + another + " does not exist"), ... 

tất cả cùng nhau nó sẽ là:

Json.obj("error_type" -> "invalid_request_error", 
         "validation_errors" -> (Json.obj(
         "code" -> ("payment mode " + another + " does not exist"), 
         "param" -> "payment_mode" 
        )))) 
+0

Đó rõ ràng là đơn đặt hàng của nhà điều hành/ưu tiên – cchantep

+0

@cchantep Tôi đã cập nhật câu trả lời, Nếu bạn muốn xem lại lần nữa –

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