class Package:
def __init__(self):
self.files = []
# ...
def __del__(self):
for file in self.files:
os.unlink(file)
Run Code Online (Sandbox Code Playgroud)
__del__(self)
上面因AttributeError异常而失败.我理解Python在__del__()
调用时不保证存在"全局变量"(在此上下文中的成员数据?).如果是这种情况并且这是异常的原因,我该如何确保对象正确破坏?
如何为当前目录下的所有文件指定Vim设置?
理想的解决方案是,如果Vim在搜索〜/ .vimrc之前搜索并读取当前目录中的.vimrc,并在那里应用整个树的设置.
我见过一个插件,但这意味着应用的设置不透明,因为它们需要安装插件.相反,模式行是透明的,因为无论用户的vimrc还是特定的vim调用,模式行设置都将应用于该文件.
我尝试过的是
:so vimrc
在模式中.我想两者都不会出于安全原因而起作用.我不需要vimrc的全部功能; 绑定到模式行可接受的设置就足够了.我的目标是让vimmers更容易在项目中采用编码标准.
在zsh中,如何设置行编辑器,使back-kill-word在目录分隔符上停止?目前在我的bash设置中,如果我键入
cd ~/devel/sandbox
Run Code Online (Sandbox Code Playgroud)
然后在"devel /"之后点击Cw点.在我的zsh设置中,点将在"cd"之后.我想设置zsh所以它的行为与bash类似.
如何将Ruby脚本中的环境变量导出到父shell?例如,实现read
Bash内置的天真实现:
#!/usr/bin/ruby
varname = ARGV[0]
ENV[varname] = STDIN.gets # but have varname exported to the parent process
Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
try:
raise Exception("a")
except:
try:
raise Exception("b")
finally:
raise
Run Code Online (Sandbox Code Playgroud)
这会提高Exception: a
.我预计它会提高Exception: b
(我需要解释原因吗?).为什么最终raise
提出原始异常而不是(我认为)是最后一个异常引发的?
如果我将char*传递给函数.我想把那个char*转换为std :: string,一旦我得到我的结果,就从std :: string将它转换回char*来显示结果.
所以我需要做的步骤
如果可能的话,我可以看看如何通过引用vs一个指针来完成它(它的地址我通过值传入但是我仍然可以修改指针所指向的值.所以即使函数中指针地址的副本被破坏了我仍然看到外面的变化值.
谢谢!
下面的片段从中读取三个整数std::cin
; 它写入两个numbers
并丢弃第三个:
std::vector<int> numbers(2);
copy_n(std::istream_iterator<int>(std::cin), 2, numbers.begin());
Run Code Online (Sandbox Code Playgroud)
我希望代码能够准确地读取两个整数std::cin
,但事实证明这是一个正确的,符合标准的行为.这是标准中的疏忽吗?这种行为的理由是什么?
从C++ 03标准中的24.5.1/1开始:
在构造之后,每次使用++时,迭代器都会读取并存储一个值
T
.
所以在上面的代码中,在调用时,流迭代器已经读取了一个整数.从那时起,算法中迭代器的每次读取都是预读,从而产生从先前读取缓存的值.
下一个标准的最新草案n3225似乎没有任何变化(24.6.1/1).
在相关的说明中,参考istream_iterator(istream_type& s)
构造函数的当前标准的24.5.1.1/2 读取
效果:初始化
in_stream
为s
.value
可以在施工期间或第一次参考时初始化.
重点是" value
可以初始化......"而不是" 应该初始化".这听起来与24.5.1/1相矛盾,但也许这应该是一个自己的问题.
如果我使用assert()
并且断言失败assert()
则会调用abort()
,突然结束正在运行的程序.我的生产代码中负担不起.有没有办法在运行时断言但能够捕获失败的断言,所以我有机会优雅地处理它们?
STL通常定义一个输出迭代器,如下所示:
template<class Cont>
class insert_iterator
: public iterator<output_iterator_tag,void,void,void,void> {
// ...
Run Code Online (Sandbox Code Playgroud)
为什么输出迭代器定义value_type
为void
?算法知道它应该输出什么类型的值会很有用.
例如,一个将URL查询"key1=value1&key2=value2&key3=value3"
转换为包含键值字符串元素的任何容器的函数.
template<typename Ch,typename Tr,typename Out>
void parse(const std::basic_string<Ch,Tr>& str, Out result)
{
std::basic_string<Ch,Tr> key, value;
// loop over str, parse into p ...
*result = typename iterator_traits<Out>::value_type(key, value);
}
Run Code Online (Sandbox Code Playgroud)
这提示的SGI参考页面value_type
是因为无法取消引用输出迭代器.但这不是唯一的用途value_type
:我可能想要实例化一个以便将它分配给迭代器.
有什么替代方法可以用输出迭代器构造输出值?我考虑过两种方法:
pair<string,string>
,或者从中可以转换的类型.我想知道如果没有这个要求我能做到,也许允许任何可以从两个构造的元素std::string
.假设头文件定义了一个函数模板.现在假设#include
这个头文件有两个实现文件,每个文件都调用了函数模板.在两个实现文件中,函数模板都使用相同的类型进行实例化.
// header.hh
template <typename T>
void f(const T& o)
{
// ...
}
// impl1.cc
#include "header.hh"
void fimpl1()
{
f(42);
}
// impl2.cc
#include "header.hh"
void fimpl2()
{
f(24);
}
Run Code Online (Sandbox Code Playgroud)
人们可能会期望链接器会抱怨多个定义f()
.具体来说,如果f()
不是模板那么确实如此.
f()
?