是否有可能export在Bash中使用变量,然后取消导出它,而不是完全取消它?即它仍然可用于当前shell,但不适用于子进程.
你可以随时做到这一点,但它很难看(我很好奇):
export FOO
#...
_FOO=$FOO
unset FOO
FOO=$_FOO
Run Code Online (Sandbox Code Playgroud)
关于其他炮弹的答案也被接受了.
在The Rust Book 的第 20 章中,构建了一个线程池的示例实现。作业通过单生产者多消费者通道传递给工作人员:每个工作人员都有一个Arc<Mutex<Receiver>>从队列中挑选工作。
工作线程主体的第一个示例如下所示:
loop {
let job = receiver.lock().unwrap().recv().unwrap();
println!("Worker {} got a job; executing.", id);
job();
}
Run Code Online (Sandbox Code Playgroud)
当我看到这个时,我的第一个想法是“但是互斥锁在job运行时被保持”(即我不希望互斥锁被释放,直到lock循环结束时的返回值超出范围)。
然而,这本书提供了第二个例子:
while let Ok(job) = receiver.lock().unwrap().recv() {
println!("Worker {} got a job; executing.", id);
job();
}
Run Code Online (Sandbox Code Playgroud)
这本书说这个例子展示了我描述的问题,即“锁在调用期间保持保持job()”。它继续说,前一个例子逃避了这个问题,因为“一旦语句结束,MutexGuard从lock方法返回的值就会被删除let job”。
最后一部分听起来好像,因为MutexGuard从来没有真正分配给变量,一旦表达式完成评估,它的生命周期就结束了。那是有道理的。但第二个例子不也是如此吗?为什么在while表达式中会改变MutexGuard值的生命周期?
说我有这门课:
class FooClass(object):
foos = ["foo", "bar"]
def do_foos(self):
for foo in self.foos:
print("I have a " + foo)
# ...
Run Code Online (Sandbox Code Playgroud)
我想为这个扩展的类创建一个 SpecialisedFooClass FooClass,将一个项目添加"spec"到foos(即foos包含["foo", "bar", "spec"])。
SpecialisedFooClass.foos应该取决于FooClass.foos:如果我更改FooClass'定义以便foos包含["foo", "bam", "bat"],则SpecialisedFooClass.foos应该包含["foo", "bam", "bat", "spec"]。
这是迄今为止我想出的最好的方法:
class SpecialisedFooClass(FooClass):
foos = FooClass.foos + ["spec"]
Run Code Online (Sandbox Code Playgroud)
但我发现明确提到了FooClass有关。当我决定添加一个中间子类时(即当SpecialisedFooClass' 超类更改时),我将不可避免地忘记更新此引用。事实上,我已经在 IRL 使用我正在处理的代码库中犯了这个错误(实际上并没有处理 foos、bams 和 bats...)。
在我的情况下实际上没有特殊要求foos是类成员而不是实例成员,所以这也可以,但我觉得它很难看。此外,该super调用仍然有一个显式的类引用 …
我有一个产生分段错误的程序,我在Linux上运行.
直接运行程序,我得到:
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
当我在Bash脚本中运行它时,我得到:
./script.sh: line 1: 4095 Segmentation fault (core dumped) ./prog
Run Code Online (Sandbox Code Playgroud)
这个数字(在我的例子中为4095)每次都不同.似乎总是增加; 如果我快速运行脚本很多次,它似乎每次增加5.
这个数字告诉我什么?
这是一个 Clojure REPL 会话:
moon.core> Double
java.lang.Double
moon.core> (Double/parseDouble "1.0")
1.0
moon.core> Double/parseDouble
CompilerException java.lang.RuntimeException: Unable to find static field: parseDouble in class java.lang.Double, compiling:(*cider-repl moon*:1:7159)
Run Code Online (Sandbox Code Playgroud)
我可以引用Double,也可以调用 Double/parseDouble,但不能直接引用。对于 Java 标准库中的其他类方法(例如Math/abs,Integer/parseInt),我看到了相同的结果。为什么?
bash ×2
shell ×2
unix ×2
clojure ×1
clojure-repl ×1
environment ×1
inheritance ×1
jvm ×1
lifetime ×1
linux ×1
lisp ×1
oop ×1
python ×1
rust ×1
sh ×1