如何为给定字符串中名称的符号赋值
Posted
技术标签:
【中文标题】如何为给定字符串中名称的符号赋值【英文标题】:How to assign a value to a symbol given the name in a string 【发布时间】:2016-09-17 17:10:07 【问题描述】:给定字符串中的符号名称,如何多次为其赋值?例如,假设我想定义一个符号,其名称为varname
的值,并且我想为它分配一个值:
varname = "foo"
Symbol[varname]=5
这不起作用,因为 Mathematica 认为您正在尝试为 Symbol 分配一个值,该值是受保护的。如果 foo
未定义,这将起作用:
Evaluate[Symbol[varname]]=5
好的。但是第二次就不行了:
Evaluate[Symbol[varname]]=6
当评估左侧时,它评估为 5,并且 Mathematica 抱怨您试图将值 6 分配给原始对象 5。我想访问分配左侧的符号 foo
,不是foo
的值。这个可以吗?
提前感谢您提供的任何帮助。
【问题讨论】:
见ToExpression
。
Alan
-- 谢谢。我在发布之前查看了ToExpression
,但它一直在评估它试图分配一个值的点。我使用ToExpression
和Hold
作为可选参数找到了答案。此外,这对(1) 很有帮助。稍后我会发布更多内容。
`varname = "foo"; ToExpression[varname "=5"];富
Alan
-- 是的,谢谢,毕竟这会起作用。我在右侧使用 Evaluate,这需要 Hold 参数。你的方法更简单更好,谢谢。
【参考方案1】:
这里有几个方法,可以处理字符串或变量名。
i = Function[f, g, Clear[f]; Evaluate@Symbol[f] = g];
i["foo", 5];
foo
i["foo", 6];
foo
5 6
h = Function[f, g, f = g, HoldFirst];
h[foo, 5];
foo
h[foo, 6];
foo
5 6
【讨论】:
Chris
是的,谢谢第一个版本是我感兴趣的名称在字符串中的位置。它之所以有效,是因为Clear
不仅可以获取变量名,还可以获取字符串常量中的该名称。这和艾伦建议的方法都是很好的解决方案,谢谢。以上是关于如何为给定字符串中名称的符号赋值的主要内容,如果未能解决你的问题,请参考以下文章
Spring Integration Java DSL:如何使用 channelMapping 方法路由到标题中名称的通道?