我曾经认为这个问题的答案是" 100% ",但我最近指出了一个让它值得思考的例子.考虑声明为具有自动存储持续时间的对象的C数组:
int main()
{
int foo[42] = { 0 };
}
Run Code Online (Sandbox Code Playgroud)
这里的类型foo很明显int[42].相反,请考虑以下情况:
int main()
{
int* foo = new int[rand() % 42];
delete[] foo;
}
Run Code Online (Sandbox Code Playgroud)
这里foo是is 的类型int*,但是如何在编译时告诉表达式创建new的对象的类型?(重点是强调我不是在谈论new表达式返回的指针,而是关于表达式创建的数组对象new).
这就是C++ 11标准的第5.3.4/1段规定了new表达式的结果:
[...]由new-expression创建的实体具有动态存储持续时间(3.7.4).[注意:此类实体的生命周期不一定限于创建它的范围.-end note]如果实体是非数组对象,则new-expression返回指向所创建对象的指针.如果它是一个数组,则new-expression 返回一个指向数组初始元素的指针.
我以前认为在C++中所有对象的类型都是在编译时确定的,但上面的例子似乎反驳了这种信念.另外,根据第1.8/1段:
[...] 创建对象时确定对象的属性.对象可以有一个名称(第3条).对象的存储持续时间(3.7)会影响其生命周期(3.8).对象具有类型(3.9).[...]
所以我的问题是:
如果有人能够至少详细说明上述一点,那就太好了.
编辑:
标准似乎清楚地表明new …
我在几个项目中使用Typeguard在 Python 运行时进行类型检查。它运作得很好。
我遇到过一种情况,函数参数的类型是typing.Union由一些动态收集的数据类型组成的。例如
def find_datatypes():
# some stuff ...
return (str, int) # dynamically generated list / tuple
datatypes = find_datatypes()
Run Code Online (Sandbox Code Playgroud)
现在我想生成一个typing.Unionfromdatatypes以便最终在函数中使用。我期望解包语法能够工作:
my_union = typing.Union[*datatypes]
@typeguard.typechecked
def some_function(param: my_union):
pass
Run Code Online (Sandbox Code Playgroud)
然而,它并没有:
my_union = typing.Union[*datatypes]
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现我想要的目标?
是否有一种理智的方法将多态函数应用于类型的值Dynamic?
例如,我有一个类型的值,Dynamic我想应用于Just内部的值Dynamic.因此,如果值是由toDyn True我希望结果构建的toDyn (Just True).内部可能出现的不同类型的数量Dynamic不受限制.
(当涉及的类型来自封闭的宇宙时,我有一个解决方案,但这是令人不快的.)
我一直在研究编程语言是如何工作的,其中一些有一个所谓的虚拟机.我知道这是在另一种编程语言中对编程语言进行仿真的某种形式,并且它的工作方式与使用堆栈执行编译语言的方式相同.我做对了吗?
根据我所做的附带条件,让我感到困惑的是,许多非编译语言允许使用"自由"类型系统的变量.以Python为例,我可以这样写:
x = "Hello world!"
x = 2**1000
Run Code Online (Sandbox Code Playgroud)
字符串和大整数是完全不相关的,并且在内存中占用不同的空间,那么这个代码如何在基于堆栈的环境中表示?这到底发生了什么?x是否指向堆栈中的新位置并且旧的字符串数据未被引用?这些语言不使用堆栈吗?如果没有,它们如何在内部表示变量?
与其他SQL版本相比,SQLite3使用动态类型而不是静态类型.在SQLite的网站上写着:
大多数SQL数据库引擎(除了SQLite之外的每个SQL数据库引擎,据我们所知)都使用静态,严格的类型.使用静态类型时,值的数据类型由其容器(存储值的特定列)确定.
SQLite使用更通用的动态类型系统.在SQLite中,值的数据类型与值本身相关联,而不是与其容器相关联.
在我看来,这正是你不想要的,因为它允许你存储整数列中的字符串.
页面继续:
... SQLite中的动态类型允许它执行传统的刚性类型数据库中无法实现的操作.
我有两个问题:
有什么方法可以在 Julia 中明确要求(例如在模块或包中)必须声明类型 ?例如或是否支持此类检查?更广泛地说,Julia 标准发行版本身是否提供任何可以帮助检查此要求的静态代码分析器或等效物? PackageCompilerLint.jl
作为一个激励示例,假设我们希望确保不断增长的生产代码库只接受始终声明为类型的代码,前提是具有类型声明的大型代码库往往更易于维护。
如果我们想强制执行该条件,Julia 在其标准发行版中是否提供任何机制来要求类型声明或帮助推进该目标?(例如,任何可以通过短绒、提交钩子或等价物检查的东西?)
sqlite使用作者称之为" Manifest Typing "的东西,这基本上意味着sqlite是动态类型的:如果你愿意,你可以在一个"int"列中存储一个varchar值.
这是一个有趣的设计决定,但每当我使用sqlite时,我就像标准的RDMS一样使用它,并将类型视为静态.实际上,在其他系统中设计数据库时,我甚至从未希望使用动态类型列.
那么,这个功能何时有用?有没有人在实践中找到了一个很好用的东西,用静态类型的列不能轻易完成?
您是否经常以一种在静态类型语言中真正不可行的方式利用动态类型?
我感兴趣的是,在现实世界(而不是演示)代码中使用它们的频率是多少?
看一下NSArray.h中的NSArray创建方法块.
返回id的方法是否有正当理由不返回instancetype?
Apple甚至努力添加内联注释,让我们知道id在这种情况下会返回一个NSArray.
@interface NSArray (NSArrayCreation)
+ (instancetype)array;
+ (instancetype)arrayWithObject:(id)anObject;
+ (instancetype)arrayWithObjects:(const id [])objects count:(NSUInteger)cnt;
+ (instancetype)arrayWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
+ (instancetype)arrayWithArray:(NSArray *)array;
- (instancetype)init; /* designated initializer */
- (instancetype)initWithObjects:(const id [])objects count:(NSUInteger)cnt; /* designated initializer */
- (instancetype)initWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
- (instancetype)initWithArray:(NSArray *)array;
- (instancetype)initWithArray:(NSArray *)array copyItems:(BOOL)flag;
+ (id /* NSArray * */)arrayWithContentsOfFile:(NSString *)path;
+ (id /* NSArray * */)arrayWithContentsOfURL:(NSURL *)url;
- (id /* NSArray * */)initWithContentsOfFile:(NSString *)path;
- (id /* NSArray * */)initWithContentsOfURL:(NSURL *)url;
@end
Run Code Online (Sandbox Code Playgroud)
我能提出这些特殊方法的唯一方法就是Apple的这个指导 …
我正在使用"使用文本工具包管理iOS应用程序中的文本"教程.它是为Objective C编写的,但我认为无论如何我都会尝试使用Swift.
但是,当我得到以下代码时,我无法弄清楚如何为UITextView使用Swift 设置标题和其他样式.这是Objective C代码:
- (IBAction)applyHeadlineStyle:(id)sender {
[_textView setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]];
}
- (IBAction)applySubHeadlineStyle:(id)sender {
[_textView setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]];
}
- (IBAction)applyBodyStyle:(id)sender {
[_textView setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleBody]];
}
- (IBAction)applyFootnoteStyle:(id)sender {
[_textView setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]];
}
- (IBAction)applyCaption1Style:(id)sender {
[_textView setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]];
}
- (IBAction)applyCaption2Style:(id)sender {
[_textView setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleCaption2]];
}
Run Code Online (Sandbox Code Playgroud)
我试过了
textView.setFont =
textView.preferredFontForTextStyle =
Run Code Online (Sandbox Code Playgroud)
然而,这些似乎都不起作用,而且我找不到任何Swift答案.
dynamic-typing ×10
ios ×2
sqlite ×2
c++ ×1
c++11 ×1
compilation ×1
database ×1
haskell ×1
iphone ×1
julia ×1
lint ×1
objective-c ×1
python ×1
sql ×1
stack ×1
swift ×1
text-styling ×1
textkit ×1
type-hinting ×1
types ×1