// ed: yazma paketi
package so
trait AssertEquals[T, V] {
def assertEquals(t: T, v: V): Boolean
}
object AssertEquals {
implicit def assertEquals[T, V]: AssertEquals[T, V] = macro impl[T, V]
implicit class WithAssertEquals[T](t: T) {
def assertEquals[V](v: V)(implicit assertEquals: AssertEquals[T, V]): Boolean = assertEquals.assertEquals(t, v)
}
def impl[T: c.WeakTypeTag, V: c.WeakTypeTag](c: Context) = {
import c.universe._
val _t = c.weakTypeOf[T]
val _v = c.weakTypeOf[V]
//edit 2 : use symbolOf instead typeOf
q"""
{
new ${symbolOf[so.AssertEquals[_, _]]}[${_t},${_v}]{
def assertEquals(t: ${_t}, v: ${_v}): Boolean = t == v
}
}
"""
}
}
// test
import AssertEquals.WithAssertEquals
assert(1.assertEquals(2) == false)
assert(2.assertEquals(2) == true)
assert("a".assertEquals("a") == true)
assert("a".assertEquals("b") == false)
assert("a".assertEquals(1) == false)
Evet, bir def makro sadece bir yöntem çağırma olduğunu. Uygulamada gördüğünüz önek farklı görünecektir. –
@ som-snytt - "Uygulamada gördüğünüz önek farklı görünecek" ile ne demek istiyorsunuz? –
@ som-snytt - Eğer nesnenin kendisini, "bu", makroya aktarılmak istenirse, sadece "$ $" yapıp bunu diğer Ağaçlar gibi bir Ağaç olarak mı kullanırım? –