tôi đã tìm thấy mô hình này khá một vài lần trong mã của tôi:gọi có điều kiện của một phương pháp trong Scala
if (doIt)
object.callAMethod
else
object
Tôi đang tự hỏi nếu có thể là một cách cú pháp dễ chịu hơn để viết mã trên, đặc biệt là để tránh sự lặp lại của biến số object
. Một cái gì đó như:
// using the Scalaz "pipe" operator
// and "pimping" f: T => T with a `when` method
object |> (_.callAMethod).when(doIt)
Thật không may dòng trên không thành công vì kiểu suy luận yêu cầu kiểu tham số cho (_.callAMethod)
.
tiếp cận tốt nhất của tôi bây giờ là thế này:
implicit def doItOptionally[T](t: =>T) = new DoItOptionally(t)
class DoItOptionally[T](t: =>T) {
def ?>(f: T => T)(implicit doIt: Boolean = true) =
if (doIt) f(t) else t
}
implicit val doIt = true
object ?> (_.callAMethod)
Không tuyệt vời vì tôi phải khai báo một implicit val
nhưng điều này đền đáp nếu có một số cuộc gọi xích:
object ?> (_.callAMethod) ?> (_.callAnotherMethod)
Có ai có một Ý tưởng tốt hơn? Tôi có thiếu ma thuật Scalaz ở đây không?
Tôi không nghĩ đến việc đảo ngược điều kiện và chức năng, cảm ơn! – Eric
Tôi cũng nhận thấy rằng một danh từ tốt hơn ở đây so với toán tử vì '.' cần phải được sử dụng sau khi' "cá" '. – Eric