为了最好地解释这个问题,我构建了一个简单的例子.说我有一个课程Blob如下:
class Blob
{
string personalName;
string& familyName;
}
Run Code Online (Sandbox Code Playgroud)
A Blob可以由Creator(又名程序员)产生,此时它可以选择一个personalName,因为它有权成为第一代Blob,它可以选择它自己的familyName.
或者,Blob可以通过产生现有的东西来创建a Blob,此时它会选择它自己的personalName,但是familyName与Blob在该族中克隆的所有其他s 共享.如果Blob更改姓氏,则所有其他家庭成员将自动更改该名称.
到目前为止,这听起来都很好,直到编写Blob构造函数时我才看到:
Blob::Blob() :
personalName(pickName()),
familyName(pickFamilyName())
{ }
...
string& Blob::pickFamilyName()
{
return *(new string("George"));
} // All Blobs have family name "George" in this example
Run Code Online (Sandbox Code Playgroud)
伊克!在堆上分配内存然后将其分配给引用变量?!这看起来很吓人!
我的直觉是否正确,这有什么不妥之处,或者它只对我感到陌生,因为它不是一个常见的模式?如果出现问题,那是什么?为什么这是一个糟糕的设计?
注意:通过引用计数释放堆分配的内存并在最后一个Blob被破坏时删除内存或通过其他方法释放内存非常重要.
如果我有一个Future[Either[String, Int]]代表可能的错误消息 ( String) 或成功计算 ( Int) 的 ,那么将Future潜在的失败作为错误消息移动到左侧很简单:
def handleFailure(fe: Future[Either[String,Int]]) =
f.recover({ case e: Exception => Left(s"failed because ${e.getMessage}"))
Run Code Online (Sandbox Code Playgroud)
我希望 存在类似的东西EitherT,但也许我只是找不到它的名字。它相对简单,但涉及拆箱和重新装箱这感觉笨拙的EitherT:
def handleFailureT(fe: EitherT[Future, String, Int]) =
EitherT(handleFailure(et.value)) // See above for handleFailure definition
Run Code Online (Sandbox Code Playgroud)
Cats不久前确实添加了一个MonadError实例,但它专门用于直接恢复到right,而不是用于替换 Each 本身。
是handleFailureT实现它的猫,如果是,它叫什么?
理想情况下,它看起来像这样:
class EitherT[F, A, B] {
def handleFailureT[AA](f: PartialFunction[Throwable, AA]): EitherT[F, AA, B] = EitherT(value.recover(f))
}
// Then used like:
val et: EitherT[Future, String, …Run Code Online (Sandbox Code Playgroud) 在vim中,当您创建新选项卡时,选项卡栏将显示在屏幕顶部.左边是所有标签,最右边是关闭标签的"X".在它们之间,有"空"空间,在我的屏幕上显示为白色.
我承认,我对我的终端看起来非常挑剔,屏幕顶部的这个明亮的白色条让人分心.是否可以将此颜色更改为黑色,甚至可能是灰色?
使用vim我可以通过搭售来改变我的光标所在的单词cw.我可以改变当前的角色cl.我可以改变一些括号内的所有内容ci{.
我甚至可以改变当前和下一行cj.但是,如何更改光标所在的行?
我在寻找的东西小于或大于这些命令的一个更有效:
ddko,0C,0Da,等
通常,如果我处于过程密集型功能中,我可以调用QCoreApplication::processEvents()或QEventLoop::processEvents()确保我的处理不会阻止其他信号和插槽.
但是,如果我创建一个new QThread并将一个worker移动到该线程,那么我没有QCoreApplication或者QEventLoop可以调用它processEvents().
从我的研究来看,似乎我应该能够QEventLoop在QThread我创建的新版本上安装一个,然后我可以调用processEvents()它QEventLoop.
但是,我无法弄清楚如何做到这一点.我想它可能看起来像这样:
QThread *thread = new QThread(this);
Worker *worker = new Worker(this);
QEventLoop *loop = new QEventLoop();
connect(thread, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
connect(thread, SIGNAL(started()), worker, SLOT(startProcessing()));
connect(worker, SIGNAL(done()), thread, SLOT(quit()));
connect(worker, SIGNAL(done()), loop, SLOT(quit()));
worker->moveToThread(thread);
//loop->exec() // blocks processing of this thread
loop->moveToThread(thread);
//loop->exec() // loop is not a member of this thread anymore and …Run Code Online (Sandbox Code Playgroud) 有时在编辑三个文件时vimdiff我想将一个文件从一个文件复制到另外两个文件.通常这将完成如下:
:diffput 2
:diffput 3
Run Code Online (Sandbox Code Playgroud)
但是,:help diffput这说:
*:diffpu* *:diffput* *E793*
:[range]diffpu[t] [bufspec]
Run Code Online (Sandbox Code Playgroud)
这让我很好奇是否bufspec允许您指定多个缓冲区.我尝试使用文档,然后猜测,但没有运气.
:help bufspec
:diffput 2,3
:diffput 2 3
Run Code Online (Sandbox Code Playgroud)
是否可以在diffput命令中指定多个缓冲区?
在遵循这个 Spring示例时,我希望看到这样的输出:
Creating tables
Inserting customer record for John Woo
Inserting customer record for Jeff Dean
...
Run Code Online (Sandbox Code Playgroud)
相反,我DEBUG在每一行之间散布了一些日志消息:
Creating tables
12:31:16.474 [main] DEBUG o.s.jdbc.core.JdbcTemplate - Executing SQL statement [drop table customers if exists]
12:31:16.484 [main] DEBUG o.s.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource
12:31:16.484 [main] DEBUG o.s.j.d.SimpleDriverDataSource - Creating new JDBC Driver Connection to [jdbc:h2:mem]
...
Run Code Online (Sandbox Code Playgroud)
这些 不同的 答案似乎表明可以通过更改我的log4j.properties文件中的日志级别来解决这个问题.然而,在下面的例子春季一个log4j.properties文件从未被提及.
有趣的是,Spring确实似乎在log4j内部使用:
$ grep -R "log4j" *
Binary file build/libs/gs-relational-data-access-0.1.0.jar …Run Code Online (Sandbox Code Playgroud) 我经常发现自己将Seq只有一个元素的 a 传递给这样的方法:
def myMethod(myList: Seq[Int]) = { ... }
Run Code Online (Sandbox Code Playgroud)
通常我这样做:
myMethod(List(42))
Run Code Online (Sandbox Code Playgroud)
但我突然想到,这可能不是最优雅的方式,如果说我喜欢 Scala 的一件事,那就是它能够在我认为不可能的情况下减少使用的字符,从而让我大吃一惊。
Seq那么,是否有比更短或更优雅的单个项目表示形式呢List(42)?
我能想到几个更糟糕的选择!
42 to 42
42 :: List()
Run Code Online (Sandbox Code Playgroud) 我正在将Docker For Desktop与内置的Kubernetes集群一起使用。我已经安装了Pod通过HTTP服务资源的,但是我不确定如何使用浏览器访问它。我具有以下ServiceSpec将流量正确路由到的内容Pod:
spec:
clusterIP: 10.99.132.220
externalTrafficPolicy: Cluster
ports:
- name: myport
nodePort: 31534
port: 8037
protocol: TCP
targetPort: 80
type: LoadBalancer
Run Code Online (Sandbox Code Playgroud)
当我使用以下命令查询它时,我可以看到它的设置kubectl:
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myservice LoadBalancer 10.99.132.220 localhost 8037:31534/TCP 1h
Run Code Online (Sandbox Code Playgroud)
如何使用浏览器访问此服务?
vim ×3
c++ ×2
kubernetes ×2
scala ×2
colors ×1
diff ×1
docker ×1
events ×1
heap ×1
java ×1
logging ×1
memory ×1
qt ×1
reference ×1
scala-cats ×1
settings ×1
spring ×1
spring-boot ×1
spring-jdbc ×1
vimdiff ×1