2014-11-10 11 views
7

xem xét:Tại sao _ không thể được sử dụng để chỉ ra một đối số không được sử dụng/bỏ qua trong một phương pháp ghi đè?

trait Validation { 
    def isValid(str: String): Boolean 
} 
class AlwaysValid extends Validation { 
    override def isValid(_: String) = true 
} 

mang

Bất cứ ý tưởng tại sao? Hay đó chỉ là điều mà các nhà thiết kế ngôn ngữ đã bỏ lỡ?


Có lẽ nó về tên luận qua nhưng điều này sẽ chỉ áp dụng cho phi ghi đè như ghi đè auto "kế thừa" những cái tên lập luận từ phương pháp ghi đè anyway, vì vậy đây không thể có thể là:

trait Foo { 
    def bar(arg0: String): String 
} 
class Baz extends Foo { 
    override def bar(blabla: String) = "hello" 
} 

new Baz().bar(arg0 = "world") // works, even though the arg name is blabla in Baz 

Hơn nữa:_ được cho phép trong lambdas, thậm chí nhiều lần:

scala> val x: Int => Int = _ => 3 
x: Int => Int = <function1> 

scala> val x: (Int, Int) => Int = (_, _) => 3 
x: (Int, Int) => Int = <function2> 
+5

Tại sao bạn muốn có đối số không bao giờ được sử dụng? – drexin

+0

Điểm tốt, cảm ơn; Tôi cần phải có được cụ thể hơn; Tôi đã thu hẹp câu hỏi để ghi đè phương pháp. –

+0

Tôi không thấy cách này thay đổi câu hỏi. Ghi đè vẫn phải có cùng chữ ký phương thức, vậy tại sao bạn nên được phép bỏ qua một tham số? –

Trả lời

6

Vì bạn có thể sử dụng tên thông số khi gọi phương thức.

Scala cho phép bạn thay đổi tên của thông số khi ghi đè (không khuyến khích) nhưng bạn luôn cần phải cung cấp tên cho người gọi để sử dụng nếu họ muốn.

+0

cảm ơn nhưng điều này không trả lời câu hỏi - tôi thực sự đăng câu trả lời chính xác cho câu hỏi của riêng tôi nhưng sau đó xóa nó và cập nhật câu hỏi - đó là về '_' trong ghi đè. –

+0

thực sự: ý của bạn là khi phương pháp được gọi trực tiếp, trái ngược với "đa hình"? –

+0

Tôi khuyến khích bạn xem bài viết này: http://docs.scala-lang.org/sips/completed/named-and-default-arguments.html – vptheron

3

Dưới đây là một lời giải thích phần nào chi tiết hơn về những gì đang xảy ra:

  1. lý do tại sao _ làm việc với lambdas là lambdas không bao giờ có thể đã được đặt tên đối số anyway.
  2. trong trường hợp gọi đa hình thành lớp con (Baz) trường hợp thông qua tham chiếu của loại lớp gốc (Foo), Scala sẽ đơn giản "kế thừa" tên phương thức lớp cha (arg0) vào phân lớp để các cuộc gọi đa hình không thấy tên thay đổi blabla trong Baz#bar; Tuy nhiên,
  3. tuy nhiên, phương thức phân lớp vẫn cần được gọi trực tiếp, vì vậy, nó cần phải cung cấp tên hợp lệ cho các đối số của nó, vì vậy _ sẽ không hoạt động vì những lý do rõ ràng; nó cũng được đề nghị rằng những người phù hợp với tên phương thức lớp cha mẹ đã bị ghi đè vì lý do rõ ràng.
2

Tôi nghĩ đó chỉ là vấn đề ngữ pháp.

_ là một số nhận dạng đặc biệt trong scala và việc sử dụng nó được cho phép trong một nhóm được xác định rõ ràng, chẳng hạn như lambdas, ứng dụng phương thức từng phần và đối sánh mẫu.

Tôi không xem xét thông số ngôn ngữ, nhưng có thể giả định rằng tham số phương pháp được mong đợi là một số nhận dạng tên và _ không phải là một giá trị hợp lệ.

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