加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在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&gt ;?的名称是什么?

解决方法

另一个功能齐全的方法是简单的 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调用的开销就像创建具有两个字符串常量的元组一样,所以虽然它是唯一的无平衡,可扩展的方法,但它绝对是性能最高的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读