简短的问题
如何实现GetHashCode一个Array.
细节
我有一个覆盖的对象Equals,检查:
this.array[n] == otherObject.array[n]
Run Code Online (Sandbox Code Playgroud)
所有n在array.
当然,我应该实施补充GetHashCode.我想知道是否有.NET方法可以做到这一点,或者我是否应该实现自己的方式
hash = hash ^ array[n]
Run Code Online (Sandbox Code Playgroud)
澄清
我的对象包含一个数组,我对GetHashCode感兴趣的数组元素.我的数组等价代码仅作为示例 - 就像我的问题所说,但也许我不清楚,我对GetHashCode(不是Equals)感兴趣.我说我自然应该实现补充,GetHashCode因为一旦Equals被覆盖(为了Dictionary正常运行等),实现这一点是.NET的要求.谢谢.
我想了解Python的类型注释如何工作(如List和Dict- 不list或dict).具体来说,我对如何isinstance(list(), List)工作感兴趣,以便我可以创建自己的自定义注释.
我看到它List被定义为:
class List(list, MutableSequence[T], extra=list):
. . .
Run Code Online (Sandbox Code Playgroud)
我很熟悉,metaclass = xxx但我找不到任何关于此的文档extra = xxx.这是一个关键字还是一个参数,如果是这样的话,它来自哪里,它会做我想要的事情?它甚至相关isinstance吗?
我可以通过基类函数指针调用派生类,如下例所示?
我理解我的示例有效,但保证总是这样做(假设对象实际上实现了函数!),或者这只是我正在使用的编译器的特性?
通过这个逻辑,不能简单地从"CBase"(在这种情况下是空的,所以我猜没有开销)派生所有类,并忽略函数指针中的类型?
#include <iostream>
struct CBase
{
};
struct CDerived : CBase
{
void MyFunction()
{
std::cout << "Called OK" << std::endl;
}
};
typedef void (CBase::*FunctionPointer)();
int main()
{
CDerived* base = new CDerived();
FunctionPointer pointer = static_cast<FunctionPointer>(&CDerived::MyFunction);
(base->*pointer)();
delete base;
}
Run Code Online (Sandbox Code Playgroud)
示例用法场景:一个派生类,它在基类中带有一个或多个指向"回调"的指针.可以使用派生类来定义回调类型,从而放弃对模板的需求吗?
编辑:这里有一个类似的问题涉及迭代器重置。然而,下面接受的答案解决了嵌套迭代器的实际问题,并处理了一个容易错过的问题,即嵌套迭代器不会重置。
有没有办法在 python 中迭代迭代器两次?
在下面的示例代码中,我可以看到第二次迭代与第一次迭代在同一对象上运行,因此产生了奇怪的结果。将此与下面的 C# 进行对比,得到我想要的结果。
有什么办法可以做我想做的事。我想知道是否可以复制迭代器或“检索”它来自的函数,但也许有一种更简单的方法。(我知道我可以在下面的玩具示例中调用MyIter()两次,但如果我不知道迭代器来自哪里并且不是我想要的,那么这是没有用的!)。
def MyIter():
yield 1;
yield 2;
yield 3;
yield 4;
def PrintCombos(x):
for a in x:
for b in x:
print(a,"-",b);
PrintCombos(MyIter());
Run Code Online (Sandbox Code Playgroud)
给出
1 - 2
1 - 3
1 - 4
Run Code Online (Sandbox Code Playgroud)
对比:
static IEnumerable MyIter()
{
yield return 1;
yield return 2;
yield return 3;
yield return 4;
}
static void PrintCombos(IEnumerable x)
{
foreach (var a in x)
foreach (var b in x)
Console.WriteLine(a + "-" …Run Code Online (Sandbox Code Playgroud) 简短问题:
可以通知处理程序内存泄漏。
长问题:
在C#中,如果我将处理程序附加到事件
left_object.left_event += right_object.right_handler
Run Code Online (Sandbox Code Playgroud)
然后,我需要删除处理程序,right_object否则垃圾收集器将永远不会处理它(因为left_object.left_event保留了的指针right_object)
PyQt信号和插槽也是如此。
left_object.left_signal.connect( right_object.right_handler )
Run Code Online (Sandbox Code Playgroud)
从这个问题中,我看到Qt会在调用left_objector 的析构函数时自动解除信号和插槽的链接,right_object但是在Python中,我无法显式调用该析构函数,它right_handler是一个普通的函数。
我是否需要删除处理程序以防止right_objects的内存泄漏,还是PyQt使用某种弱引用?
我有一个Person类,它有一个nameproperty(std::string).
我想创建一个查找表,一个std::unordered_map,所以我可以找到一个Person名字.但是,鉴于a Person,我也希望能够得到他们的名字.
这需要存储name两次 - 一次作为地图的键,一次存储在人物对象内,如下面的代码所示.
由于我有很多Persons一次加载到内存中,我不希望两次存储它们的名称的开销.
我已经尝试在Person类中使用键的引用/指针,但这会产生问题,因为映射似乎在修改时重新调整其数据,并且引用变为无效.
我也尝试过使用std::unordered_set,但这意味着我Person每次想要执行查找时都需要构造一个完整的对象.
是否有任何方法可以使无序映射的键和值共享相同的数据?
#include <iostream>
#include <unordered_map>
class Person
{
private:
const std::string _name;
public:
Person( const std::string& name ) : _name( name )
{
}
const std::string& get_name() const
{
return _name;
}
};
int main()
{
auto my_set = std::unordered_map<std::string, std::shared_ptr<Person>>();
my_set.insert( { "alice", std::shared_ptr<Person>( new Person( "alice" )) } …Run Code Online (Sandbox Code Playgroud) 我想使用 Python 的 pickle 序列化器为缺失值提供默认值。由于类很简单,默认值自然存在于类的__init__方法中。
我可以从泡菜文档中看到有__getnewargs__. 但是,这仅适用于__getnewargs__“酸洗”之前存在的情况。
有什么方法可以告诉 python pickle 始终调用构造函数而不是从未初始化的对象开始?
是否有任何安全的方法可以将整数转换为结构?
举个例子:
struct Colour
{
uint8_t A;
uint8_t R;
uint8_t G;
uint8_t B;
};
Run Code Online (Sandbox Code Playgroud)
我转换为整数或从整数转换:
uint32_t myInteger
Colour* myColour = reinterpret_cast<Colour*>(&myInteger);
uint32_t* myInteger2 = reinterpret_cast<uint32_t*>(myColour);
Run Code Online (Sandbox Code Playgroud)
如果我的结构被填充,那么这将不起作用,有什么方法可以保证它有效吗?
我知道这可能不是标准的,但我更喜欢支持主要编译器(Visual Studio 和 GCC)而不是一些位移解决方法,这里已经回答了:Type cast struct to integer c++。
我正在寻找一种模仿终端进行一些自动化测试的方法:即启动一个进程,然后通过将数据发送到标准输入并从标准输出读取来与其交互。例如,将一些输入行发送到标准输入,包括ctrl-c和 ,ctrl-\这将导致向进程发送信号。
使用std::process::Commannd我能够将输入发送到eg cat,并且我还在stdout上看到它的输出,但是发送ctrl-c(据我所知3)不会导致SIGINT发送到shell。例如这个程序应该终止:
use std::process::{Command, Stdio};
use std::io::Write;
fn main() {
let mut child = Command::new("sh")
.arg("-c").arg("-i").arg("cat")
.stdin(Stdio::piped())
.spawn().unwrap();
let mut stdin = child.stdin.take().unwrap();
stdin.write(&[3]).expect("cannot send ctrl-c");
child.wait();
}
Run Code Online (Sandbox Code Playgroud)
我怀疑问题是发送ctrl-c需要一些 tty 并且通过sh -i它仅处于“交互模式”。
更新:我在原来的问题中混淆了 shell 和终端。我现在把这事弄清楚了。我还提到了ssh应该是的sh。
我可以引发from另一个异常以提供附加信息,例如:
try:
age = int(x)
except Exception as ex:
raise ValueError("{} is not a valid age.".format(x)) from ex
Run Code Online (Sandbox Code Playgroud)
有没有办法从多个异常中获取来源?例如
try:
age = int(x)
except Exception as ex1:
try:
age = date_now().year - parse_date(x).year
except Exception as ex2:
raise ValueError("{} is not a valid age or date.".format(x)) from ex1 + ex2
Run Code Online (Sandbox Code Playgroud) python ×5
c++ ×3
python-3.x ×3
.net ×1
arrays ×1
c# ×1
c++11 ×1
constructor ×1
events ×1
exception ×1
for-loop ×1
generator ×1
hash ×1
isinstance ×1
iterator ×1
jsonpickle ×1
metaclass ×1
pickle ×1
polymorphism ×1
process ×1
pty ×1
pyqt ×1
qt ×1
raise ×1
rust ×1
signals ×1
stdmap ×1
type-hinting ×1
unix ×1
yield ×1