这里有很多关于 Rust 中的自引用结构的问题,我想我已经阅读了所有这些问题,但我仍然无法理解这些问题。在 Rust 中处理自引用结构有哪些设计模式?我会列出我的想法,以便其他人可以告诉我哪里出错了(我有一种感觉,它是在开始时)。
当我学习一门新语言时,我尝试实现相同的游戏,而对于 Rust,我遇到了这个问题:我们有资源,其中一些可以从其他资源中制作。(假设它们形成一个 DAG。)
我对它进行建模的天真尝试是这样的:
struct Resource {
name: String,
production_cost: HashMap<&Resource, i32>,
// other data
}
Run Code Online (Sandbox Code Playgroud)
我们需要一个引用的生命周期注解,所以它变成Resource<'a>
了一个HashMap<&'a Resource, i32>
.
Vec<Resource>
这种形式的A是不切实际的(不可能?)构建,所以另一个尝试是上升一个级别:
struct Resource {
name: String,
// other data
}
struct ResourceConfig {
resources: Vec<Resource>,
resource_costs: HashMap<&Resource, HashMap<&Resource, i32>>,
}
Run Code Online (Sandbox Code Playgroud)
我也想不出构造其中一个的方法。我能想到的接下来的两个选项是:
所以最终结果(2)看起来像:
type RIndex = usize;
type ResourceSet = HashMap<RIndex, i32>;
struct Resource {
name: String,
// other data
}
struct ResourceConfig {
resources: Vec<Resource>,
resource_costs: HashMap<RIndex, …
Run Code Online (Sandbox Code Playgroud) 我认为这应该很容易,但我不能为我的生活让它工作,或在网上找到解释它的任何东西.表单提交后,我想重定向回referer/referrer并更改或删除一个或多个查询参数.
例如,表格是
/tasks/6?foo=1&bar=1
Run Code Online (Sandbox Code Playgroud)
我想事后去
/tasks/6?foo=0&bar=1
Run Code Online (Sandbox Code Playgroud)
我尝试了各种各样的组合
redirect_to :back, foo: 0
Run Code Online (Sandbox Code Playgroud)
要么
redirect_to :back, params: {foo: 0, bar: 1}
Run Code Online (Sandbox Code Playgroud)
等等,但没有任何东西可以将我重定向到原始页面以外的任何内容.我本来希望避免不得不用字符串自行修改,但它可能会出现这种情况.
如果还有一种方法可以完全摆脱参数,例如重定向到:它也会很棒.
/tasks/6?bar=1
Run Code Online (Sandbox Code Playgroud)
谢谢!
我想将类的一些信息存储为类(静态)变量.但是,我无法弄清楚这些东西是如何初始化的.这是一个基本的,愚蠢的例子:
class A(object):
clsVar = 'a'
@classmethod
def clsMeth(cls):
print 'changing clsVar'
cls.clsVar = 'b'
A.clsMeth()
# prints 'changing clsVar'
print A.clsVar # prints 'a'
A.clsVar = 'b'
print A.clsVar # prints 'b'
Run Code Online (Sandbox Code Playgroud)
由于调用了函数(因为print语句有效),为什么类变量不会保持更改?如果在类定义完成后我不想这样做,我是否必须使用元类?
[具体来说,我想clsMeth
成为一个装饰器,让类变量成为所有装饰的函数列表.我猜这不是实现这一目标的正确方法,所以我继续前进,但我仍然很好奇.
编辑:正如许多人所指出的,上面的代码将无法运行.我在IPython会话中运行它,其中调用A.clsMeth()
将引用以前的版本A
并运行.我想这就是使用解释性语言的风险.我结束了这样的事情:
outsideDict = {}
def outsideDec(func):
outsideDict[func.__name__] = func
class A(object):
@outsideDec
def someMethod(self):
print 'ID %s' % id(self)
def otherMethod(self):
print 'other'
print outsideDict
one, two = A(), A()
outsideDict['someMethod'](one)
outsideDict['someMethod'](two)
Run Code Online (Sandbox Code Playgroud)
也许这应该是另一个问题,但是当outsideDec
运行时,有没有办法告诉它的论证是什么类?或者,有没有更好的方法在Python中进行这样的内省?我知道我在这里偏离正轨,所以我会接受下面的答案并做更多的研究.感谢大家!