基本上我需要在Java中完成同样的事情:
SwingUtilities.invokeLater(()->{/* function */});
Run Code Online (Sandbox Code Playgroud)
或者在javascript中这样:
setTimeout(()=>{/* function */}, 0);
Run Code Online (Sandbox Code Playgroud)
但是用Qt和lambda.所以有些伪代码:
Qt::queuePushMagic([]() { /* function */ });
Run Code Online (Sandbox Code Playgroud)
作为一个额外的复杂性,我需要这个在多线程上下文中工作.我实际上要做的是在正确的线程中自动运行某些方法.那么代码看起来如何:
SomeClass::threadSafeAsyncMethod() {
if(this->thread() != QThread::currentThread()) {
Qt::queuePushMagic([this]()=>{ this->threadSafeAsyncMethod() });
return;
}
}
Run Code Online (Sandbox Code Playgroud)
这该怎么做?
我如何删除QString的前两个字符,或者如果我必须将它放在StackOverflows外行的条款中:
QString str = "##Name" //output: ##Name
Run Code Online (Sandbox Code Playgroud)
至
output: Name
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经使用了这段小代码:
if(str.contains("##"))
{
str.replace("##","");
}
Run Code Online (Sandbox Code Playgroud)
..但它不起作用,因为我需要在其他一些字符串中使用"##",但不是在开头.
前两个字符可能会出现"%$"和"#@",这主要是我需要删除前两个字符的原因.
有任何想法吗?
简短:我有一个解决我的问题的方法,但它看起来有点过分,所以我想知道我是否错过了什么.
Long:我有一个2数据类型,一个Animal类型和一个Owner类型.两者都具有相同的"属性"年龄和名称.为了简单起见,我希望能够在动物和所有者上无所谓地称呼年龄和名字
type Age = Int
type Name = String
data AnimalType = Dog | Cat | Snake
deriving (Read, Show,Eq)
--with datatype and pattern matching
data Animal = Animal AnimalType Name Age
deriving(Show, Eq)
name (Animal _ name _) = name
age (Animal _ _ age) = age
animalType (Animal animalType _ _) = animalType
data Owner = Owner Name Age [Animal]
deriving(Show,Eq)
name (Owner name _ _) = name
age (Owner _ age _) = age
animals (Owner …Run Code Online (Sandbox Code Playgroud) 我想QThread在Qt 5.3中正确地破坏一个.
到目前为止我有:
MyClass::MyClass(QObject *parent) : QObject(parent) {
mThread = new QThread(this);
QObject::connect(mThread, SIGNAL(finished()), mThread, SLOT(deleteLater()));
mWorker = new Worker(); // inherits from QObject
mWorker->moveToThread(mThread);
mThread->start();
}
MyClass::~MyClass() {
mThread->requestInterruption();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在一天结束时,我仍然得到:
QThread:线程仍在运行时被销毁
I have a problem with tranformation from QString to QByteArray and then back to QString:
int main() {
QString s;
for(int i = 0; i < 65536; i++) {
s.append(QChar(i));
}
QByteArray ba = s.toUtf8();
QString s1 = QString::fromUtf8(ba);
if(areSame(s, s1)) {
qDebug() << "OK";
} else {
qDebug() << "FAIL";
outputErrors(s, s1);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
As you can see I fill QString with all characters that are within 16bit range. and then convert them to QByteArray (Utf8) and …
我对Haskell很新,我必须说我很困惑
我正在使用GHCi前奏曲
首先尝试创建一个阶乘
Prelude> factorial 0 = 1
Prelude> factorial n = n*factorial(n-1)
Prelude> factorial 2
*** Exception: stack overflow
Run Code Online (Sandbox Code Playgroud)
最终堆栈溢出.显然递归并没有停止.
Prelude> :t factorial
factorial :: Num t => t -> t
Run Code Online (Sandbox Code Playgroud)
然后阅读这篇文章如何在多行中的ghci中定义一个函数?
我发现我必须使用多行版本或大括号(顺便说一句,这是一个运算符吗?)
Prelude> let { fact 0 = 1 ; fact n = n * fact (n-1) }
Prelude> fact 5
120
Prelude> ::t fact
fact :: (Eq p, Num p) => p -> p
Run Code Online (Sandbox Code Playgroud)
要么
Prelude> :{
Prelude| facto 0 = 1
Prelude| facto n = …Run Code Online (Sandbox Code Playgroud) 我有第一个应用程序文件Myapp.hs
我创建了一个用于解析csv文件的模块,称为Csvparser,该模块在文件Csvparser.hs中定义。
这两个文件都在同一目录中。
我不明白如何在Myapp.hs中导入Csvparser模块
Prelude Data.Maybe Data.List Data.Time Data.Either> :load C:\Test\Haskell\MyApp.hs
[1 of 1] Compiling Main ( C:\Test\Haskell\MyApp.hs, interpreted )
C:\Test\Haskell\MyApp.hs:5:1: error:
Could not find module `Csvparser'
Use -v to see a list of the files searched for.
|
5 | import Csvparser
| ^^^^^^^^^^^^^^^^
Failed, no modules loaded.
Prelude Data.Maybe Data.List Data.Time Data.Either>
Run Code Online (Sandbox Code Playgroud)
该模块可以独立加载并运行
Prelude Data.Maybe Data.List Data.Time Data.Either> :load C:\Test\Haskell\Csvparser.hs
[1 of 1] Compiling Csvparser ( C:\Test\Haskell\Csvparser.hs, interpreted )
Ok, one module loaded.
*Csvparser Data.Maybe Data.List Data.Time Data.Either> …Run Code Online (Sandbox Code Playgroud) 考虑这个代码片段:迭代第一个类型T1的一个容器,用于创建应用转换函数T1-> T2的第二个类型T2的第二个容器,但仅用于验证谓词的T1元素(T1 - > bool)
(在下面的例子中是奇数).
std::vector<int> myIntVector;
myIntVector.push_back(10);
myIntVector.push_back(15);
myIntVector.push_back(30);
myIntVector.push_back(13);
std::vector<std::string> myStringVectorOfOdd;
std::for_each(myIntVector.begin(), myIntVector.end(),
[&myStringVectorOfOdd](int val)
{
if (val % 2 != 0)
myStringVectorOfOdd.push_back(std::to_string(val));
});
Run Code Online (Sandbox Code Playgroud)
我在这段代码中不喜欢的是lambda上的捕获.有没有办法结合std :: copy_if和std :: transform以更优雅和简洁的方式实现相同的结果?
我们可以返回一个元组
std::pair<bool, std::string> fooFunction();
Run Code Online (Sandbox Code Playgroud)
但这使得创建返回值时代码变得多余,并强制调用者处理元组(在 c++17 中使用结构绑定很容易)
if ( okayCondition)
return {true, {}};
else
return { false, "blabla error"};
Run Code Online (Sandbox Code Playgroud)
或者我们可以使用
std::optional<std::string> fooFunction();
Run Code Online (Sandbox Code Playgroud)
这对于返回 bool 的现有函数很有趣,因为由于 std::optional 运算符 bool,大多数调用者不需要更新
//Legacy code ok
if (fooFunction())
Run Code Online (Sandbox Code Playgroud)
我知道一种更重的方法,一个模板化的 ReturnStatus 类,它会在调用者不测试返回状态值的情况下抛出。
还有其他方法吗?