如何在Scala中获取函数名称?
发布时间:2020-12-16 18:39:28 所属栏目:安全 来源:网络整理
导读:考虑一个简单的任务.只需显示整个表达式: a operator b = c 在Common Lisp中,它可能如下所示: (defun applyOp (a b op) (format t "~S ~S ~S = ~S" a op b (apply op (list a b)))) $(applyOp 1 2 #'logand) 1 #FUNCTION LOGAND 2 = 0 在Scala中,似乎并非
考虑一个简单的任务.只需显示整个表达式:
a operator b = c 在Common Lisp中,它可能如下所示: (defun applyOp (a b op) (format t "~S ~S ~S = ~S" a op b (apply op (list a b)))) $(applyOp 1 2 #'logand) 1 #<FUNCTION LOGAND> 2 = 0 在Scala中,似乎并非如此微不足道: def applyOperator(x: Int,y: Int,op: (Int,Int) => Int) = { println(x + s" $op " + y + " = " + op(x,y)) } scala> applyOperator(1,2,_ & _) 1 <function2> 2 = 0 // how to get the function name? < function2> ;?的名称是什么? 解决方法
另一个功能齐全的方法是简单的
macro.
假设你编写表达式和typename的最简单的宏提取字符串表示: import scala.reflect.macros.blackbox.Context import scala.language.experimental.macros class VerboseImpl(val c: Context) { import c.universe._ def describe[T: c.WeakTypeTag](expr: c.Expr[T]): c.Expr[(String,String,T)] = { val repr = expr.tree.toString val typeName = weakTypeOf[T].toString c.Expr[(String,T)](q"($repr,$typeName,$expr)") } } object Verbose{ def apply[T](expr: T): (String,T) = macro VerboseImpl.describe[T] } 接下来在另一个来源(在另一个子项目中可取的)你可以写 val a = 2 val b = 3 println(Verbose(a + b + 3)) 并看到魔术弦 (a.+(b).+(3),Int,8) 从这一点开始,您可以增强宏以显示有关方法,参数,类型等的任何信息…… 请注意,宏在编译时进行评估.因此,Verbose.apply调用的开销就像创建具有两个字符串常量的元组一样,所以虽然它是唯一的无平衡,可扩展的方法,但它绝对是性能最高的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |