TypeScript最近在 JSDoc 注释中引入了该@link
标签。文档在这里。
但是,@link
仅当 TypeScript 编译器知道链接目标时才会生成实际链接。换句话说,我链接到的任何内容都必须在同一文件中声明或导入。然而,情况并非总是如此。以这个(虚构的)例子为例:
轮子.ts
/** A wheel for use with a {@link Car}. */
export interface Wheel {
// ...
}
Run Code Online (Sandbox Code Playgroud)
在此示例中, wheel.ts中的 JSDoc 注释引用了Car
单独文件car.ts中定义的类型。因为Wheel.ts不导入car.ts,所以 TypeScript 不知道@link Car
指向什么。因此,Car
在 VS Code 中显示文档时无法显示正确的链接:
所以我的问题是:我如何告诉 TypeScript 在哪里可以找到 的定义Car
?
我尝试过以下方法:
1. 常规进口
添加到wheel.tsimport { Car } from './car';
的顶部可以解决问题并创建一个实际链接(注意“Car”现在如何变成蓝色):Car
但是,它会导致导入行上出现 TypeScript 错误“'Car'已声明,但从未读取其值。(6133)” 。 …
Cmake的生成器表达式允许我在某些函数调用中使用逻辑表达式.例如,如果我想/MTd
在调试模式下添加编译器标志,我可以说
add_compile_options($<$<CONFIG:Debug>:/MTd>)
Run Code Online (Sandbox Code Playgroud)
如果CONFIG
等于"Debug",则将add_compile_options
使用值"/ MTd" 调用,否则使用空字符串调用.
但通常,我不想在值和空字符串之间做出决定,而是在两个值之间做出决定.在上面的例子中,如果CONFIG
是不 "调试",我想通过/MT
(没有拖尾d).我希望有这样的语法:
add_compile_options($<$<CONFIG:Debug>:/MTd:/MT>)
Run Code Online (Sandbox Code Playgroud)
请注意,根据CMake规范,上述内容不是有效代码.我提出的最好的实际工作是这样的:
add_compile_options($<$<CONFIG:Debug>:/MTd>$<$<NOT:$<CONFIG:Debug>>:/MT>)
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎是多余的.是否有更短,更易读的方式来决定两个值?
注意:我意识到在这种特殊情况下,我可以这样写:
add_compile_options(/MT$<$<CONFIG:Debug>:d>)
Run Code Online (Sandbox Code Playgroud)
但这对我来说似乎相当苛刻,只适用于其中一个选项是另一个选项的子串的情况.
我正在用C++编写一个跨平台的应用程序.所有字符串都在内部进行UTF-8编码.请考虑以下简化代码:
#include <string>
#include <iostream>
int main() {
std::string test = u8"Greek: ????; German: Übergrößenträger";
std::cout << test;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Unix系统上,std::cout
期望8位字符串是UTF-8编码的,所以这段代码工作正常.
但是,在Windows上,要求std::cout
8位字符串采用Latin-1或类似的非Unicode格式(取决于代码页).这导致以下输出:
希腊语:????????; 德语:?£bergr?Âentr?ñger
如何std::cout
在Windows上将8位字符串解释为UTF-8?
这是我试过的:
#include <string>
#include <iostream>
#include <io.h>
#include <fcntl.h>
int main() {
_setmode(_fileno(stdout), _O_U8TEXT);
std::string test = u8"Greek: ????; German: Übergrößenträger";
std::cout << test;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望_setmode
能做到这一点.但是,这会在调用的行中导致以下断言错误operator<<
:
Microsoft Visual C++运行时库
调试断言失败!
程序:d:\ visual studio 2015\Projects\utf8test\Debug\utf8test.exe文件:minkernel\crts\ucrt\src\appcrt\stdio\fputc.cpp行:47
表达式:((_Stream.is_string_backed())||(fn = _fileno(_Stream.public_stream()),((_ textmode_safe(fn)== __crt_lowio_text_mode :: ansi)&&!_ tm_unicode_safe(fn)))) …
.NET 4.5引入了方便的IReadOnlyDictionary<TKey, TValue>
界面.A Dictionary<TKey, TValue>
是一个 IReadOnlyDictionary<TKey, TValue>
,所以我可以通过前者而不需要后者.
但我不确定相反的方式:如何Dictionary<,>
基于现有创建新的IReadOnlyDictionary<,>
?
Dictionary<,>
有几个构造函数采取IDictionary<,>
- 但没有采取IReadOnlyDictionary<,>
.IReadOnlyDictionary<,>
有一个扩展方法ToDictionary<,>()
.但是,这是继承自IEnumerable<>
.因此,要使用它,我必须通过两项完全冗余的代表是这样的:readOnlyDict.ToDictionary(pair => pair.Key, pair => pair.Value)
.丑陋!Dictionary<,>
,迭代原始对并复制它们.在我看来,应该有一个微不足道的方法来创建一个Dictionary<,>
基于现有的新IReadOnlyDictionary<,>
.我错过了什么吗?
编辑:一些澄清.我不是在寻找治疗的一些神奇的方法IReadOnlyDictionary<,>
为Dictionary<,>
.我想创建一个Dictionary<,>
从a 复制其初始值的new IReadOnlyDictionary<,>
.这个问题是一个冗长的问题:
Dictionary<,>
有一个方便的构造函数来复制一个初始值IDictionary<,>
.为什么没有一个人拿出一个IReadOnlyDictionary<,>
什么是实现相同结果的最惯用的方法呢?
我有一套不同的价值观.我正在寻找一种方法来生成此集合的所有分区,即将集合划分为子集的所有可能方式.
例如,该集{1, 2, 3}
具有以下分区:
{ {1}, {2}, {3} },
{ {1, 2}, {3} },
{ {1, 3}, {2} },
{ {1}, {2, 3} },
{ {1, 2, 3} }.
Run Code Online (Sandbox Code Playgroud)
由于这些是数学意义上的集合,因此顺序无关紧要.例如,{1, 2}, {3}
是相同的,{3}, {2, 1}
也不应该是单独的结果.
可以在Wikipedia上找到集合分区的完整定义.
这两个System.Timers.Timer
和System.Threading.Timer
火在离请求的那些相当不同的时间间隔.例如:
new System.Timers.Timer(1000d / 20);
Run Code Online (Sandbox Code Playgroud)
产生一个每秒发射16次而不是20次的计时器.
为了确保太长的事件处理程序没有副作用,我写了这个小测试程序:
int[] frequencies = { 5, 10, 15, 20, 30, 50, 75, 100, 200, 500 };
// Test System.Timers.Timer
foreach (int frequency in frequencies)
{
int count = 0;
// Initialize timer
System.Timers.Timer timer = new System.Timers.Timer(1000d / frequency);
timer.Elapsed += delegate { Interlocked.Increment(ref count); };
// Count for 10 seconds
DateTime start = DateTime.Now;
timer.Enabled = true;
while (DateTime.Now < start + TimeSpan.FromSeconds(10))
Thread.Sleep(10);
timer.Enabled = false;
// Calculate …
Run Code Online (Sandbox Code Playgroud) 假设我有两个本地智能指针,foo
并且bar
.
shared_ptr<Foo> foo = ...
shared_ptr<Bar> bar = ...
Run Code Online (Sandbox Code Playgroud)
这些智能指针是围绕资源的包装器,由于某种原因必须按顺序销毁foo
,然后bar
.
现在我想创建一个使用foo
和的lambda bar
,但是比包含它们的范围更长.所以我会按价值捕捉它们,如下所示:
auto lambda = [foo, bar]() { ... };
Run Code Online (Sandbox Code Playgroud)
这将在函数对象中创建foo
和复制bar
.当函数对象被破坏时,这些副本也将被破坏,但我关心这种情况发生的顺序.所以我的问题是:
当一个lambda对象被破坏时,它的by-value会以什么顺序捕获被破坏的?我怎么能(希望)影响这个命令呢?
据我所知,a ZonedDateTime
实际上是一个增强版本Instant
.它具有所有数据Instant
(沿UTC时间线的精确值),以及时区信息.因此,我天真的假设是,a ZonedDateTime
-an Instant
并且任何采取Instant
遗嘱的方法都会采取ZonedDateTime
相反的方式.此外,我所料isBefore()
,isAfter()
等之间进行无缝协作Instant
S和ZonedDateTime
秒.
查看API文档,Instant
并且ZonedDateTime
没有一个是这种情况.我可以将Instant
s与Instant
s和ZonedDateTime
s 进行比较ZonedDateTime
,但这两个类似乎是不兼容的.更重要的是,像ThreeTen-Extra这样的第三方代码Interval
似乎只适用于Instant
s.
是否存在Instant
并且ZonedDateTime
不打算混合的原因?
" 确认导航"一文解释了如何在转换钩子中使用浏览器确认框.精细.但我想使用自己的对话框.如果我使用history
模块中的方法,我认为这是可能的.是否可以使用setRouteLeaveHook
in react-router进行此操作?
我在OS X 10.10.5上使用CMake 3.3.2和Xcode 7.1.
我有一个使用CMake的小型C++项目.我希望它在OS X 10.9或更高版本上运行.所以我修改了我的CMakeLists.txt来开始这个:
cmake_minimum_required(VERSION 3.3)
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9")
project(...
Run Code Online (Sandbox Code Playgroud)
然后我像这样创建Xcode项目:
cmake -G Xcode <path>
Run Code Online (Sandbox Code Playgroud)
但是,生成的xcodeproj软件包似乎没有设置部署目标.当我在文本编辑器中打开包含的project.pbxproj文件时,没有提及行MACOSX_DEPLOYMENT_TARGET
.
因此,当我在Xcode中打开项目时,在Build Settings> Deployment> OS X Deployment Target下,Xcode总是显示默认值"OS X 10.11",无论我在CMakeLists.txt中指定了什么.当我手动更改Xcode中的设置,然后在文本编辑器中重新打开项目文件时,MACOSX_DEPLOYMENT_TARGET = 10.9;
已正确添加该行.
难道我做错了什么?谷歌搜索问题没有给出任何最近的结果.
c# ×3
c++ ×3
cmake ×2
algorithm ×1
c++11 ×1
datetime ×1
deviation ×1
dictionary ×1
encoding ×1
frequency ×1
java ×1
java-time ×1
javascript ×1
lambda ×1
partitioning ×1
raii ×1
react-router ×1
set ×1
timer ×1
typescript ×1
utf-8 ×1
windows ×1
xcode ×1