当前位置: 首页 > 知识库问答 >
问题:

函数范围内的eval(访问函数args)

谷森
2023-03-14
abstract ABSGene
type NuGene <: Genetic.ABSGene
     fqnn::ANN
     dcqnn::ANN
     score::Float32
 end

 function mutate_copy{T<:ABSGene}(gene::T)
     all_fields_except_score = filter(x->x != :score, names(T))
     all_fields_except_score =  map(x->("mutate_copy(gene.$x)"),all_fields_except_score)
     eval(parse("$(T)("*join(all_fields_except_score,",")*")"))
 end

 ng = NuGene()

 mutated_ng = mutate_copy(ng)
ERROR: gene not defined
in mutate_copy at none:4
"NuGene(mutate_copy(gene.fqnn),mutate_copy(gene.dcqnn))"

我试过这个:

function mutate_copy{T<:ABSGene}(gene::T)
  all_fields_except_score = filter(x->x != :score, names(T))
  all_fields_except_score =  map(x->   ("mutate_copy($gene.$x)"),all_fields_except_score)
  eval(parse("$(T)("*join(all_fields_except_score,",")*")"))

end

但这扩展了弦中的基因,这不是我想要的。

共有1个答案

凌炜
2023-03-14

不要使用eval!在几乎所有情况下,除非您真正知道自己在做什么,否则不应该使用eval。在本例中,eval根本无法工作,因为它在全局(或模块)范围内操作,并且不能访问函数的局部变量(比如参数gene)。

虽然您发布的代码对于一个最小的工作示例来说还不够,但我可以猜测一下您想在这里做什么。

您可以动态查找字段名,而不是map(x->(“mutate_copy(gene.$x)”),all_fields_except_score):

map(x->mutate_copy(gene.(x)), all_fields_except_score)
T(all_fields_except_score...)
 类似资料:
  • 问题内容: 编辑 : 请参阅此问题底部的我的完整答案。 tl; dr答 :Python具有静态嵌套的作用域。的 静态 方面可以与隐变量声明相互作用,产生非显而易见的结果。 (由于该语言通常具有动态特性,所以这尤其令人惊讶)。 我以为我对Python的作用域规则掌握得很好,但是这个问题使我彻底陷入困境,而我的google-fu让我失败了(这并不令我感到惊讶-请看问题标题;) 我将从一些可以按预期工作

  • 问题内容: 我正在尝试查看是否存在通过外部javascript函数访问控制器内部范围的简单方法(与目标控制器完全无关) 我在其他几个问题上看到 会从DOM元素中检索范围,但是我的尝试目前未产生正确的结果。 这是jsfiddle:http : //jsfiddle.net/sXkjc/5/ 我目前正在经历从纯JS到Angular的过渡。我试图实现这一目标的主要原因是要保持原始库代码尽可能完整。无需我

  • 问题内容: 我尝试在函数的局部范围内使用eval()。但是,它始终在全局范围内进行评估。 自包含的示例: 1-此代码有效: 2-抛出为 3-与2相同的结果。 问题答案: 保存(或)调用的结果以返回函数的本地范围。否则,在生成器表达式内部将返回gen-expr的本地范围。 顺便说一句,您不需要明确的理解即可构建该命令:

  • 本文向大家介绍dart函数范围,包括了dart函数范围的使用技巧和注意事项,需要的朋友参考一下 示例 Dart函数也可以匿名声明或嵌套声明。例如,要创建嵌套功能,只需在现有功能块中打开一个新功能块 该函数innerFunction现在可以在内部使用,并且只能在内部使用outerFunction。没有其他任何功能可以访问它。 Dart中的函数也可以匿名声明,通常用作函数参数。一个常见的例子是对象so

  • eval函数与文本变量一起实现有力的文本宏工具。语句 eval(s) 用MATLAB的注释器求表达式的值或执行包含于文本字符串s的语句。 前一节的例子也可以在下面的代码中实现,虽然这有点低效率因为它用到完全注释器,而不只是函数调用。 for d = 1:31 s = ['load August' int2str(d) '.dat']; eval(s) % Process t

  • 问题内容: 我想知道如何访问另一个函数中的一个函数。我看到了这样的代码: 那么,还有另一种方法来调用该 函数吗?我的第二个问题是,为什么在最后一行中我不打电话? 很好的解释深表感谢。 问题答案: 不,您不能直接调用它,因为它是的局部变量。 您需要使用,因为调用时返回了函数对象。要执行此功能对象,您需要 在这里您可以直接调用它,因为您可以访问它,因为它是由函数返回的。返回的对象实际上称为 闭包, 因