2013-07-29 20 views
5

Bir yöntemde bir x parametresi tanımlamak mümkün mü, x türünün, bir işlev tanıtıcısını uygulayan (T türünde jenerik bir tip olması) yeni tip?Scala ve belirli bir işlemle bağlı sınama

[Örnek] hedef (Sadece gösterim uğruna bir anlık sözdizimi kullanıyorum) gibi bir şey tanımlamaktır: Şu

def foo(x : T with def apply() : Double) = { ... }

, ben yeni bir tür ApplyDouble tanıtmak olabilir, ama bu kimin örnekleri 'foo' yasal parametrelerdir olası tüm türleri uzanan beni gerektirecektir ve foo imzası sonra

def foo(x : ApplyDouble) = { ... }

cevap

8

S dönüştü olacak ure, bu yapısal bir türü ile mümkün, ve hatta neredeyse sözdizimi hakkı var: o zaman

def foo(x: { def apply(): Double }) = x.apply 

Ve:

scala> foo(() => 13.0) 
res0: Double = 13.0 

Veya:

scala> foo(new { def apply() = 42.0 }) 
res1: Double = 42.0 

foo tanımı yansıtıcı erişimle ilgili bir uyarı verecek ve bir içe aktarma veya derleyici seçeneği ekleyerek (uyarı mesajında ​​açıklandığı gibi) önleyebilirsiniz.

Yapısal bir yöntemle yöntemlerin çağrılmasıyla ilgili bazı ek yüklerin bulunduğunu unutmayın, bu nedenle sıkı bir iç döngüde buna ihtiyacınız varsa, yaklaşımınızı biraz düşünebilirsiniz. Çoğu durumda, yine de, muhtemelen fark edilebilir bir fark yaratmayacaktır.

+0

Teşekkürler. Tam olarak aradığım şey buydu;) – leco

İlgili konular