小编Pet*_*ter的帖子

Rust 中自引用结构的替代方案?

这里有很多关于 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)

我也想不出构造其中一个的方法。我能想到的接下来的两个选项是:

  1. 将所有内容都包裹在 RefCell/Rc(或 Arc/Mutex)中。这似乎需要太多的输入,更不用说引用计数的性能开销(我确信这对我来说是微不足道的)。
  2. 将索引传递给主向量。

所以最终结果(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)

rust

8
推荐指数
1
解决办法
3422
查看次数

Rails 4:redirect_to:返回并更改/删除参数

我认为这应该很容易,但我不能为我的生活让它工作,或在网上找到解释它的任何东西.表单提交后,我想重定向回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)

谢谢!

redirect ruby-on-rails query-string ruby-on-rails-4

7
推荐指数
1
解决办法
4411
查看次数

Python类变量初始化

我想将类的一些信息存储为类(静态)变量.但是,我无法弄清楚这些东西是如何初始化的.这是一个基本的,愚蠢的例子:

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中进行这样的内省?我知道我在这里偏离正轨,所以我会接受下面的答案并做更多的研究.感谢大家!

python initialization class-variables

5
推荐指数
1
解决办法
1万
查看次数